widl: Update to Wine 6.0-rc1.
diff --git a/mingw-w64-tools/widl/Makefile.am b/mingw-w64-tools/widl/Makefile.am
index fdde497..0dee2e7 100644
--- a/mingw-w64-tools/widl/Makefile.am
+++ b/mingw-w64-tools/widl/Makefile.am
@@ -33,7 +33,6 @@
   src/wpp/ppy.tab.h \
   src/wpp/ppl.yy.c \
   src/wpp/ppy.tab.c \
-  src/wpp/preproc.c \
   src/wpp/wpp.c \
   src/pathtools.c \
   include/pshpack1.h \
diff --git a/mingw-w64-tools/widl/Makefile.in b/mingw-w64-tools/widl/Makefile.in
index 842c6c3..5b94788 100644
--- a/mingw-w64-tools/widl/Makefile.in
+++ b/mingw-w64-tools/widl/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994-2020 Free Software Foundation, Inc.
@@ -116,8 +116,8 @@
 	src/widl-typelib.$(OBJEXT) src/widl-typetree.$(OBJEXT) \
 	src/widl-utils.$(OBJEXT) src/widl-widl.$(OBJEXT) \
 	src/widl-write_msft.$(OBJEXT) src/wpp/widl-ppl.yy.$(OBJEXT) \
-	src/wpp/widl-ppy.tab.$(OBJEXT) src/wpp/widl-preproc.$(OBJEXT) \
-	src/wpp/widl-wpp.$(OBJEXT) src/widl-pathtools.$(OBJEXT)
+	src/wpp/widl-ppy.tab.$(OBJEXT) src/wpp/widl-wpp.$(OBJEXT) \
+	src/widl-pathtools.$(OBJEXT)
 widl_OBJECTS = $(am_widl_OBJECTS)
 widl_LDADD = $(LDADD)
 widl_LINK = $(CCLD) $(widl_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
@@ -150,7 +150,6 @@
 	src/port/$(DEPDIR)/widl-port.Po \
 	src/wpp/$(DEPDIR)/widl-ppl.yy.Po \
 	src/wpp/$(DEPDIR)/widl-ppy.tab.Po \
-	src/wpp/$(DEPDIR)/widl-preproc.Po \
 	src/wpp/$(DEPDIR)/widl-wpp.Po
 am__mv = mv -f
 AM_V_lt = $(am__v_lt_@AM_V@)
@@ -220,6 +219,8 @@
 DIST_ARCHIVES = $(distdir).tar.gz
 GZIP_ENV = --best
 DIST_TARGETS = dist-gzip
+# Exists only to be overridden by the user if desired.
+AM_DISTCHECK_DVI_TARGET = dvi
 distuninstallcheck_listfiles = find . -type f -print
 am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
   | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
@@ -360,7 +361,6 @@
   src/wpp/ppy.tab.h \
   src/wpp/ppl.yy.c \
   src/wpp/ppy.tab.c \
-  src/wpp/preproc.c \
   src/wpp/wpp.c \
   src/pathtools.c \
   include/pshpack1.h \
@@ -537,8 +537,6 @@
 	src/wpp/$(DEPDIR)/$(am__dirstamp)
 src/wpp/widl-ppy.tab.$(OBJEXT): src/wpp/$(am__dirstamp) \
 	src/wpp/$(DEPDIR)/$(am__dirstamp)
-src/wpp/widl-preproc.$(OBJEXT): src/wpp/$(am__dirstamp) \
-	src/wpp/$(DEPDIR)/$(am__dirstamp)
 src/wpp/widl-wpp.$(OBJEXT): src/wpp/$(am__dirstamp) \
 	src/wpp/$(DEPDIR)/$(am__dirstamp)
 src/widl-pathtools.$(OBJEXT): src/$(am__dirstamp) \
@@ -577,7 +575,6 @@
 @AMDEP_TRUE@@am__include@ @am__quote@src/port/$(DEPDIR)/widl-port.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/wpp/$(DEPDIR)/widl-ppl.yy.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/wpp/$(DEPDIR)/widl-ppy.tab.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@src/wpp/$(DEPDIR)/widl-preproc.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@src/wpp/$(DEPDIR)/widl-wpp.Po@am__quote@ # am--include-marker
 
 $(am__depfiles_remade):
@@ -868,20 +865,6 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(widl_CPPFLAGS) $(CPPFLAGS) $(widl_CFLAGS) $(CFLAGS) -c -o src/wpp/widl-ppy.tab.obj `if test -f 'src/wpp/ppy.tab.c'; then $(CYGPATH_W) 'src/wpp/ppy.tab.c'; else $(CYGPATH_W) '$(srcdir)/src/wpp/ppy.tab.c'; fi`
 
-src/wpp/widl-preproc.o: src/wpp/preproc.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(widl_CPPFLAGS) $(CPPFLAGS) $(widl_CFLAGS) $(CFLAGS) -MT src/wpp/widl-preproc.o -MD -MP -MF src/wpp/$(DEPDIR)/widl-preproc.Tpo -c -o src/wpp/widl-preproc.o `test -f 'src/wpp/preproc.c' || echo '$(srcdir)/'`src/wpp/preproc.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/wpp/$(DEPDIR)/widl-preproc.Tpo src/wpp/$(DEPDIR)/widl-preproc.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/wpp/preproc.c' object='src/wpp/widl-preproc.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(widl_CPPFLAGS) $(CPPFLAGS) $(widl_CFLAGS) $(CFLAGS) -c -o src/wpp/widl-preproc.o `test -f 'src/wpp/preproc.c' || echo '$(srcdir)/'`src/wpp/preproc.c
-
-src/wpp/widl-preproc.obj: src/wpp/preproc.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(widl_CPPFLAGS) $(CPPFLAGS) $(widl_CFLAGS) $(CFLAGS) -MT src/wpp/widl-preproc.obj -MD -MP -MF src/wpp/$(DEPDIR)/widl-preproc.Tpo -c -o src/wpp/widl-preproc.obj `if test -f 'src/wpp/preproc.c'; then $(CYGPATH_W) 'src/wpp/preproc.c'; else $(CYGPATH_W) '$(srcdir)/src/wpp/preproc.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/wpp/$(DEPDIR)/widl-preproc.Tpo src/wpp/$(DEPDIR)/widl-preproc.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/wpp/preproc.c' object='src/wpp/widl-preproc.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(widl_CPPFLAGS) $(CPPFLAGS) $(widl_CFLAGS) $(CFLAGS) -c -o src/wpp/widl-preproc.obj `if test -f 'src/wpp/preproc.c'; then $(CYGPATH_W) 'src/wpp/preproc.c'; else $(CYGPATH_W) '$(srcdir)/src/wpp/preproc.c'; fi`
-
 src/wpp/widl-wpp.o: src/wpp/wpp.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(widl_CPPFLAGS) $(CPPFLAGS) $(widl_CFLAGS) $(CFLAGS) -MT src/wpp/widl-wpp.o -MD -MP -MF src/wpp/$(DEPDIR)/widl-wpp.Tpo -c -o src/wpp/widl-wpp.o `test -f 'src/wpp/wpp.c' || echo '$(srcdir)/'`src/wpp/wpp.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/wpp/$(DEPDIR)/widl-wpp.Tpo src/wpp/$(DEPDIR)/widl-wpp.Po
@@ -1090,7 +1073,7 @@
 	    $(DISTCHECK_CONFIGURE_FLAGS) \
 	    --srcdir=../.. --prefix="$$dc_install_base" \
 	  && $(MAKE) $(AM_MAKEFLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \
 	  && $(MAKE) $(AM_MAKEFLAGS) check \
 	  && $(MAKE) $(AM_MAKEFLAGS) install \
 	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
@@ -1210,7 +1193,6 @@
 	-rm -f src/port/$(DEPDIR)/widl-port.Po
 	-rm -f src/wpp/$(DEPDIR)/widl-ppl.yy.Po
 	-rm -f src/wpp/$(DEPDIR)/widl-ppy.tab.Po
-	-rm -f src/wpp/$(DEPDIR)/widl-preproc.Po
 	-rm -f src/wpp/$(DEPDIR)/widl-wpp.Po
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
@@ -1279,7 +1261,6 @@
 	-rm -f src/port/$(DEPDIR)/widl-port.Po
 	-rm -f src/wpp/$(DEPDIR)/widl-ppl.yy.Po
 	-rm -f src/wpp/$(DEPDIR)/widl-ppy.tab.Po
-	-rm -f src/wpp/$(DEPDIR)/widl-preproc.Po
 	-rm -f src/wpp/$(DEPDIR)/widl-wpp.Po
 	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
diff --git a/mingw-w64-tools/widl/VERSION b/mingw-w64-tools/widl/VERSION
index 2d26b2b..736b453 100644
--- a/mingw-w64-tools/widl/VERSION
+++ b/mingw-w64-tools/widl/VERSION
@@ -1 +1 @@
-WIDL version 5.19
+WIDL version 6.0-rc1
diff --git a/mingw-w64-tools/widl/aclocal.m4 b/mingw-w64-tools/widl/aclocal.m4
index 13e57f2..bcea5af 100644
--- a/mingw-w64-tools/widl/aclocal.m4
+++ b/mingw-w64-tools/widl/aclocal.m4
@@ -1,4 +1,4 @@
-# generated automatically by aclocal 1.16.2 -*- Autoconf -*-
+# generated automatically by aclocal 1.16.3 -*- Autoconf -*-
 
 # Copyright (C) 1996-2020 Free Software Foundation, Inc.
 
@@ -35,7 +35,7 @@
 [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.2], [],
+m4_if([$1], [1.16.3], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -51,7 +51,7 @@
 # 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.2])dnl
+[AM_AUTOMAKE_VERSION([1.16.3])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
@@ -739,12 +739,7 @@
 [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
+  MISSING="\${SHELL} '$am_aux_dir/missing'"
 fi
 # Use eval to expand $SHELL
 if eval "$MISSING --is-lightweight"; then
diff --git a/mingw-w64-tools/widl/configure b/mingw-w64-tools/widl/configure
index a094471..16edfc5 100755
--- a/mingw-w64-tools/widl/configure
+++ b/mingw-w64-tools/widl/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for widl 5.19.
+# Generated by GNU Autoconf 2.69 for widl 6.0-rc1.
 #
 # Report bugs to <mingw-w64-public@lists.sourceforge.net>.
 #
@@ -580,8 +580,8 @@
 # Identity of this package.
 PACKAGE_NAME='widl'
 PACKAGE_TARNAME='widl'
-PACKAGE_VERSION='5.19'
-PACKAGE_STRING='widl 5.19'
+PACKAGE_VERSION='6.0-rc1'
+PACKAGE_STRING='widl 6.0-rc1'
 PACKAGE_BUGREPORT='mingw-w64-public@lists.sourceforge.net'
 PACKAGE_URL=''
 
@@ -1296,7 +1296,7 @@
   # 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 widl 5.19 to adapt to many kinds of systems.
+\`configure' configures widl 6.0-rc1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1368,7 +1368,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of widl 5.19:";;
+     short | recursive ) echo "Configuration of widl 6.0-rc1:";;
    esac
   cat <<\_ACEOF
 
@@ -1470,7 +1470,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-widl configure 5.19
+widl configure 6.0-rc1
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2023,7 +2023,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by widl $as_me 5.19, which was
+It was created by widl $as_me 6.0-rc1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2692,12 +2692,7 @@
 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
+  MISSING="\${SHELL} '$am_aux_dir/missing'"
 fi
 # Use eval to expand $SHELL
 if eval "$MISSING --is-lightweight"; then
@@ -3002,7 +2997,7 @@
 
 # Define the identity of the package.
  PACKAGE='widl'
- VERSION='5.19'
+ VERSION='6.0-rc1'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -5466,7 +5461,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by widl $as_me 5.19, which was
+This file was extended by widl $as_me 6.0-rc1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -5532,7 +5527,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-widl config.status 5.19
+widl config.status 6.0-rc1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff --git a/mingw-w64-tools/widl/include/basetsd.h b/mingw-w64-tools/widl/include/basetsd.h
index c9f5c90..7087b59 100644
--- a/mingw-w64-tools/widl/include/basetsd.h
+++ b/mingw-w64-tools/widl/include/basetsd.h
@@ -265,6 +265,8 @@
 
 typedef ULONG_PTR KAFFINITY, *PKAFFINITY;
 
+#define MINLONGLONG             ((LONGLONG)~MAXLONGLONG)
+
 /* Some Wine-specific definitions */
 
 /* Architecture dependent settings. */
diff --git a/mingw-w64-tools/widl/include/winbase.h b/mingw-w64-tools/widl/include/winbase.h
index f1c3198..dc8aa08 100644
--- a/mingw-w64-tools/widl/include/winbase.h
+++ b/mingw-w64-tools/widl/include/winbase.h
@@ -25,10 +25,12 @@
 extern "C" {
 #endif
 
+#ifndef WINBASEAPI
 #ifdef _KERNEL32_
 #define WINBASEAPI
 #else
-#define WINBASEAPI DECLSPEC_HIDDEN
+#define WINBASEAPI DECLSPEC_IMPORT
+#endif
 #endif
 
 #ifdef _ADVAPI32_
@@ -2473,8 +2475,6 @@
 #define                       MakeProcInstance(proc,inst) (proc)
 WINADVAPI  BOOL        WINAPI MakeSelfRelativeSD(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR,LPDWORD);
 WINADVAPI  VOID        WINAPI MapGenericMask(PDWORD,PGENERIC_MAPPING);
-WINBASEAPI HMODULE     WINAPI MapHModuleSL(WORD);
-WINBASEAPI WORD        WINAPI MapHModuleLS(HMODULE);
 WINBASEAPI BOOL        WINAPI MapUserPhysicalPages(PVOID,ULONG_PTR,PULONG_PTR);
 WINBASEAPI LPVOID      WINAPI MapViewOfFile(HANDLE,DWORD,DWORD,DWORD,SIZE_T);
 WINBASEAPI LPVOID      WINAPI MapViewOfFileEx(HANDLE,DWORD,DWORD,DWORD,SIZE_T,LPVOID);
@@ -2744,6 +2744,7 @@
 WINBASEAPI BOOL        WINAPI VerifyVersionInfoW(LPOSVERSIONINFOEXW,DWORD,DWORDLONG);
 #define                       VerifyVersionInfo WINELIB_NAME_AW(VerifyVersionInfo)
 WINBASEAPI LPVOID      WINAPI VirtualAlloc(LPVOID,SIZE_T,DWORD,DWORD);
+WINBASEAPI LPVOID      WINAPI VirtualAlloc2(HANDLE,LPVOID,SIZE_T,DWORD,DWORD,MEM_EXTENDED_PARAMETER*,ULONG);
 WINBASEAPI LPVOID      WINAPI VirtualAllocEx(HANDLE,LPVOID,SIZE_T,DWORD,DWORD);
 WINBASEAPI LPVOID      WINAPI VirtualAllocExNuma(HANDLE,void*,SIZE_T,DWORD,DWORD,DWORD);
 WINBASEAPI BOOL        WINAPI VirtualFree(LPVOID,SIZE_T,DWORD);
diff --git a/mingw-w64-tools/widl/include/windef.h b/mingw-w64-tools/widl/include/windef.h
index 521c3ab..b8e5ed6 100644
--- a/mingw-w64-tools/widl/include/windef.h
+++ b/mingw-w64-tools/widl/include/windef.h
@@ -31,6 +31,10 @@
 # endif /* STRICT */
 #endif /* NO_STRICT */
 
+#ifndef __has_attribute
+#define __has_attribute(x) 0
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -50,7 +54,8 @@
 # endif
 #endif
 
-#if !defined(_MSC_VER) && !defined(__stdcall)
+#ifndef _MSC_VER
+# undef __stdcall
 # ifdef __i386__
 #  ifdef __GNUC__
 #   if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 2)) || defined(__APPLE__)
@@ -62,7 +67,7 @@
 #   error You need to define __stdcall for your compiler
 #  endif
 # elif defined(__x86_64__) && defined (__GNUC__)
-#  if (__GNUC__ > 5) || ((__GNUC__ == 5) && (__GNUC_MINOR__ >= 3))
+#  if __has_attribute(__force_align_arg_pointer__)
 #   define __stdcall __attribute__((ms_abi)) __attribute__((__force_align_arg_pointer__))
 #  else
 #   define __stdcall __attribute__((ms_abi))
@@ -76,27 +81,18 @@
 # endif  /* __i386__ */
 #endif /* __stdcall */
 
-#if !defined(_MSC_VER) && !defined(__cdecl)
+#ifndef _MSC_VER
+# undef __cdecl
 # if defined(__i386__) && defined(__GNUC__)
-#   if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 2)) || defined(__APPLE__)
+#  if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 2)) || defined(__APPLE__)
 #   define __cdecl __attribute__((__cdecl__)) __attribute__((__force_align_arg_pointer__))
 #  else
 #   define __cdecl __attribute__((__cdecl__))
 #  endif
-# elif defined(__x86_64__) && defined (__GNUC__)
-#  if (__GNUC__ > 5) || ((__GNUC__ == 5) && (__GNUC_MINOR__ >= 3))
-#   define __cdecl __attribute__((ms_abi)) __attribute__((__force_align_arg_pointer__))
-#  else
-#   define __cdecl __attribute__((ms_abi))
-#  endif
-# elif defined(__arm__) && defined (__GNUC__) && !defined(__SOFTFP__)
-#   define __cdecl __attribute__((pcs("aapcs-vfp")))
-# elif defined(__aarch64__) && defined (__GNUC__)
-#  define __cdecl __attribute__((ms_abi))
 # else
-#  define __cdecl
+#  define __cdecl __stdcall
 # endif
-#endif /* __cdecl */
+#endif
 
 #if !defined(_MSC_VER) && !defined(__fastcall)
 # define __fastcall __stdcall
diff --git a/mingw-w64-tools/widl/include/wine/wpp.h b/mingw-w64-tools/widl/include/wine/wpp.h
index 0343099..4994577 100644
--- a/mingw-w64-tools/widl/include/wine/wpp.h
+++ b/mingw-w64-tools/widl/include/wine/wpp.h
@@ -24,14 +24,13 @@
 #include <stdio.h>
 #include <stdarg.h>
 
-/* Return value == 0 means successful execution */
-extern int wpp_add_define( const char *name, const char *value );
 extern void wpp_del_define( const char *name );
-extern int wpp_add_cmdline_define( const char *value );
+extern void wpp_add_cmdline_define( const char *value );
 extern void wpp_set_debug( int lex_debug, int parser_debug, int msg_debug );
 extern void wpp_set_pedantic( int on );
-extern int wpp_add_include_path( const char *path );
+extern void wpp_add_include_path( const char *path );
 extern char *wpp_find_include( const char *name, const char *parent_name );
+/* Return value == 0 means successful execution */
 extern int wpp_parse( const char *input, FILE *output );
 
 #endif  /* __WINE_WPP_H */
diff --git a/mingw-w64-tools/widl/include/winnls.h b/mingw-w64-tools/widl/include/winnls.h
index 2964ae5..e90b6f5 100644
--- a/mingw-w64-tools/widl/include/winnls.h
+++ b/mingw-w64-tools/widl/include/winnls.h
@@ -24,11 +24,13 @@
 extern "C" {
 #endif
 
+#ifndef WINNORMALIZEAPI
 #ifndef _NORMALIZE_
-# define WINNORMALIZEAPI DECLSPEC_HIDDEN
+# define WINNORMALIZEAPI DECLSPEC_IMPORT
 #else
 # define WINNORMALIZEAPI
 #endif
+#endif
 
 /* Country codes */
 #define CTRY_DEFAULT            (0)
diff --git a/mingw-w64-tools/widl/include/winnt.h b/mingw-w64-tools/widl/include/winnt.h
index 10b3253..04353d9 100644
--- a/mingw-w64-tools/widl/include/winnt.h
+++ b/mingw-w64-tools/widl/include/winnt.h
@@ -736,6 +736,35 @@
     DWORD    Type;
 } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
 
+#define MEM_EXTENDED_PARAMETER_TYPE_BITS 8
+
+typedef enum MEM_EXTENDED_PARAMETER_TYPE {
+    MemExtendedParameterInvalidType = 0,
+    MemExtendedParameterAddressRequirements,
+    MemExtendedParameterNumaNode,
+    MemExtendedParameterPartitionHandle,
+    MemExtendedParameterUserPhysicalHandle,
+    MemExtendedParameterAttributeFlags,
+    MemExtendedParameterMax
+} MEM_EXTENDED_PARAMETER_TYPE, *PMEM_EXTENDED_PARAMETER_TYPE;
+
+typedef struct DECLSPEC_ALIGN(8) MEM_EXTENDED_PARAMETER {
+    struct
+    {
+        DWORD64 Type : MEM_EXTENDED_PARAMETER_TYPE_BITS;
+        DWORD64 Reserved : 64 - MEM_EXTENDED_PARAMETER_TYPE_BITS;
+    } DUMMYSTRUCTNAME;
+
+    union
+    {
+        DWORD64 ULong64;
+        PVOID Pointer;
+        SIZE_T Size;
+        HANDLE Handle;
+        DWORD ULong;
+    } DUMMYUNIONNAME;
+} MEM_EXTENDED_PARAMETER, *PMEM_EXTENDED_PARAMETER;
+
 #define	PAGE_NOACCESS		0x01
 #define	PAGE_READONLY		0x02
 #define	PAGE_READWRITE		0x04
@@ -1309,6 +1338,34 @@
 #define XSTATE_IPT                   8
 #define XSTATE_CET_U                 11
 #define XSTATE_LWP                   62
+#define MAXIMUM_XSTATE_FEATURES      64
+
+#define XSTATE_MASK_LEGACY_FLOATING_POINT   (1 << XSTATE_LEGACY_FLOATING_POINT)
+#define XSTATE_MASK_LEGACY_SSE              (1 << XSTATE_LEGACY_SSE)
+#define XSTATE_MASK_LEGACY                  (XSTATE_MASK_LEGACY_FLOATING_POINT | XSTATE_MASK_LEGACY_SSE)
+#define XSTATE_MASK_GSSE                    (1 << XSTATE_GSSE)
+
+typedef struct _XSTATE_FEATURE
+{
+    ULONG Offset;
+    ULONG Size;
+} XSTATE_FEATURE, *PXSTATE_FEATURE;
+
+typedef struct _XSTATE_CONFIGURATION
+{
+    ULONG64 EnabledFeatures;
+    ULONG64 EnabledVolatileFeatures;
+    ULONG Size;
+    ULONG OptimizedSave:1;
+    ULONG CompactionEnabled:1;
+    XSTATE_FEATURE Features[MAXIMUM_XSTATE_FEATURES];
+
+    ULONG64 EnabledSupervisorFeatures;
+    ULONG64 AlignedFeatures;
+    ULONG AllFeatureSize;
+    ULONG AllFeatures[MAXIMUM_XSTATE_FEATURES];
+    ULONG64 EnabledUserVisibleSupervisorFeatures;
+} XSTATE_CONFIGURATION, *PXSTATE_CONFIGURATION;
 
 typedef struct _YMMCONTEXT
 {
diff --git a/mingw-w64-tools/widl/src/expr.c b/mingw-w64-tools/widl/src/expr.c
index d1ee599..be8311c 100644
--- a/mingw-w64-tools/widl/src/expr.c
+++ b/mingw-w64-tools/widl/src/expr.c
@@ -462,6 +462,7 @@
         case TYPE_POINTER:
         case TYPE_ARRAY:
         case TYPE_BITFIELD:
+        case TYPE_APICONTRACT:
             /* nothing to do */
             break;
         case TYPE_ALIAS:
diff --git a/mingw-w64-tools/widl/src/header.c b/mingw-w64-tools/widl/src/header.c
index 743d86f..223ab5c 100644
--- a/mingw-w64-tools/widl/src/header.c
+++ b/mingw-w64-tools/widl/src/header.c
@@ -45,6 +45,11 @@
 
 static void write_type_v(FILE *f, const decl_spec_t *t, int is_field, int declonly, const char *name, enum name_type name_type);
 
+static void write_winrt_type_comments(FILE *header, const type_t *type);
+
+static void write_apicontract_guard_start(FILE *header, const expr_t *expr);
+static void write_apicontract_guard_end(FILE *header, const expr_t *expr);
+
 static void indent(FILE *h, int delta)
 {
   int c;
@@ -132,7 +137,7 @@
 
 static void write_uuid_decl(FILE *f, type_t *type, const UUID *uuid)
 {
-  char *name = format_namespace(type->namespace, "", "::", type->name);
+  char *name = format_namespace(type->namespace, "", "::", type->name, use_abi_namespace ? "ABI" : NULL);
   fprintf(f, "#ifdef __CRT_UUID_DECL\n");
   fprintf(f, "__CRT_UUID_DECL(%s, 0x%08x, 0x%04x, 0x%04x, 0x%02x,0x%02x, 0x%02x,"
         "0x%02x,0x%02x,0x%02x,0x%02x,0x%02x)\n",
@@ -192,7 +197,7 @@
     return v->name;
 }
 
-static void write_fields(FILE *h, var_list_t *fields)
+static void write_fields(FILE *h, var_list_t *fields, enum name_type name_type)
 {
     unsigned nameless_struct_cnt = 0, nameless_struct_i = 0, nameless_union_cnt = 0, nameless_union_i = 0;
     const char *name;
@@ -218,7 +223,9 @@
     }
 
     LIST_FOR_EACH_ENTRY( v, fields, var_t, entry ) {
+        expr_t *contract = get_attrp(v->attrs, ATTR_CONTRACT);
         if (!v || !v->declspec.type) continue;
+        if (contract) write_apicontract_guard_start(h, contract);
 
         indent(h, 0);
         name = v->name;
@@ -250,8 +257,9 @@
         default:
             ;
         }
-        write_type_v(h, &v->declspec, TRUE, v->declonly, name, NAME_DEFAULT);
+        write_type_v(h, &v->declspec, TRUE, v->declonly, name, name_type);
         fprintf(h, ";\n");
+        if (contract) write_apicontract_guard_end(h, contract);
     }
 }
 
@@ -261,6 +269,8 @@
   if (!enums) return;
   LIST_FOR_EACH_ENTRY( v, enums, var_t, entry )
   {
+    expr_t *contract = get_attrp(v->attrs, ATTR_CONTRACT);
+    if (contract) write_apicontract_guard_start(h, contract);
     if (v->name) {
       indent(h, 0);
       if(!enum_name)
@@ -273,8 +283,9 @@
       }
     }
     if (list_next( enums, &v->entry )) fprintf(h, ",\n");
+    else fprintf(h, "\n");
+    if (contract) write_apicontract_guard_end(h, contract);
   }
-  fprintf(h, "\n");
 }
 
 int needs_space_after(type_t *t)
@@ -322,7 +333,7 @@
   if ((ds->qualifier & TYPE_QUALIFIER_CONST) && (type_is_alias(t) || !is_ptr(t)))
     fprintf(h, "const ");
 
-  if (type_is_alias(t)) fprintf(h, "%s", t->name);
+  if (!winrt_mode && type_is_alias(t)) fprintf(h, "%s", t->name);
   else {
     switch (type_get_type_detect_alias(t)) {
       case TYPE_ENUM:
@@ -347,9 +358,9 @@
           t->written = TRUE;
           indentation++;
           if (type_get_type(t) != TYPE_STRUCT)
-            write_fields(h, type_encapsulated_union_get_fields(t));
+            write_fields(h, type_encapsulated_union_get_fields(t), name_type);
           else
-            write_fields(h, type_struct_get_fields(t));
+            write_fields(h, type_struct_get_fields(t), name_type);
           indent(h, -1);
           fprintf(h, "}");
         }
@@ -362,7 +373,7 @@
           else fprintf(h, "union {\n");
           t->written = TRUE;
           indentation++;
-          write_fields(h, type_union_get_cases(t));
+          write_fields(h, type_union_get_cases(t), name_type);
           indent(h, -1);
           fprintf(h, "}");
         }
@@ -464,7 +475,15 @@
         break;
       }
       case TYPE_ALIAS:
-        /* handled elsewhere */
+      {
+        const decl_spec_t *ds = type_alias_get_aliasee(t);
+        int in_namespace = ds && ds->type && ds->type->namespace && !is_global_namespace(ds->type->namespace);
+        if (!in_namespace) fprintf(h, "%s", t->name);
+        else write_type_left(h, ds, name_type, declonly, write_callconv);
+        break;
+      }
+      case TYPE_APICONTRACT:
+        /* shouldn't be here */
         assert(0);
         break;
     }
@@ -529,6 +548,10 @@
   case TYPE_COCLASS:
   case TYPE_INTERFACE:
     break;
+  case TYPE_APICONTRACT:
+    /* not supposed to be here */
+    assert(0);
+    break;
   }
 }
 
@@ -551,7 +574,9 @@
     int in_namespace = t->namespace && !is_global_namespace(t->namespace);
     int save_written = t->written;
     decl_spec_t ds = {.type = t};
+    expr_t *contract = get_attrp(t->attrs, ATTR_CONTRACT);
 
+    if (contract) write_apicontract_guard_start(f, contract);
     if(in_namespace) {
         fprintf(f, "#ifdef __cplusplus\n");
         fprintf(f, "} /* extern \"C\" */\n");
@@ -569,6 +594,7 @@
         fprintf(f, ";\n");
         fprintf(f, "#endif\n\n");
     }
+    if (contract) write_apicontract_guard_end(f, contract);
 }
 
 void write_type_decl(FILE *f, const decl_spec_t *t, const char *name)
@@ -801,6 +827,8 @@
 
 static void write_typedef(FILE *header, type_t *type, int declonly)
 {
+  type_t *t = type_alias_get_aliasee_type(type);
+  if (winrt_mode && t->namespace && !is_global_namespace(t->namespace)) return;
   fprintf(header, "typedef ");
   write_type_v(header, type_alias_get_aliasee(type), FALSE, declonly, type->name, NAME_DEFAULT);
   fprintf(header, ";\n");
@@ -1446,12 +1474,63 @@
   fprintf(header, "#endif\n\n" );
 }
 
+static char *format_apicontract_macro(const type_t *type)
+{
+    char *name = format_namespace(type->namespace, "", "_", type->name, NULL);
+    int i;
+    for (i = strlen(name); i > 0; --i) name[i - 1] = toupper(name[i - 1]);
+    return name;
+}
+
+static void write_winrt_type_comments(FILE *header, const type_t *type)
+{
+    expr_t *contract = get_attrp(type->attrs, ATTR_CONTRACT);
+    fprintf(header, " *\n");
+    if (contract)
+    {
+        const type_t *type = contract->u.tref.type;
+        char *name = format_namespace(type->namespace, "", ".", type->name, NULL);
+        int ver = contract->ref->u.lval;
+        fprintf(header, " * Introduced to %s in version %d.%d\n *\n", name, (ver >> 16) & 0xffff, ver & 0xffff);
+        free(name);
+    }
+}
+
+static void write_apicontract_guard_start(FILE *header, const expr_t *expr)
+{
+    const type_t *type;
+    char *name;
+    int ver;
+    if (!winrt_mode) return;
+    type = expr->u.tref.type;
+    ver = expr->ref->u.lval;
+    name = format_apicontract_macro(type);
+    fprintf(header, "#if %s_VERSION >= %#x\n", name, ver);
+    free(name);
+}
+
+static void write_apicontract_guard_end(FILE *header, const expr_t *expr)
+{
+    const type_t *type;
+    char *name;
+    int ver;
+    if (!winrt_mode) return;
+    type = expr->u.tref.type;
+    ver = expr->ref->u.lval;
+    name = format_apicontract_macro(type);
+    fprintf(header, "#endif /* %s_VERSION >= %#x */\n", name, ver);
+    free(name);
+}
+
 static void write_com_interface_start(FILE *header, const type_t *iface)
 {
   int dispinterface = is_attr(iface->attrs, ATTR_DISPINTERFACE);
+  expr_t *contract = get_attrp(iface->attrs, ATTR_CONTRACT);
   fprintf(header, "/*****************************************************************************\n");
   fprintf(header, " * %s %sinterface\n", iface->name, dispinterface ? "disp" : "");
+  if (winrt_mode) write_winrt_type_comments(header, iface);
   fprintf(header, " */\n");
+  if (contract) write_apicontract_guard_start(header, contract);
   fprintf(header,"#ifndef __%s_%sINTERFACE_DEFINED__\n", iface->c_name, dispinterface ? "DISP" : "");
   fprintf(header,"#define __%s_%sINTERFACE_DEFINED__\n\n", iface->c_name, dispinterface ? "DISP" : "");
 }
@@ -1460,6 +1539,7 @@
 {
   int dispinterface = is_attr(iface->attrs, ATTR_DISPINTERFACE);
   const UUID *uuid = get_attrp(iface->attrs, ATTR_UUID);
+  expr_t *contract = get_attrp(iface->attrs, ATTR_CONTRACT);
   type_t *type;
 
   if (uuid)
@@ -1537,17 +1617,22 @@
     write_locals(header, iface, FALSE);
     fprintf(header, "\n");
   }
-  fprintf(header,"#endif  /* __%s_%sINTERFACE_DEFINED__ */\n\n", iface->c_name, dispinterface ? "DISP" : "");
+  fprintf(header, "#endif  /* __%s_%sINTERFACE_DEFINED__ */\n", iface->c_name, dispinterface ? "DISP" : "");
+  if (contract) write_apicontract_guard_end(header, contract);
+  fprintf(header, "\n");
 }
 
 static void write_rpc_interface_start(FILE *header, const type_t *iface)
 {
   unsigned int ver = get_attrv(iface->attrs, ATTR_VERSION);
   const var_t *var = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);
+  expr_t *contract = get_attrp(iface->attrs, ATTR_CONTRACT);
 
   fprintf(header, "/*****************************************************************************\n");
   fprintf(header, " * %s interface (v%d.%d)\n", iface->name, MAJORVERSION(ver), MINORVERSION(ver));
+  if (winrt_mode) write_winrt_type_comments(header, iface);
   fprintf(header, " */\n");
+  if (contract) write_apicontract_guard_start(header, contract);
   fprintf(header,"#ifndef __%s_INTERFACE_DEFINED__\n", iface->name);
   fprintf(header,"#define __%s_INTERFACE_DEFINED__\n\n", iface->name);
   if (var)
@@ -1572,7 +1657,10 @@
 
 static void write_rpc_interface_end(FILE *header, const type_t *iface)
 {
-  fprintf(header,"\n#endif  /* __%s_INTERFACE_DEFINED__ */\n\n", iface->name);
+  expr_t *contract = get_attrp(iface->attrs, ATTR_CONTRACT);
+  fprintf(header, "\n#endif  /* __%s_INTERFACE_DEFINED__ */\n", iface->name);
+  if (contract) write_apicontract_guard_end(header, contract);
+  fprintf(header, "\n");
 }
 
 static void write_coclass(FILE *header, type_t *cocl)
@@ -1610,6 +1698,15 @@
   fprintf(header, "#endif /* defined __%s_FWD_DEFINED__ */\n\n", cocl->name );
 }
 
+static void write_apicontract(FILE *header, type_t *apicontract)
+{
+    char *name = format_apicontract_macro(apicontract);
+    fprintf(header, "#if !defined(%s_VERSION)\n", name);
+    fprintf(header, "#define %s_VERSION %#x\n", name, get_attrv(apicontract->attrs, ATTR_CONTRACTVERSION));
+    fprintf(header, "#endif // defined(%s_VERSION)\n\n", name);
+    free(name);
+}
+
 static void write_import(FILE *header, const char *fname)
 {
   char *hname, *p;
@@ -1728,6 +1825,8 @@
         }
         else if (type_get_type(stmt->u.type) == TYPE_COCLASS)
           write_coclass(header, stmt->u.type);
+        else if (type_get_type(stmt->u.type) == TYPE_APICONTRACT)
+          write_apicontract(header, stmt->u.type);
         else
         {
           write_type_definition(header, stmt->u.type, stmt->declonly);
diff --git a/mingw-w64-tools/widl/src/parser.l b/mingw-w64-tools/widl/src/parser.l
index 925265d..9dce035 100644
--- a/mingw-w64-tools/widl/src/parser.l
+++ b/mingw-w64-tools/widl/src/parser.l
@@ -248,67 +248,69 @@
 struct keyword {
 	const char *kw;
 	int token;
+	int winrt_only : 1;
 };
 
 /* This table MUST be alphabetically sorted on the kw field */
 static const struct keyword keywords[] = {
-	{"FALSE",			tFALSE},
-	{"NULL",			tNULL},
-	{"TRUE",			tTRUE},
-	{"__cdecl",			tCDECL},
-	{"__fastcall",			tFASTCALL},
-	{"__int32",			tINT32},
-	{"__int3264",			tINT3264},
-	{"__int64",			tINT64},
-	{"__pascal",			tPASCAL},
-	{"__stdcall",			tSTDCALL},
-	{"_cdecl",			tCDECL},
-	{"_fastcall",			tFASTCALL},
-	{"_pascal",			tPASCAL},
-	{"_stdcall",			tSTDCALL},
-	{"boolean",			tBOOLEAN},
-	{"byte",			tBYTE},
-	{"case",			tCASE},
-	{"cdecl",			tCDECL},
-	{"char",			tCHAR},
-	{"coclass",			tCOCLASS},
-	{"const",			tCONST},
-	{"cpp_quote",			tCPPQUOTE},
-	{"default",			tDEFAULT},
-	{"dispinterface",		tDISPINTERFACE},
-	{"double",			tDOUBLE},
-	{"enum",			tENUM},
-	{"error_status_t",		tERRORSTATUST},
-	{"extern",			tEXTERN},
-	{"float",			tFLOAT},
-	{"handle_t",			tHANDLET},
-	{"hyper",			tHYPER},
-	{"import",			tIMPORT},
-	{"importlib",			tIMPORTLIB},
-	{"inline",			tINLINE},
-	{"int",				tINT},
-	{"interface",			tINTERFACE},
-	{"library",			tLIBRARY},
-	{"long",			tLONG},
-	{"methods",			tMETHODS},
-	{"module",			tMODULE},
-	{"namespace",			tNAMESPACE},
-	{"pascal",			tPASCAL},
-	{"properties",			tPROPERTIES},
-	{"register",			tREGISTER},
-	{"short",			tSHORT},
-	{"signed",			tSIGNED},
-	{"sizeof",			tSIZEOF},
-        {"small",			tSMALL},
-	{"static",			tSTATIC},
-	{"stdcall",			tSTDCALL},
-	{"struct",			tSTRUCT},
-	{"switch",			tSWITCH},
-	{"typedef",			tTYPEDEF},
-	{"union",			tUNION},
-	{"unsigned",			tUNSIGNED},
-	{"void",			tVOID},
-	{"wchar_t",			tWCHAR},
+	{"FALSE",           tFALSE,          0},
+	{"NULL",            tNULL,           0},
+	{"TRUE",            tTRUE,           0},
+	{"__cdecl",         tCDECL,          0},
+	{"__fastcall",      tFASTCALL,       0},
+	{"__int32",         tINT32,          0},
+	{"__int3264",       tINT3264,        0},
+	{"__int64",         tINT64,          0},
+	{"__pascal",        tPASCAL,         0},
+	{"__stdcall",       tSTDCALL,        0},
+	{"_cdecl",          tCDECL,          0},
+	{"_fastcall",       tFASTCALL,       0},
+	{"_pascal",         tPASCAL,         0},
+	{"_stdcall",        tSTDCALL,        0},
+	{"apicontract",     tAPICONTRACT,    1},
+	{"boolean",         tBOOLEAN,        0},
+	{"byte",            tBYTE,           0},
+	{"case",            tCASE,           0},
+	{"cdecl",           tCDECL,          0},
+	{"char",            tCHAR,           0},
+	{"coclass",         tCOCLASS,        0},
+	{"const",           tCONST,          0},
+	{"cpp_quote",       tCPPQUOTE,       0},
+	{"default",         tDEFAULT,        0},
+	{"dispinterface",   tDISPINTERFACE,  0},
+	{"double",          tDOUBLE,         0},
+	{"enum",            tENUM,           0},
+	{"error_status_t",  tERRORSTATUST,   0},
+	{"extern",          tEXTERN,         0},
+	{"float",           tFLOAT,          0},
+	{"handle_t",        tHANDLET,        0},
+	{"hyper",           tHYPER,          0},
+	{"import",          tIMPORT,         0},
+	{"importlib",       tIMPORTLIB,      0},
+	{"inline",          tINLINE,         0},
+	{"int",             tINT,            0},
+	{"interface",       tINTERFACE,      0},
+	{"library",         tLIBRARY,        0},
+	{"long",            tLONG,           0},
+	{"methods",         tMETHODS,        0},
+	{"module",          tMODULE,         0},
+	{"namespace",       tNAMESPACE,      1},
+	{"pascal",          tPASCAL,         0},
+	{"properties",      tPROPERTIES,     0},
+	{"register",        tREGISTER,       0},
+	{"short",           tSHORT,          0},
+	{"signed",          tSIGNED,         0},
+	{"sizeof",          tSIZEOF,         0},
+	{"small",           tSMALL,          0},
+	{"static",          tSTATIC,         0},
+	{"stdcall",         tSTDCALL,        0},
+	{"struct",          tSTRUCT,         0},
+	{"switch",          tSWITCH,         0},
+	{"typedef",         tTYPEDEF,        0},
+	{"union",           tUNION,          0},
+	{"unsigned",        tUNSIGNED,       0},
+	{"void",            tVOID,           0},
+	{"wchar_t",         tWCHAR,          0},
 };
 #define NKEYWORDS (sizeof(keywords)/sizeof(keywords[0]))
 
@@ -317,117 +319,122 @@
  */
 static const struct keyword attr_keywords[] =
 {
-        {"aggregatable",                tAGGREGATABLE},
-        {"allocate",                    tALLOCATE},
-        {"annotation",                  tANNOTATION},
-        {"apartment",                   tAPARTMENT},
-        {"appobject",                   tAPPOBJECT},
-        {"async",                       tASYNC},
-        {"async_uuid",                  tASYNCUUID},
-        {"auto_handle",                 tAUTOHANDLE},
-        {"bindable",                    tBINDABLE},
-        {"both",                        tBOTH},
-        {"broadcast",                   tBROADCAST},
-        {"byte_count",                  tBYTECOUNT},
-        {"call_as",                     tCALLAS},
-        {"callback",                    tCALLBACK},
-        {"code",                        tCODE},
-        {"comm_status",                 tCOMMSTATUS},
-        {"context_handle",              tCONTEXTHANDLE},
-        {"context_handle_noserialize",  tCONTEXTHANDLENOSERIALIZE},
-        {"context_handle_serialize",    tCONTEXTHANDLENOSERIALIZE},
-        {"control",                     tCONTROL},
-        {"decode",                      tDECODE},
-        {"defaultbind",                 tDEFAULTBIND},
-        {"defaultcollelem",             tDEFAULTCOLLELEM},
-        {"defaultvalue",                tDEFAULTVALUE},
-        {"defaultvtable",               tDEFAULTVTABLE},
-        {"disable_consistency_check",   tDISABLECONSISTENCYCHECK},
-        {"displaybind",                 tDISPLAYBIND},
-        {"dllname",                     tDLLNAME},
-        {"dual",                        tDUAL},
-        {"enable_allocate",             tENABLEALLOCATE},
-        {"encode",                      tENCODE},
-        {"endpoint",                    tENDPOINT},
-        {"entry",                       tENTRY},
-        {"explicit_handle",             tEXPLICITHANDLE},
-        {"fault_status",                tFAULTSTATUS},
-        {"force_allocate",              tFORCEALLOCATE},
-        {"free",                        tFREE},
-        {"handle",                      tHANDLE},
-        {"helpcontext",                 tHELPCONTEXT},
-        {"helpfile",                    tHELPFILE},
-        {"helpstring",                  tHELPSTRING},
-        {"helpstringcontext",           tHELPSTRINGCONTEXT},
-        {"helpstringdll",               tHELPSTRINGDLL},
-        {"hidden",                      tHIDDEN},
-        {"id",                          tID},
-        {"idempotent",                  tIDEMPOTENT},
-        {"ignore",                      tIGNORE},
-        {"iid_is",                      tIIDIS},
-        {"immediatebind",               tIMMEDIATEBIND},
-        {"implicit_handle",             tIMPLICITHANDLE},
-        {"in",                          tIN},
-        {"in_line",                     tIN_LINE},
-        {"input_sync",                  tINPUTSYNC},
-        {"lcid",                        tLCID},
-        {"length_is",                   tLENGTHIS},
-        {"licensed",                    tLICENSED},
-        {"local",                       tLOCAL},
-        {"maybe",                       tMAYBE},
-        {"message",                     tMESSAGE},
-        {"neutral",                     tNEUTRAL},
-        {"nocode",                      tNOCODE},
-        {"nonbrowsable",                tNONBROWSABLE},
-        {"noncreatable",                tNONCREATABLE},
-        {"nonextensible",               tNONEXTENSIBLE},
-        {"notify",                      tNOTIFY},
-        {"notify_flag",                 tNOTIFYFLAG},
-        {"object",                      tOBJECT},
-        {"odl",                         tODL},
-        {"oleautomation",               tOLEAUTOMATION},
-        {"optimize",                    tOPTIMIZE},
-        {"optional",                    tOPTIONAL},
-        {"out",                         tOUT},
-        {"partial_ignore",              tPARTIALIGNORE},
-        {"pointer_default",             tPOINTERDEFAULT},
-        {"progid",                      tPROGID},
-        {"propget",                     tPROPGET},
-        {"propput",                     tPROPPUT},
-        {"propputref",                  tPROPPUTREF},
-        {"proxy",                       tPROXY},
-        {"ptr",                         tPTR},
-        {"public",                      tPUBLIC},
-        {"range",                       tRANGE},
-        {"readonly",                    tREADONLY},
-        {"ref",                         tREF},
-        {"represent_as",                tREPRESENTAS},
-        {"requestedit",                 tREQUESTEDIT},
-        {"restricted",                  tRESTRICTED},
-        {"retval",                      tRETVAL},
-        {"single",                      tSINGLE},
-        {"size_is",                     tSIZEIS},
-        {"source",                      tSOURCE},
-        {"strict_context_handle",       tSTRICTCONTEXTHANDLE},
-        {"string",                      tSTRING},
-        {"switch_is",                   tSWITCHIS},
-        {"switch_type",                 tSWITCHTYPE},
-        {"threading",                   tTHREADING},
-        {"transmit_as",                 tTRANSMITAS},
-        {"uidefault",                   tUIDEFAULT},
-        {"unique",                      tUNIQUE},
-        {"user_marshal",                tUSERMARSHAL},
-        {"usesgetlasterror",            tUSESGETLASTERROR},
-        {"uuid",                        tUUID},
-        {"v1_enum",                     tV1ENUM},
-        {"vararg",                      tVARARG},
-        {"version",                     tVERSION},
-        {"vi_progid",                   tVIPROGID},
-        {"wire_marshal",                tWIREMARSHAL},
+	{"aggregatable",                tAGGREGATABLE,              0},
+	{"all_nodes",                   tALLNODES,                  0},
+	{"allocate",                    tALLOCATE,                  0},
+	{"annotation",                  tANNOTATION,                0},
+	{"apartment",                   tAPARTMENT,                 0},
+	{"appobject",                   tAPPOBJECT,                 0},
+	{"async",                       tASYNC,                     0},
+	{"async_uuid",                  tASYNCUUID,                 0},
+	{"auto_handle",                 tAUTOHANDLE,                0},
+	{"bindable",                    tBINDABLE,                  0},
+	{"both",                        tBOTH,                      0},
+	{"broadcast",                   tBROADCAST,                 0},
+	{"byte_count",                  tBYTECOUNT,                 0},
+	{"call_as",                     tCALLAS,                    0},
+	{"callback",                    tCALLBACK,                  0},
+	{"code",                        tCODE,                      0},
+	{"comm_status",                 tCOMMSTATUS,                0},
+	{"context_handle",              tCONTEXTHANDLE,             0},
+	{"context_handle_noserialize",  tCONTEXTHANDLENOSERIALIZE,  0},
+	{"context_handle_serialize",    tCONTEXTHANDLENOSERIALIZE,  0},
+	{"contract",                    tCONTRACT,                  1},
+	{"contractversion",             tCONTRACTVERSION,           1},
+	{"control",                     tCONTROL,                   0},
+	{"custom",                      tCUSTOM,                    0},
+	{"decode",                      tDECODE,                    0},
+	{"defaultbind",                 tDEFAULTBIND,               0},
+	{"defaultcollelem",             tDEFAULTCOLLELEM,           0},
+	{"defaultvalue",                tDEFAULTVALUE,              0},
+	{"defaultvtable",               tDEFAULTVTABLE,             0},
+	{"disable_consistency_check",   tDISABLECONSISTENCYCHECK,   0},
+	{"displaybind",                 tDISPLAYBIND,               0},
+	{"dllname",                     tDLLNAME,                   0},
+	{"dont_free",                   tDONTFREE,                  0},
+	{"dual",                        tDUAL,                      0},
+	{"enable_allocate",             tENABLEALLOCATE,            0},
+	{"encode",                      tENCODE,                    0},
+	{"endpoint",                    tENDPOINT,                  0},
+	{"entry",                       tENTRY,                     0},
+	{"explicit_handle",             tEXPLICITHANDLE,            0},
+	{"fault_status",                tFAULTSTATUS,               0},
+	{"force_allocate",              tFORCEALLOCATE,             0},
+	{"free",                        tFREE,                      0},
+	{"handle",                      tHANDLE,                    0},
+	{"helpcontext",                 tHELPCONTEXT,               0},
+	{"helpfile",                    tHELPFILE,                  0},
+	{"helpstring",                  tHELPSTRING,                0},
+	{"helpstringcontext",           tHELPSTRINGCONTEXT,         0},
+	{"helpstringdll",               tHELPSTRINGDLL,             0},
+	{"hidden",                      tHIDDEN,                    0},
+	{"id",                          tID,                        0},
+	{"idempotent",                  tIDEMPOTENT,                0},
+	{"ignore",                      tIGNORE,                    0},
+	{"iid_is",                      tIIDIS,                     0},
+	{"immediatebind",               tIMMEDIATEBIND,             0},
+	{"implicit_handle",             tIMPLICITHANDLE,            0},
+	{"in",                          tIN,                        0},
+	{"in_line",                     tIN_LINE,                   0},
+	{"input_sync",                  tINPUTSYNC,                 0},
+	{"lcid",                        tLCID,                      0},
+	{"length_is",                   tLENGTHIS,                  0},
+	{"licensed",                    tLICENSED,                  0},
+	{"local",                       tLOCAL,                     0},
+	{"maybe",                       tMAYBE,                     0},
+	{"message",                     tMESSAGE,                   0},
+	{"neutral",                     tNEUTRAL,                   0},
+	{"nocode",                      tNOCODE,                    0},
+	{"nonbrowsable",                tNONBROWSABLE,              0},
+	{"noncreatable",                tNONCREATABLE,              0},
+	{"nonextensible",               tNONEXTENSIBLE,             0},
+	{"notify",                      tNOTIFY,                    0},
+	{"notify_flag",                 tNOTIFYFLAG,                0},
+	{"object",                      tOBJECT,                    0},
+	{"odl",                         tODL,                       0},
+	{"oleautomation",               tOLEAUTOMATION,             0},
+	{"optimize",                    tOPTIMIZE,                  0},
+	{"optional",                    tOPTIONAL,                  0},
+	{"out",                         tOUT,                       0},
+	{"partial_ignore",              tPARTIALIGNORE,             0},
+	{"pointer_default",             tPOINTERDEFAULT,            0},
+	{"progid",                      tPROGID,                    0},
+	{"propget",                     tPROPGET,                   0},
+	{"propput",                     tPROPPUT,                   0},
+	{"propputref",                  tPROPPUTREF,                0},
+	{"proxy",                       tPROXY,                     0},
+	{"ptr",                         tPTR,                       0},
+	{"public",                      tPUBLIC,                    0},
+	{"range",                       tRANGE,                     0},
+	{"readonly",                    tREADONLY,                  0},
+	{"ref",                         tREF,                       0},
+	{"represent_as",                tREPRESENTAS,               0},
+	{"requestedit",                 tREQUESTEDIT,               0},
+	{"restricted",                  tRESTRICTED,                0},
+	{"retval",                      tRETVAL,                    0},
+	{"single",                      tSINGLE,                    0},
+	{"single_node",                 tSINGLENODE,                0},
+	{"size_is",                     tSIZEIS,                    0},
+	{"source",                      tSOURCE,                    0},
+	{"strict_context_handle",       tSTRICTCONTEXTHANDLE,       0},
+	{"string",                      tSTRING,                    0},
+	{"switch_is",                   tSWITCHIS,                  0},
+	{"switch_type",                 tSWITCHTYPE,                0},
+	{"threading",                   tTHREADING,                 0},
+	{"transmit_as",                 tTRANSMITAS,                0},
+	{"uidefault",                   tUIDEFAULT,                 0},
+	{"unique",                      tUNIQUE,                    0},
+	{"user_marshal",                tUSERMARSHAL,               0},
+	{"usesgetlasterror",            tUSESGETLASTERROR,          0},
+	{"uuid",                        tUUID,                      0},
+	{"v1_enum",                     tV1ENUM,                    0},
+	{"vararg",                      tVARARG,                    0},
+	{"version",                     tVERSION,                   0},
+	{"vi_progid",                   tVIPROGID,                  0},
+	{"wire_marshal",                tWIREMARSHAL,               0},
 };
 
 /* attributes TODO:
-    custom
     first_is
     last_is
     max_is
@@ -446,7 +453,7 @@
 	struct keyword key, *kwp;
 	key.kw = kw;
 	kwp = bsearch(&key, keywords, NKEYWORDS, sizeof(keywords[0]), kw_cmp_func);
-	if (kwp && (winrt_mode || kwp->token != tNAMESPACE)) {
+	if (kwp && (!kwp->winrt_only || winrt_mode)) {
 		parser_lval.str = xstrdup(kwp->kw);
 		return kwp->token;
 	}
@@ -460,7 +467,7 @@
         key.kw = kw;
         kwp = bsearch(&key, attr_keywords, sizeof(attr_keywords)/sizeof(attr_keywords[0]),
                       sizeof(attr_keywords[0]), kw_cmp_func);
-        if (kwp) {
+        if (kwp && (!kwp->winrt_only || winrt_mode)) {
             parser_lval.str = xstrdup(kwp->kw);
             return kwp->token;
         }
diff --git a/mingw-w64-tools/widl/src/parser.tab.c b/mingw-w64-tools/widl/src/parser.tab.c
index 5259c00..c2ea439 100644
--- a/mingw-w64-tools/widl/src/parser.tab.c
+++ b/mingw-w64-tools/widl/src/parser.tab.c
@@ -1,4 +1,4 @@
-/* A Bison parser, made by GNU Bison 3.7.2.  */
+/* A Bison parser, made by GNU Bison 3.7.4.  */
 
 /* Bison implementation for Yacc-like parsers in C
 
@@ -45,11 +45,11 @@
    define necessary library symbols; they are noted "INFRINGES ON
    USER NAME SPACE" below.  */
 
-/* Identify Bison output.  */
-#define YYBISON 1
+/* Identify Bison output, and Bison version.  */
+#define YYBISON 30704
 
-/* Bison version.  */
-#define YYBISON_VERSION "3.7.2"
+/* Bison version string.  */
+#define YYBISON_VERSION "3.7.4"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -135,6 +135,7 @@
 static attr_t *make_attr(enum attr_type type);
 static attr_t *make_attrv(enum attr_type type, unsigned int val);
 static attr_t *make_attrp(enum attr_type type, void *val);
+static attr_t *make_custom_attr(UUID *id, expr_t *pval);
 static expr_list_t *append_expr(expr_list_t *list, expr_t *expr);
 static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, declarator_t *decl, int top);
 static var_list_t *set_var_types(attr_list_t *attrs, decl_spec_t *decl_spec, declarator_list_t *decls);
@@ -176,6 +177,7 @@
 static attr_list_t *check_dispiface_attrs(const char *name, attr_list_t *attrs);
 static attr_list_t *check_module_attrs(const char *name, attr_list_t *attrs);
 static attr_list_t *check_coclass_attrs(const char *name, attr_list_t *attrs);
+static attr_list_t *check_apicontract_attrs(const char *name, attr_list_t *attrs);
 const char *get_attr_display_name(enum attr_type type);
 static void add_explicit_handle_if_necessary(const type_t *iface, var_t *func);
 static void check_def(const type_t *t);
@@ -207,7 +209,7 @@
 static typelib_t *current_typelib;
 
 
-#line 211 "tools/widl/parser.tab.c"
+#line 213 "tools/widl/parser.tab.c"
 
 # ifndef YY_CAST
 #  ifdef __cplusplus
@@ -272,169 +274,176 @@
     LOGICALAND = 279,              /* LOGICALAND  */
     ELLIPSIS = 280,                /* ELLIPSIS  */
     tAGGREGATABLE = 281,           /* tAGGREGATABLE  */
-    tALLOCATE = 282,               /* tALLOCATE  */
-    tANNOTATION = 283,             /* tANNOTATION  */
-    tAPPOBJECT = 284,              /* tAPPOBJECT  */
-    tASYNC = 285,                  /* tASYNC  */
-    tASYNCUUID = 286,              /* tASYNCUUID  */
-    tAUTOHANDLE = 287,             /* tAUTOHANDLE  */
-    tBINDABLE = 288,               /* tBINDABLE  */
-    tBOOLEAN = 289,                /* tBOOLEAN  */
-    tBROADCAST = 290,              /* tBROADCAST  */
-    tBYTE = 291,                   /* tBYTE  */
-    tBYTECOUNT = 292,              /* tBYTECOUNT  */
-    tCALLAS = 293,                 /* tCALLAS  */
-    tCALLBACK = 294,               /* tCALLBACK  */
-    tCASE = 295,                   /* tCASE  */
-    tCDECL = 296,                  /* tCDECL  */
-    tCHAR = 297,                   /* tCHAR  */
-    tCOCLASS = 298,                /* tCOCLASS  */
-    tCODE = 299,                   /* tCODE  */
-    tCOMMSTATUS = 300,             /* tCOMMSTATUS  */
-    tCONST = 301,                  /* tCONST  */
-    tCONTEXTHANDLE = 302,          /* tCONTEXTHANDLE  */
-    tCONTEXTHANDLENOSERIALIZE = 303, /* tCONTEXTHANDLENOSERIALIZE  */
-    tCONTEXTHANDLESERIALIZE = 304, /* tCONTEXTHANDLESERIALIZE  */
-    tCONTROL = 305,                /* tCONTROL  */
-    tCPPQUOTE = 306,               /* tCPPQUOTE  */
-    tDECODE = 307,                 /* tDECODE  */
-    tDEFAULT = 308,                /* tDEFAULT  */
-    tDEFAULTBIND = 309,            /* tDEFAULTBIND  */
-    tDEFAULTCOLLELEM = 310,        /* tDEFAULTCOLLELEM  */
-    tDEFAULTVALUE = 311,           /* tDEFAULTVALUE  */
-    tDEFAULTVTABLE = 312,          /* tDEFAULTVTABLE  */
-    tDISABLECONSISTENCYCHECK = 313, /* tDISABLECONSISTENCYCHECK  */
-    tDISPLAYBIND = 314,            /* tDISPLAYBIND  */
-    tDISPINTERFACE = 315,          /* tDISPINTERFACE  */
-    tDLLNAME = 316,                /* tDLLNAME  */
-    tDOUBLE = 317,                 /* tDOUBLE  */
-    tDUAL = 318,                   /* tDUAL  */
-    tENABLEALLOCATE = 319,         /* tENABLEALLOCATE  */
-    tENCODE = 320,                 /* tENCODE  */
-    tENDPOINT = 321,               /* tENDPOINT  */
-    tENTRY = 322,                  /* tENTRY  */
-    tENUM = 323,                   /* tENUM  */
-    tERRORSTATUST = 324,           /* tERRORSTATUST  */
-    tEXPLICITHANDLE = 325,         /* tEXPLICITHANDLE  */
-    tEXTERN = 326,                 /* tEXTERN  */
-    tFALSE = 327,                  /* tFALSE  */
-    tFASTCALL = 328,               /* tFASTCALL  */
-    tFAULTSTATUS = 329,            /* tFAULTSTATUS  */
-    tFLOAT = 330,                  /* tFLOAT  */
-    tFORCEALLOCATE = 331,          /* tFORCEALLOCATE  */
-    tHANDLE = 332,                 /* tHANDLE  */
-    tHANDLET = 333,                /* tHANDLET  */
-    tHELPCONTEXT = 334,            /* tHELPCONTEXT  */
-    tHELPFILE = 335,               /* tHELPFILE  */
-    tHELPSTRING = 336,             /* tHELPSTRING  */
-    tHELPSTRINGCONTEXT = 337,      /* tHELPSTRINGCONTEXT  */
-    tHELPSTRINGDLL = 338,          /* tHELPSTRINGDLL  */
-    tHIDDEN = 339,                 /* tHIDDEN  */
-    tHYPER = 340,                  /* tHYPER  */
-    tID = 341,                     /* tID  */
-    tIDEMPOTENT = 342,             /* tIDEMPOTENT  */
-    tIGNORE = 343,                 /* tIGNORE  */
-    tIIDIS = 344,                  /* tIIDIS  */
-    tIMMEDIATEBIND = 345,          /* tIMMEDIATEBIND  */
-    tIMPLICITHANDLE = 346,         /* tIMPLICITHANDLE  */
-    tIMPORT = 347,                 /* tIMPORT  */
-    tIMPORTLIB = 348,              /* tIMPORTLIB  */
-    tIN = 349,                     /* tIN  */
-    tIN_LINE = 350,                /* tIN_LINE  */
-    tINLINE = 351,                 /* tINLINE  */
-    tINPUTSYNC = 352,              /* tINPUTSYNC  */
-    tINT = 353,                    /* tINT  */
-    tINT32 = 354,                  /* tINT32  */
-    tINT3264 = 355,                /* tINT3264  */
-    tINT64 = 356,                  /* tINT64  */
-    tINTERFACE = 357,              /* tINTERFACE  */
-    tLCID = 358,                   /* tLCID  */
-    tLENGTHIS = 359,               /* tLENGTHIS  */
-    tLIBRARY = 360,                /* tLIBRARY  */
-    tLICENSED = 361,               /* tLICENSED  */
-    tLOCAL = 362,                  /* tLOCAL  */
-    tLONG = 363,                   /* tLONG  */
-    tMAYBE = 364,                  /* tMAYBE  */
-    tMESSAGE = 365,                /* tMESSAGE  */
-    tMETHODS = 366,                /* tMETHODS  */
-    tMODULE = 367,                 /* tMODULE  */
-    tNAMESPACE = 368,              /* tNAMESPACE  */
-    tNOCODE = 369,                 /* tNOCODE  */
-    tNONBROWSABLE = 370,           /* tNONBROWSABLE  */
-    tNONCREATABLE = 371,           /* tNONCREATABLE  */
-    tNONEXTENSIBLE = 372,          /* tNONEXTENSIBLE  */
-    tNOTIFY = 373,                 /* tNOTIFY  */
-    tNOTIFYFLAG = 374,             /* tNOTIFYFLAG  */
-    tNULL = 375,                   /* tNULL  */
-    tOBJECT = 376,                 /* tOBJECT  */
-    tODL = 377,                    /* tODL  */
-    tOLEAUTOMATION = 378,          /* tOLEAUTOMATION  */
-    tOPTIMIZE = 379,               /* tOPTIMIZE  */
-    tOPTIONAL = 380,               /* tOPTIONAL  */
-    tOUT = 381,                    /* tOUT  */
-    tPARTIALIGNORE = 382,          /* tPARTIALIGNORE  */
-    tPASCAL = 383,                 /* tPASCAL  */
-    tPOINTERDEFAULT = 384,         /* tPOINTERDEFAULT  */
-    tPRAGMA_WARNING = 385,         /* tPRAGMA_WARNING  */
-    tPROGID = 386,                 /* tPROGID  */
-    tPROPERTIES = 387,             /* tPROPERTIES  */
-    tPROPGET = 388,                /* tPROPGET  */
-    tPROPPUT = 389,                /* tPROPPUT  */
-    tPROPPUTREF = 390,             /* tPROPPUTREF  */
-    tPROXY = 391,                  /* tPROXY  */
-    tPTR = 392,                    /* tPTR  */
-    tPUBLIC = 393,                 /* tPUBLIC  */
-    tRANGE = 394,                  /* tRANGE  */
-    tREADONLY = 395,               /* tREADONLY  */
-    tREF = 396,                    /* tREF  */
-    tREGISTER = 397,               /* tREGISTER  */
-    tREPRESENTAS = 398,            /* tREPRESENTAS  */
-    tREQUESTEDIT = 399,            /* tREQUESTEDIT  */
-    tRESTRICTED = 400,             /* tRESTRICTED  */
-    tRETVAL = 401,                 /* tRETVAL  */
-    tSAFEARRAY = 402,              /* tSAFEARRAY  */
-    tSHORT = 403,                  /* tSHORT  */
-    tSIGNED = 404,                 /* tSIGNED  */
-    tSIZEIS = 405,                 /* tSIZEIS  */
-    tSIZEOF = 406,                 /* tSIZEOF  */
-    tSMALL = 407,                  /* tSMALL  */
-    tSOURCE = 408,                 /* tSOURCE  */
-    tSTATIC = 409,                 /* tSTATIC  */
-    tSTDCALL = 410,                /* tSTDCALL  */
-    tSTRICTCONTEXTHANDLE = 411,    /* tSTRICTCONTEXTHANDLE  */
-    tSTRING = 412,                 /* tSTRING  */
-    tSTRUCT = 413,                 /* tSTRUCT  */
-    tSWITCH = 414,                 /* tSWITCH  */
-    tSWITCHIS = 415,               /* tSWITCHIS  */
-    tSWITCHTYPE = 416,             /* tSWITCHTYPE  */
-    tTHREADING = 417,              /* tTHREADING  */
-    tTRANSMITAS = 418,             /* tTRANSMITAS  */
-    tTRUE = 419,                   /* tTRUE  */
-    tTYPEDEF = 420,                /* tTYPEDEF  */
-    tUIDEFAULT = 421,              /* tUIDEFAULT  */
-    tUNION = 422,                  /* tUNION  */
-    tUNIQUE = 423,                 /* tUNIQUE  */
-    tUNSIGNED = 424,               /* tUNSIGNED  */
-    tUSESGETLASTERROR = 425,       /* tUSESGETLASTERROR  */
-    tUSERMARSHAL = 426,            /* tUSERMARSHAL  */
-    tUUID = 427,                   /* tUUID  */
-    tV1ENUM = 428,                 /* tV1ENUM  */
-    tVARARG = 429,                 /* tVARARG  */
-    tVERSION = 430,                /* tVERSION  */
-    tVIPROGID = 431,               /* tVIPROGID  */
-    tVOID = 432,                   /* tVOID  */
-    tWCHAR = 433,                  /* tWCHAR  */
-    tWIREMARSHAL = 434,            /* tWIREMARSHAL  */
-    tAPARTMENT = 435,              /* tAPARTMENT  */
-    tNEUTRAL = 436,                /* tNEUTRAL  */
-    tSINGLE = 437,                 /* tSINGLE  */
-    tFREE = 438,                   /* tFREE  */
-    tBOTH = 439,                   /* tBOTH  */
-    CAST = 440,                    /* CAST  */
-    PPTR = 441,                    /* PPTR  */
-    POS = 442,                     /* POS  */
-    NEG = 443,                     /* NEG  */
-    ADDRESSOF = 444                /* ADDRESSOF  */
+    tALLNODES = 282,               /* tALLNODES  */
+    tALLOCATE = 283,               /* tALLOCATE  */
+    tANNOTATION = 284,             /* tANNOTATION  */
+    tAPICONTRACT = 285,            /* tAPICONTRACT  */
+    tAPPOBJECT = 286,              /* tAPPOBJECT  */
+    tASYNC = 287,                  /* tASYNC  */
+    tASYNCUUID = 288,              /* tASYNCUUID  */
+    tAUTOHANDLE = 289,             /* tAUTOHANDLE  */
+    tBINDABLE = 290,               /* tBINDABLE  */
+    tBOOLEAN = 291,                /* tBOOLEAN  */
+    tBROADCAST = 292,              /* tBROADCAST  */
+    tBYTE = 293,                   /* tBYTE  */
+    tBYTECOUNT = 294,              /* tBYTECOUNT  */
+    tCALLAS = 295,                 /* tCALLAS  */
+    tCALLBACK = 296,               /* tCALLBACK  */
+    tCASE = 297,                   /* tCASE  */
+    tCDECL = 298,                  /* tCDECL  */
+    tCHAR = 299,                   /* tCHAR  */
+    tCOCLASS = 300,                /* tCOCLASS  */
+    tCODE = 301,                   /* tCODE  */
+    tCOMMSTATUS = 302,             /* tCOMMSTATUS  */
+    tCONST = 303,                  /* tCONST  */
+    tCONTEXTHANDLE = 304,          /* tCONTEXTHANDLE  */
+    tCONTEXTHANDLENOSERIALIZE = 305, /* tCONTEXTHANDLENOSERIALIZE  */
+    tCONTEXTHANDLESERIALIZE = 306, /* tCONTEXTHANDLESERIALIZE  */
+    tCONTRACT = 307,               /* tCONTRACT  */
+    tCONTRACTVERSION = 308,        /* tCONTRACTVERSION  */
+    tCONTROL = 309,                /* tCONTROL  */
+    tCPPQUOTE = 310,               /* tCPPQUOTE  */
+    tCUSTOM = 311,                 /* tCUSTOM  */
+    tDECODE = 312,                 /* tDECODE  */
+    tDEFAULT = 313,                /* tDEFAULT  */
+    tDEFAULTBIND = 314,            /* tDEFAULTBIND  */
+    tDEFAULTCOLLELEM = 315,        /* tDEFAULTCOLLELEM  */
+    tDEFAULTVALUE = 316,           /* tDEFAULTVALUE  */
+    tDEFAULTVTABLE = 317,          /* tDEFAULTVTABLE  */
+    tDISABLECONSISTENCYCHECK = 318, /* tDISABLECONSISTENCYCHECK  */
+    tDISPLAYBIND = 319,            /* tDISPLAYBIND  */
+    tDISPINTERFACE = 320,          /* tDISPINTERFACE  */
+    tDLLNAME = 321,                /* tDLLNAME  */
+    tDONTFREE = 322,               /* tDONTFREE  */
+    tDOUBLE = 323,                 /* tDOUBLE  */
+    tDUAL = 324,                   /* tDUAL  */
+    tENABLEALLOCATE = 325,         /* tENABLEALLOCATE  */
+    tENCODE = 326,                 /* tENCODE  */
+    tENDPOINT = 327,               /* tENDPOINT  */
+    tENTRY = 328,                  /* tENTRY  */
+    tENUM = 329,                   /* tENUM  */
+    tERRORSTATUST = 330,           /* tERRORSTATUST  */
+    tEXPLICITHANDLE = 331,         /* tEXPLICITHANDLE  */
+    tEXTERN = 332,                 /* tEXTERN  */
+    tFALSE = 333,                  /* tFALSE  */
+    tFASTCALL = 334,               /* tFASTCALL  */
+    tFAULTSTATUS = 335,            /* tFAULTSTATUS  */
+    tFLOAT = 336,                  /* tFLOAT  */
+    tFORCEALLOCATE = 337,          /* tFORCEALLOCATE  */
+    tHANDLE = 338,                 /* tHANDLE  */
+    tHANDLET = 339,                /* tHANDLET  */
+    tHELPCONTEXT = 340,            /* tHELPCONTEXT  */
+    tHELPFILE = 341,               /* tHELPFILE  */
+    tHELPSTRING = 342,             /* tHELPSTRING  */
+    tHELPSTRINGCONTEXT = 343,      /* tHELPSTRINGCONTEXT  */
+    tHELPSTRINGDLL = 344,          /* tHELPSTRINGDLL  */
+    tHIDDEN = 345,                 /* tHIDDEN  */
+    tHYPER = 346,                  /* tHYPER  */
+    tID = 347,                     /* tID  */
+    tIDEMPOTENT = 348,             /* tIDEMPOTENT  */
+    tIGNORE = 349,                 /* tIGNORE  */
+    tIIDIS = 350,                  /* tIIDIS  */
+    tIMMEDIATEBIND = 351,          /* tIMMEDIATEBIND  */
+    tIMPLICITHANDLE = 352,         /* tIMPLICITHANDLE  */
+    tIMPORT = 353,                 /* tIMPORT  */
+    tIMPORTLIB = 354,              /* tIMPORTLIB  */
+    tIN = 355,                     /* tIN  */
+    tIN_LINE = 356,                /* tIN_LINE  */
+    tINLINE = 357,                 /* tINLINE  */
+    tINPUTSYNC = 358,              /* tINPUTSYNC  */
+    tINT = 359,                    /* tINT  */
+    tINT32 = 360,                  /* tINT32  */
+    tINT3264 = 361,                /* tINT3264  */
+    tINT64 = 362,                  /* tINT64  */
+    tINTERFACE = 363,              /* tINTERFACE  */
+    tLCID = 364,                   /* tLCID  */
+    tLENGTHIS = 365,               /* tLENGTHIS  */
+    tLIBRARY = 366,                /* tLIBRARY  */
+    tLICENSED = 367,               /* tLICENSED  */
+    tLOCAL = 368,                  /* tLOCAL  */
+    tLONG = 369,                   /* tLONG  */
+    tMAYBE = 370,                  /* tMAYBE  */
+    tMESSAGE = 371,                /* tMESSAGE  */
+    tMETHODS = 372,                /* tMETHODS  */
+    tMODULE = 373,                 /* tMODULE  */
+    tNAMESPACE = 374,              /* tNAMESPACE  */
+    tNOCODE = 375,                 /* tNOCODE  */
+    tNONBROWSABLE = 376,           /* tNONBROWSABLE  */
+    tNONCREATABLE = 377,           /* tNONCREATABLE  */
+    tNONEXTENSIBLE = 378,          /* tNONEXTENSIBLE  */
+    tNOTIFY = 379,                 /* tNOTIFY  */
+    tNOTIFYFLAG = 380,             /* tNOTIFYFLAG  */
+    tNULL = 381,                   /* tNULL  */
+    tOBJECT = 382,                 /* tOBJECT  */
+    tODL = 383,                    /* tODL  */
+    tOLEAUTOMATION = 384,          /* tOLEAUTOMATION  */
+    tOPTIMIZE = 385,               /* tOPTIMIZE  */
+    tOPTIONAL = 386,               /* tOPTIONAL  */
+    tOUT = 387,                    /* tOUT  */
+    tPARTIALIGNORE = 388,          /* tPARTIALIGNORE  */
+    tPASCAL = 389,                 /* tPASCAL  */
+    tPOINTERDEFAULT = 390,         /* tPOINTERDEFAULT  */
+    tPRAGMA_WARNING = 391,         /* tPRAGMA_WARNING  */
+    tPROGID = 392,                 /* tPROGID  */
+    tPROPERTIES = 393,             /* tPROPERTIES  */
+    tPROPGET = 394,                /* tPROPGET  */
+    tPROPPUT = 395,                /* tPROPPUT  */
+    tPROPPUTREF = 396,             /* tPROPPUTREF  */
+    tPROXY = 397,                  /* tPROXY  */
+    tPTR = 398,                    /* tPTR  */
+    tPUBLIC = 399,                 /* tPUBLIC  */
+    tRANGE = 400,                  /* tRANGE  */
+    tREADONLY = 401,               /* tREADONLY  */
+    tREF = 402,                    /* tREF  */
+    tREGISTER = 403,               /* tREGISTER  */
+    tREPRESENTAS = 404,            /* tREPRESENTAS  */
+    tREQUESTEDIT = 405,            /* tREQUESTEDIT  */
+    tRESTRICTED = 406,             /* tRESTRICTED  */
+    tRETVAL = 407,                 /* tRETVAL  */
+    tSAFEARRAY = 408,              /* tSAFEARRAY  */
+    tSHORT = 409,                  /* tSHORT  */
+    tSIGNED = 410,                 /* tSIGNED  */
+    tSINGLENODE = 411,             /* tSINGLENODE  */
+    tSIZEIS = 412,                 /* tSIZEIS  */
+    tSIZEOF = 413,                 /* tSIZEOF  */
+    tSMALL = 414,                  /* tSMALL  */
+    tSOURCE = 415,                 /* tSOURCE  */
+    tSTATIC = 416,                 /* tSTATIC  */
+    tSTDCALL = 417,                /* tSTDCALL  */
+    tSTRICTCONTEXTHANDLE = 418,    /* tSTRICTCONTEXTHANDLE  */
+    tSTRING = 419,                 /* tSTRING  */
+    tSTRUCT = 420,                 /* tSTRUCT  */
+    tSWITCH = 421,                 /* tSWITCH  */
+    tSWITCHIS = 422,               /* tSWITCHIS  */
+    tSWITCHTYPE = 423,             /* tSWITCHTYPE  */
+    tTHREADING = 424,              /* tTHREADING  */
+    tTRANSMITAS = 425,             /* tTRANSMITAS  */
+    tTRUE = 426,                   /* tTRUE  */
+    tTYPEDEF = 427,                /* tTYPEDEF  */
+    tUIDEFAULT = 428,              /* tUIDEFAULT  */
+    tUNION = 429,                  /* tUNION  */
+    tUNIQUE = 430,                 /* tUNIQUE  */
+    tUNSIGNED = 431,               /* tUNSIGNED  */
+    tUSESGETLASTERROR = 432,       /* tUSESGETLASTERROR  */
+    tUSERMARSHAL = 433,            /* tUSERMARSHAL  */
+    tUUID = 434,                   /* tUUID  */
+    tV1ENUM = 435,                 /* tV1ENUM  */
+    tVARARG = 436,                 /* tVARARG  */
+    tVERSION = 437,                /* tVERSION  */
+    tVIPROGID = 438,               /* tVIPROGID  */
+    tVOID = 439,                   /* tVOID  */
+    tWCHAR = 440,                  /* tWCHAR  */
+    tWIREMARSHAL = 441,            /* tWIREMARSHAL  */
+    tAPARTMENT = 442,              /* tAPARTMENT  */
+    tNEUTRAL = 443,                /* tNEUTRAL  */
+    tSINGLE = 444,                 /* tSINGLE  */
+    tFREE = 445,                   /* tFREE  */
+    tBOTH = 446,                   /* tBOTH  */
+    CAST = 447,                    /* CAST  */
+    PPTR = 448,                    /* PPTR  */
+    POS = 449,                     /* POS  */
+    NEG = 450,                     /* NEG  */
+    ADDRESSOF = 451                /* ADDRESSOF  */
   };
   typedef enum yytokentype yytoken_kind_t;
 #endif
@@ -443,7 +452,7 @@
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 133 "tools/widl/parser.y"
+#line 135 "tools/widl/parser.y"
 
 	attr_t *attr;
 	attr_list_t *attr_list;
@@ -472,7 +481,7 @@
 	enum type_qualifier type_qualifier;
 	enum function_specifier function_specifier;
 
-#line 476 "tools/widl/parser.tab.c"
+#line 485 "tools/widl/parser.tab.c"
 
 };
 typedef union YYSTYPE YYSTYPE;
@@ -517,311 +526,323 @@
   YYSYMBOL_LOGICALAND = 24,                /* LOGICALAND  */
   YYSYMBOL_ELLIPSIS = 25,                  /* ELLIPSIS  */
   YYSYMBOL_tAGGREGATABLE = 26,             /* tAGGREGATABLE  */
-  YYSYMBOL_tALLOCATE = 27,                 /* tALLOCATE  */
-  YYSYMBOL_tANNOTATION = 28,               /* tANNOTATION  */
-  YYSYMBOL_tAPPOBJECT = 29,                /* tAPPOBJECT  */
-  YYSYMBOL_tASYNC = 30,                    /* tASYNC  */
-  YYSYMBOL_tASYNCUUID = 31,                /* tASYNCUUID  */
-  YYSYMBOL_tAUTOHANDLE = 32,               /* tAUTOHANDLE  */
-  YYSYMBOL_tBINDABLE = 33,                 /* tBINDABLE  */
-  YYSYMBOL_tBOOLEAN = 34,                  /* tBOOLEAN  */
-  YYSYMBOL_tBROADCAST = 35,                /* tBROADCAST  */
-  YYSYMBOL_tBYTE = 36,                     /* tBYTE  */
-  YYSYMBOL_tBYTECOUNT = 37,                /* tBYTECOUNT  */
-  YYSYMBOL_tCALLAS = 38,                   /* tCALLAS  */
-  YYSYMBOL_tCALLBACK = 39,                 /* tCALLBACK  */
-  YYSYMBOL_tCASE = 40,                     /* tCASE  */
-  YYSYMBOL_tCDECL = 41,                    /* tCDECL  */
-  YYSYMBOL_tCHAR = 42,                     /* tCHAR  */
-  YYSYMBOL_tCOCLASS = 43,                  /* tCOCLASS  */
-  YYSYMBOL_tCODE = 44,                     /* tCODE  */
-  YYSYMBOL_tCOMMSTATUS = 45,               /* tCOMMSTATUS  */
-  YYSYMBOL_tCONST = 46,                    /* tCONST  */
-  YYSYMBOL_tCONTEXTHANDLE = 47,            /* tCONTEXTHANDLE  */
-  YYSYMBOL_tCONTEXTHANDLENOSERIALIZE = 48, /* tCONTEXTHANDLENOSERIALIZE  */
-  YYSYMBOL_tCONTEXTHANDLESERIALIZE = 49,   /* tCONTEXTHANDLESERIALIZE  */
-  YYSYMBOL_tCONTROL = 50,                  /* tCONTROL  */
-  YYSYMBOL_tCPPQUOTE = 51,                 /* tCPPQUOTE  */
-  YYSYMBOL_tDECODE = 52,                   /* tDECODE  */
-  YYSYMBOL_tDEFAULT = 53,                  /* tDEFAULT  */
-  YYSYMBOL_tDEFAULTBIND = 54,              /* tDEFAULTBIND  */
-  YYSYMBOL_tDEFAULTCOLLELEM = 55,          /* tDEFAULTCOLLELEM  */
-  YYSYMBOL_tDEFAULTVALUE = 56,             /* tDEFAULTVALUE  */
-  YYSYMBOL_tDEFAULTVTABLE = 57,            /* tDEFAULTVTABLE  */
-  YYSYMBOL_tDISABLECONSISTENCYCHECK = 58,  /* tDISABLECONSISTENCYCHECK  */
-  YYSYMBOL_tDISPLAYBIND = 59,              /* tDISPLAYBIND  */
-  YYSYMBOL_tDISPINTERFACE = 60,            /* tDISPINTERFACE  */
-  YYSYMBOL_tDLLNAME = 61,                  /* tDLLNAME  */
-  YYSYMBOL_tDOUBLE = 62,                   /* tDOUBLE  */
-  YYSYMBOL_tDUAL = 63,                     /* tDUAL  */
-  YYSYMBOL_tENABLEALLOCATE = 64,           /* tENABLEALLOCATE  */
-  YYSYMBOL_tENCODE = 65,                   /* tENCODE  */
-  YYSYMBOL_tENDPOINT = 66,                 /* tENDPOINT  */
-  YYSYMBOL_tENTRY = 67,                    /* tENTRY  */
-  YYSYMBOL_tENUM = 68,                     /* tENUM  */
-  YYSYMBOL_tERRORSTATUST = 69,             /* tERRORSTATUST  */
-  YYSYMBOL_tEXPLICITHANDLE = 70,           /* tEXPLICITHANDLE  */
-  YYSYMBOL_tEXTERN = 71,                   /* tEXTERN  */
-  YYSYMBOL_tFALSE = 72,                    /* tFALSE  */
-  YYSYMBOL_tFASTCALL = 73,                 /* tFASTCALL  */
-  YYSYMBOL_tFAULTSTATUS = 74,              /* tFAULTSTATUS  */
-  YYSYMBOL_tFLOAT = 75,                    /* tFLOAT  */
-  YYSYMBOL_tFORCEALLOCATE = 76,            /* tFORCEALLOCATE  */
-  YYSYMBOL_tHANDLE = 77,                   /* tHANDLE  */
-  YYSYMBOL_tHANDLET = 78,                  /* tHANDLET  */
-  YYSYMBOL_tHELPCONTEXT = 79,              /* tHELPCONTEXT  */
-  YYSYMBOL_tHELPFILE = 80,                 /* tHELPFILE  */
-  YYSYMBOL_tHELPSTRING = 81,               /* tHELPSTRING  */
-  YYSYMBOL_tHELPSTRINGCONTEXT = 82,        /* tHELPSTRINGCONTEXT  */
-  YYSYMBOL_tHELPSTRINGDLL = 83,            /* tHELPSTRINGDLL  */
-  YYSYMBOL_tHIDDEN = 84,                   /* tHIDDEN  */
-  YYSYMBOL_tHYPER = 85,                    /* tHYPER  */
-  YYSYMBOL_tID = 86,                       /* tID  */
-  YYSYMBOL_tIDEMPOTENT = 87,               /* tIDEMPOTENT  */
-  YYSYMBOL_tIGNORE = 88,                   /* tIGNORE  */
-  YYSYMBOL_tIIDIS = 89,                    /* tIIDIS  */
-  YYSYMBOL_tIMMEDIATEBIND = 90,            /* tIMMEDIATEBIND  */
-  YYSYMBOL_tIMPLICITHANDLE = 91,           /* tIMPLICITHANDLE  */
-  YYSYMBOL_tIMPORT = 92,                   /* tIMPORT  */
-  YYSYMBOL_tIMPORTLIB = 93,                /* tIMPORTLIB  */
-  YYSYMBOL_tIN = 94,                       /* tIN  */
-  YYSYMBOL_tIN_LINE = 95,                  /* tIN_LINE  */
-  YYSYMBOL_tINLINE = 96,                   /* tINLINE  */
-  YYSYMBOL_tINPUTSYNC = 97,                /* tINPUTSYNC  */
-  YYSYMBOL_tINT = 98,                      /* tINT  */
-  YYSYMBOL_tINT32 = 99,                    /* tINT32  */
-  YYSYMBOL_tINT3264 = 100,                 /* tINT3264  */
-  YYSYMBOL_tINT64 = 101,                   /* tINT64  */
-  YYSYMBOL_tINTERFACE = 102,               /* tINTERFACE  */
-  YYSYMBOL_tLCID = 103,                    /* tLCID  */
-  YYSYMBOL_tLENGTHIS = 104,                /* tLENGTHIS  */
-  YYSYMBOL_tLIBRARY = 105,                 /* tLIBRARY  */
-  YYSYMBOL_tLICENSED = 106,                /* tLICENSED  */
-  YYSYMBOL_tLOCAL = 107,                   /* tLOCAL  */
-  YYSYMBOL_tLONG = 108,                    /* tLONG  */
-  YYSYMBOL_tMAYBE = 109,                   /* tMAYBE  */
-  YYSYMBOL_tMESSAGE = 110,                 /* tMESSAGE  */
-  YYSYMBOL_tMETHODS = 111,                 /* tMETHODS  */
-  YYSYMBOL_tMODULE = 112,                  /* tMODULE  */
-  YYSYMBOL_tNAMESPACE = 113,               /* tNAMESPACE  */
-  YYSYMBOL_tNOCODE = 114,                  /* tNOCODE  */
-  YYSYMBOL_tNONBROWSABLE = 115,            /* tNONBROWSABLE  */
-  YYSYMBOL_tNONCREATABLE = 116,            /* tNONCREATABLE  */
-  YYSYMBOL_tNONEXTENSIBLE = 117,           /* tNONEXTENSIBLE  */
-  YYSYMBOL_tNOTIFY = 118,                  /* tNOTIFY  */
-  YYSYMBOL_tNOTIFYFLAG = 119,              /* tNOTIFYFLAG  */
-  YYSYMBOL_tNULL = 120,                    /* tNULL  */
-  YYSYMBOL_tOBJECT = 121,                  /* tOBJECT  */
-  YYSYMBOL_tODL = 122,                     /* tODL  */
-  YYSYMBOL_tOLEAUTOMATION = 123,           /* tOLEAUTOMATION  */
-  YYSYMBOL_tOPTIMIZE = 124,                /* tOPTIMIZE  */
-  YYSYMBOL_tOPTIONAL = 125,                /* tOPTIONAL  */
-  YYSYMBOL_tOUT = 126,                     /* tOUT  */
-  YYSYMBOL_tPARTIALIGNORE = 127,           /* tPARTIALIGNORE  */
-  YYSYMBOL_tPASCAL = 128,                  /* tPASCAL  */
-  YYSYMBOL_tPOINTERDEFAULT = 129,          /* tPOINTERDEFAULT  */
-  YYSYMBOL_tPRAGMA_WARNING = 130,          /* tPRAGMA_WARNING  */
-  YYSYMBOL_tPROGID = 131,                  /* tPROGID  */
-  YYSYMBOL_tPROPERTIES = 132,              /* tPROPERTIES  */
-  YYSYMBOL_tPROPGET = 133,                 /* tPROPGET  */
-  YYSYMBOL_tPROPPUT = 134,                 /* tPROPPUT  */
-  YYSYMBOL_tPROPPUTREF = 135,              /* tPROPPUTREF  */
-  YYSYMBOL_tPROXY = 136,                   /* tPROXY  */
-  YYSYMBOL_tPTR = 137,                     /* tPTR  */
-  YYSYMBOL_tPUBLIC = 138,                  /* tPUBLIC  */
-  YYSYMBOL_tRANGE = 139,                   /* tRANGE  */
-  YYSYMBOL_tREADONLY = 140,                /* tREADONLY  */
-  YYSYMBOL_tREF = 141,                     /* tREF  */
-  YYSYMBOL_tREGISTER = 142,                /* tREGISTER  */
-  YYSYMBOL_tREPRESENTAS = 143,             /* tREPRESENTAS  */
-  YYSYMBOL_tREQUESTEDIT = 144,             /* tREQUESTEDIT  */
-  YYSYMBOL_tRESTRICTED = 145,              /* tRESTRICTED  */
-  YYSYMBOL_tRETVAL = 146,                  /* tRETVAL  */
-  YYSYMBOL_tSAFEARRAY = 147,               /* tSAFEARRAY  */
-  YYSYMBOL_tSHORT = 148,                   /* tSHORT  */
-  YYSYMBOL_tSIGNED = 149,                  /* tSIGNED  */
-  YYSYMBOL_tSIZEIS = 150,                  /* tSIZEIS  */
-  YYSYMBOL_tSIZEOF = 151,                  /* tSIZEOF  */
-  YYSYMBOL_tSMALL = 152,                   /* tSMALL  */
-  YYSYMBOL_tSOURCE = 153,                  /* tSOURCE  */
-  YYSYMBOL_tSTATIC = 154,                  /* tSTATIC  */
-  YYSYMBOL_tSTDCALL = 155,                 /* tSTDCALL  */
-  YYSYMBOL_tSTRICTCONTEXTHANDLE = 156,     /* tSTRICTCONTEXTHANDLE  */
-  YYSYMBOL_tSTRING = 157,                  /* tSTRING  */
-  YYSYMBOL_tSTRUCT = 158,                  /* tSTRUCT  */
-  YYSYMBOL_tSWITCH = 159,                  /* tSWITCH  */
-  YYSYMBOL_tSWITCHIS = 160,                /* tSWITCHIS  */
-  YYSYMBOL_tSWITCHTYPE = 161,              /* tSWITCHTYPE  */
-  YYSYMBOL_tTHREADING = 162,               /* tTHREADING  */
-  YYSYMBOL_tTRANSMITAS = 163,              /* tTRANSMITAS  */
-  YYSYMBOL_tTRUE = 164,                    /* tTRUE  */
-  YYSYMBOL_tTYPEDEF = 165,                 /* tTYPEDEF  */
-  YYSYMBOL_tUIDEFAULT = 166,               /* tUIDEFAULT  */
-  YYSYMBOL_tUNION = 167,                   /* tUNION  */
-  YYSYMBOL_tUNIQUE = 168,                  /* tUNIQUE  */
-  YYSYMBOL_tUNSIGNED = 169,                /* tUNSIGNED  */
-  YYSYMBOL_tUSESGETLASTERROR = 170,        /* tUSESGETLASTERROR  */
-  YYSYMBOL_tUSERMARSHAL = 171,             /* tUSERMARSHAL  */
-  YYSYMBOL_tUUID = 172,                    /* tUUID  */
-  YYSYMBOL_tV1ENUM = 173,                  /* tV1ENUM  */
-  YYSYMBOL_tVARARG = 174,                  /* tVARARG  */
-  YYSYMBOL_tVERSION = 175,                 /* tVERSION  */
-  YYSYMBOL_tVIPROGID = 176,                /* tVIPROGID  */
-  YYSYMBOL_tVOID = 177,                    /* tVOID  */
-  YYSYMBOL_tWCHAR = 178,                   /* tWCHAR  */
-  YYSYMBOL_tWIREMARSHAL = 179,             /* tWIREMARSHAL  */
-  YYSYMBOL_tAPARTMENT = 180,               /* tAPARTMENT  */
-  YYSYMBOL_tNEUTRAL = 181,                 /* tNEUTRAL  */
-  YYSYMBOL_tSINGLE = 182,                  /* tSINGLE  */
-  YYSYMBOL_tFREE = 183,                    /* tFREE  */
-  YYSYMBOL_tBOTH = 184,                    /* tBOTH  */
-  YYSYMBOL_185_ = 185,                     /* ','  */
-  YYSYMBOL_186_ = 186,                     /* '?'  */
-  YYSYMBOL_187_ = 187,                     /* ':'  */
-  YYSYMBOL_188_ = 188,                     /* '|'  */
-  YYSYMBOL_189_ = 189,                     /* '^'  */
-  YYSYMBOL_190_ = 190,                     /* '&'  */
-  YYSYMBOL_191_ = 191,                     /* '<'  */
-  YYSYMBOL_192_ = 192,                     /* '>'  */
-  YYSYMBOL_193_ = 193,                     /* '-'  */
-  YYSYMBOL_194_ = 194,                     /* '+'  */
-  YYSYMBOL_195_ = 195,                     /* '*'  */
-  YYSYMBOL_196_ = 196,                     /* '/'  */
-  YYSYMBOL_197_ = 197,                     /* '%'  */
-  YYSYMBOL_198_ = 198,                     /* '!'  */
-  YYSYMBOL_199_ = 199,                     /* '~'  */
-  YYSYMBOL_CAST = 200,                     /* CAST  */
-  YYSYMBOL_PPTR = 201,                     /* PPTR  */
-  YYSYMBOL_POS = 202,                      /* POS  */
-  YYSYMBOL_NEG = 203,                      /* NEG  */
-  YYSYMBOL_ADDRESSOF = 204,                /* ADDRESSOF  */
-  YYSYMBOL_205_ = 205,                     /* '.'  */
-  YYSYMBOL_206_ = 206,                     /* '['  */
-  YYSYMBOL_207_ = 207,                     /* ']'  */
-  YYSYMBOL_208_ = 208,                     /* '{'  */
-  YYSYMBOL_209_ = 209,                     /* '}'  */
-  YYSYMBOL_210_ = 210,                     /* ';'  */
-  YYSYMBOL_211_ = 211,                     /* '('  */
-  YYSYMBOL_212_ = 212,                     /* ')'  */
-  YYSYMBOL_213_ = 213,                     /* '='  */
-  YYSYMBOL_YYACCEPT = 214,                 /* $accept  */
-  YYSYMBOL_input = 215,                    /* input  */
-  YYSYMBOL_m_acf = 216,                    /* m_acf  */
-  YYSYMBOL_gbl_statements = 217,           /* gbl_statements  */
-  YYSYMBOL_218_1 = 218,                    /* $@1  */
-  YYSYMBOL_imp_statements = 219,           /* imp_statements  */
-  YYSYMBOL_220_2 = 220,                    /* $@2  */
-  YYSYMBOL_int_statements = 221,           /* int_statements  */
-  YYSYMBOL_semicolon_opt = 222,            /* semicolon_opt  */
-  YYSYMBOL_statement = 223,                /* statement  */
-  YYSYMBOL_pragma_warning = 224,           /* pragma_warning  */
-  YYSYMBOL_warnings = 225,                 /* warnings  */
-  YYSYMBOL_typedecl = 226,                 /* typedecl  */
-  YYSYMBOL_cppquote = 227,                 /* cppquote  */
-  YYSYMBOL_import_start = 228,             /* import_start  */
-  YYSYMBOL_import = 229,                   /* import  */
-  YYSYMBOL_importlib = 230,                /* importlib  */
-  YYSYMBOL_libraryhdr = 231,               /* libraryhdr  */
-  YYSYMBOL_library_start = 232,            /* library_start  */
-  YYSYMBOL_librarydef = 233,               /* librarydef  */
-  YYSYMBOL_m_args = 234,                   /* m_args  */
-  YYSYMBOL_arg_list = 235,                 /* arg_list  */
-  YYSYMBOL_args = 236,                     /* args  */
-  YYSYMBOL_arg = 237,                      /* arg  */
-  YYSYMBOL_array = 238,                    /* array  */
-  YYSYMBOL_m_attributes = 239,             /* m_attributes  */
-  YYSYMBOL_attributes = 240,               /* attributes  */
-  YYSYMBOL_attrib_list = 241,              /* attrib_list  */
-  YYSYMBOL_str_list = 242,                 /* str_list  */
-  YYSYMBOL_attribute = 243,                /* attribute  */
-  YYSYMBOL_uuid_string = 244,              /* uuid_string  */
-  YYSYMBOL_callconv = 245,                 /* callconv  */
-  YYSYMBOL_cases = 246,                    /* cases  */
-  YYSYMBOL_case = 247,                     /* case  */
-  YYSYMBOL_enums = 248,                    /* enums  */
-  YYSYMBOL_enum_list = 249,                /* enum_list  */
-  YYSYMBOL_enum_member = 250,              /* enum_member  */
-  YYSYMBOL_enum = 251,                     /* enum  */
-  YYSYMBOL_enumdef = 252,                  /* enumdef  */
-  YYSYMBOL_m_exprs = 253,                  /* m_exprs  */
-  YYSYMBOL_m_expr = 254,                   /* m_expr  */
-  YYSYMBOL_expr = 255,                     /* expr  */
-  YYSYMBOL_expr_list_int_const = 256,      /* expr_list_int_const  */
-  YYSYMBOL_expr_int_const = 257,           /* expr_int_const  */
-  YYSYMBOL_expr_const = 258,               /* expr_const  */
-  YYSYMBOL_fields = 259,                   /* fields  */
-  YYSYMBOL_field = 260,                    /* field  */
-  YYSYMBOL_ne_union_field = 261,           /* ne_union_field  */
-  YYSYMBOL_ne_union_fields = 262,          /* ne_union_fields  */
-  YYSYMBOL_union_field = 263,              /* union_field  */
-  YYSYMBOL_s_field = 264,                  /* s_field  */
-  YYSYMBOL_funcdef = 265,                  /* funcdef  */
-  YYSYMBOL_declaration = 266,              /* declaration  */
-  YYSYMBOL_m_ident = 267,                  /* m_ident  */
-  YYSYMBOL_t_ident = 268,                  /* t_ident  */
-  YYSYMBOL_ident = 269,                    /* ident  */
-  YYSYMBOL_base_type = 270,                /* base_type  */
-  YYSYMBOL_m_int = 271,                    /* m_int  */
-  YYSYMBOL_int_std = 272,                  /* int_std  */
-  YYSYMBOL_qualified_seq = 273,            /* qualified_seq  */
-  YYSYMBOL_274_3 = 274,                    /* $@3  */
-  YYSYMBOL_qualified_type = 275,           /* qualified_type  */
-  YYSYMBOL_276_4 = 276,                    /* $@4  */
-  YYSYMBOL_coclass = 277,                  /* coclass  */
-  YYSYMBOL_coclasshdr = 278,               /* coclasshdr  */
-  YYSYMBOL_coclassdef = 279,               /* coclassdef  */
-  YYSYMBOL_namespacedef = 280,             /* namespacedef  */
-  YYSYMBOL_coclass_ints = 281,             /* coclass_ints  */
-  YYSYMBOL_coclass_int = 282,              /* coclass_int  */
-  YYSYMBOL_dispinterface = 283,            /* dispinterface  */
-  YYSYMBOL_dispinterfacehdr = 284,         /* dispinterfacehdr  */
-  YYSYMBOL_dispint_props = 285,            /* dispint_props  */
-  YYSYMBOL_dispint_meths = 286,            /* dispint_meths  */
-  YYSYMBOL_dispinterfacedef = 287,         /* dispinterfacedef  */
-  YYSYMBOL_inherit = 288,                  /* inherit  */
-  YYSYMBOL_interface = 289,                /* interface  */
-  YYSYMBOL_interfacehdr = 290,             /* interfacehdr  */
-  YYSYMBOL_interfacedef = 291,             /* interfacedef  */
-  YYSYMBOL_interfacedec = 292,             /* interfacedec  */
-  YYSYMBOL_module = 293,                   /* module  */
-  YYSYMBOL_modulehdr = 294,                /* modulehdr  */
-  YYSYMBOL_moduledef = 295,                /* moduledef  */
-  YYSYMBOL_storage_cls_spec = 296,         /* storage_cls_spec  */
-  YYSYMBOL_function_specifier = 297,       /* function_specifier  */
-  YYSYMBOL_type_qualifier = 298,           /* type_qualifier  */
-  YYSYMBOL_m_type_qual_list = 299,         /* m_type_qual_list  */
-  YYSYMBOL_decl_spec = 300,                /* decl_spec  */
-  YYSYMBOL_m_decl_spec_no_type = 301,      /* m_decl_spec_no_type  */
-  YYSYMBOL_decl_spec_no_type = 302,        /* decl_spec_no_type  */
-  YYSYMBOL_declarator = 303,               /* declarator  */
-  YYSYMBOL_direct_declarator = 304,        /* direct_declarator  */
-  YYSYMBOL_abstract_declarator = 305,      /* abstract_declarator  */
-  YYSYMBOL_abstract_declarator_no_direct = 306, /* abstract_declarator_no_direct  */
-  YYSYMBOL_m_abstract_declarator = 307,    /* m_abstract_declarator  */
-  YYSYMBOL_abstract_direct_declarator = 308, /* abstract_direct_declarator  */
-  YYSYMBOL_any_declarator = 309,           /* any_declarator  */
-  YYSYMBOL_any_declarator_no_direct = 310, /* any_declarator_no_direct  */
-  YYSYMBOL_m_any_declarator = 311,         /* m_any_declarator  */
-  YYSYMBOL_any_direct_declarator = 312,    /* any_direct_declarator  */
-  YYSYMBOL_declarator_list = 313,          /* declarator_list  */
-  YYSYMBOL_m_bitfield = 314,               /* m_bitfield  */
-  YYSYMBOL_struct_declarator = 315,        /* struct_declarator  */
-  YYSYMBOL_struct_declarator_list = 316,   /* struct_declarator_list  */
-  YYSYMBOL_init_declarator = 317,          /* init_declarator  */
-  YYSYMBOL_threading_type = 318,           /* threading_type  */
-  YYSYMBOL_pointer_type = 319,             /* pointer_type  */
-  YYSYMBOL_structdef = 320,                /* structdef  */
-  YYSYMBOL_type = 321,                     /* type  */
-  YYSYMBOL_typedef = 322,                  /* typedef  */
-  YYSYMBOL_uniondef = 323,                 /* uniondef  */
-  YYSYMBOL_version = 324,                  /* version  */
-  YYSYMBOL_acf_statements = 325,           /* acf_statements  */
-  YYSYMBOL_acf_int_statements = 326,       /* acf_int_statements  */
-  YYSYMBOL_acf_int_statement = 327,        /* acf_int_statement  */
-  YYSYMBOL_acf_interface = 328,            /* acf_interface  */
-  YYSYMBOL_acf_attributes = 329,           /* acf_attributes  */
-  YYSYMBOL_acf_attribute_list = 330,       /* acf_attribute_list  */
-  YYSYMBOL_acf_attribute = 331             /* acf_attribute  */
+  YYSYMBOL_tALLNODES = 27,                 /* tALLNODES  */
+  YYSYMBOL_tALLOCATE = 28,                 /* tALLOCATE  */
+  YYSYMBOL_tANNOTATION = 29,               /* tANNOTATION  */
+  YYSYMBOL_tAPICONTRACT = 30,              /* tAPICONTRACT  */
+  YYSYMBOL_tAPPOBJECT = 31,                /* tAPPOBJECT  */
+  YYSYMBOL_tASYNC = 32,                    /* tASYNC  */
+  YYSYMBOL_tASYNCUUID = 33,                /* tASYNCUUID  */
+  YYSYMBOL_tAUTOHANDLE = 34,               /* tAUTOHANDLE  */
+  YYSYMBOL_tBINDABLE = 35,                 /* tBINDABLE  */
+  YYSYMBOL_tBOOLEAN = 36,                  /* tBOOLEAN  */
+  YYSYMBOL_tBROADCAST = 37,                /* tBROADCAST  */
+  YYSYMBOL_tBYTE = 38,                     /* tBYTE  */
+  YYSYMBOL_tBYTECOUNT = 39,                /* tBYTECOUNT  */
+  YYSYMBOL_tCALLAS = 40,                   /* tCALLAS  */
+  YYSYMBOL_tCALLBACK = 41,                 /* tCALLBACK  */
+  YYSYMBOL_tCASE = 42,                     /* tCASE  */
+  YYSYMBOL_tCDECL = 43,                    /* tCDECL  */
+  YYSYMBOL_tCHAR = 44,                     /* tCHAR  */
+  YYSYMBOL_tCOCLASS = 45,                  /* tCOCLASS  */
+  YYSYMBOL_tCODE = 46,                     /* tCODE  */
+  YYSYMBOL_tCOMMSTATUS = 47,               /* tCOMMSTATUS  */
+  YYSYMBOL_tCONST = 48,                    /* tCONST  */
+  YYSYMBOL_tCONTEXTHANDLE = 49,            /* tCONTEXTHANDLE  */
+  YYSYMBOL_tCONTEXTHANDLENOSERIALIZE = 50, /* tCONTEXTHANDLENOSERIALIZE  */
+  YYSYMBOL_tCONTEXTHANDLESERIALIZE = 51,   /* tCONTEXTHANDLESERIALIZE  */
+  YYSYMBOL_tCONTRACT = 52,                 /* tCONTRACT  */
+  YYSYMBOL_tCONTRACTVERSION = 53,          /* tCONTRACTVERSION  */
+  YYSYMBOL_tCONTROL = 54,                  /* tCONTROL  */
+  YYSYMBOL_tCPPQUOTE = 55,                 /* tCPPQUOTE  */
+  YYSYMBOL_tCUSTOM = 56,                   /* tCUSTOM  */
+  YYSYMBOL_tDECODE = 57,                   /* tDECODE  */
+  YYSYMBOL_tDEFAULT = 58,                  /* tDEFAULT  */
+  YYSYMBOL_tDEFAULTBIND = 59,              /* tDEFAULTBIND  */
+  YYSYMBOL_tDEFAULTCOLLELEM = 60,          /* tDEFAULTCOLLELEM  */
+  YYSYMBOL_tDEFAULTVALUE = 61,             /* tDEFAULTVALUE  */
+  YYSYMBOL_tDEFAULTVTABLE = 62,            /* tDEFAULTVTABLE  */
+  YYSYMBOL_tDISABLECONSISTENCYCHECK = 63,  /* tDISABLECONSISTENCYCHECK  */
+  YYSYMBOL_tDISPLAYBIND = 64,              /* tDISPLAYBIND  */
+  YYSYMBOL_tDISPINTERFACE = 65,            /* tDISPINTERFACE  */
+  YYSYMBOL_tDLLNAME = 66,                  /* tDLLNAME  */
+  YYSYMBOL_tDONTFREE = 67,                 /* tDONTFREE  */
+  YYSYMBOL_tDOUBLE = 68,                   /* tDOUBLE  */
+  YYSYMBOL_tDUAL = 69,                     /* tDUAL  */
+  YYSYMBOL_tENABLEALLOCATE = 70,           /* tENABLEALLOCATE  */
+  YYSYMBOL_tENCODE = 71,                   /* tENCODE  */
+  YYSYMBOL_tENDPOINT = 72,                 /* tENDPOINT  */
+  YYSYMBOL_tENTRY = 73,                    /* tENTRY  */
+  YYSYMBOL_tENUM = 74,                     /* tENUM  */
+  YYSYMBOL_tERRORSTATUST = 75,             /* tERRORSTATUST  */
+  YYSYMBOL_tEXPLICITHANDLE = 76,           /* tEXPLICITHANDLE  */
+  YYSYMBOL_tEXTERN = 77,                   /* tEXTERN  */
+  YYSYMBOL_tFALSE = 78,                    /* tFALSE  */
+  YYSYMBOL_tFASTCALL = 79,                 /* tFASTCALL  */
+  YYSYMBOL_tFAULTSTATUS = 80,              /* tFAULTSTATUS  */
+  YYSYMBOL_tFLOAT = 81,                    /* tFLOAT  */
+  YYSYMBOL_tFORCEALLOCATE = 82,            /* tFORCEALLOCATE  */
+  YYSYMBOL_tHANDLE = 83,                   /* tHANDLE  */
+  YYSYMBOL_tHANDLET = 84,                  /* tHANDLET  */
+  YYSYMBOL_tHELPCONTEXT = 85,              /* tHELPCONTEXT  */
+  YYSYMBOL_tHELPFILE = 86,                 /* tHELPFILE  */
+  YYSYMBOL_tHELPSTRING = 87,               /* tHELPSTRING  */
+  YYSYMBOL_tHELPSTRINGCONTEXT = 88,        /* tHELPSTRINGCONTEXT  */
+  YYSYMBOL_tHELPSTRINGDLL = 89,            /* tHELPSTRINGDLL  */
+  YYSYMBOL_tHIDDEN = 90,                   /* tHIDDEN  */
+  YYSYMBOL_tHYPER = 91,                    /* tHYPER  */
+  YYSYMBOL_tID = 92,                       /* tID  */
+  YYSYMBOL_tIDEMPOTENT = 93,               /* tIDEMPOTENT  */
+  YYSYMBOL_tIGNORE = 94,                   /* tIGNORE  */
+  YYSYMBOL_tIIDIS = 95,                    /* tIIDIS  */
+  YYSYMBOL_tIMMEDIATEBIND = 96,            /* tIMMEDIATEBIND  */
+  YYSYMBOL_tIMPLICITHANDLE = 97,           /* tIMPLICITHANDLE  */
+  YYSYMBOL_tIMPORT = 98,                   /* tIMPORT  */
+  YYSYMBOL_tIMPORTLIB = 99,                /* tIMPORTLIB  */
+  YYSYMBOL_tIN = 100,                      /* tIN  */
+  YYSYMBOL_tIN_LINE = 101,                 /* tIN_LINE  */
+  YYSYMBOL_tINLINE = 102,                  /* tINLINE  */
+  YYSYMBOL_tINPUTSYNC = 103,               /* tINPUTSYNC  */
+  YYSYMBOL_tINT = 104,                     /* tINT  */
+  YYSYMBOL_tINT32 = 105,                   /* tINT32  */
+  YYSYMBOL_tINT3264 = 106,                 /* tINT3264  */
+  YYSYMBOL_tINT64 = 107,                   /* tINT64  */
+  YYSYMBOL_tINTERFACE = 108,               /* tINTERFACE  */
+  YYSYMBOL_tLCID = 109,                    /* tLCID  */
+  YYSYMBOL_tLENGTHIS = 110,                /* tLENGTHIS  */
+  YYSYMBOL_tLIBRARY = 111,                 /* tLIBRARY  */
+  YYSYMBOL_tLICENSED = 112,                /* tLICENSED  */
+  YYSYMBOL_tLOCAL = 113,                   /* tLOCAL  */
+  YYSYMBOL_tLONG = 114,                    /* tLONG  */
+  YYSYMBOL_tMAYBE = 115,                   /* tMAYBE  */
+  YYSYMBOL_tMESSAGE = 116,                 /* tMESSAGE  */
+  YYSYMBOL_tMETHODS = 117,                 /* tMETHODS  */
+  YYSYMBOL_tMODULE = 118,                  /* tMODULE  */
+  YYSYMBOL_tNAMESPACE = 119,               /* tNAMESPACE  */
+  YYSYMBOL_tNOCODE = 120,                  /* tNOCODE  */
+  YYSYMBOL_tNONBROWSABLE = 121,            /* tNONBROWSABLE  */
+  YYSYMBOL_tNONCREATABLE = 122,            /* tNONCREATABLE  */
+  YYSYMBOL_tNONEXTENSIBLE = 123,           /* tNONEXTENSIBLE  */
+  YYSYMBOL_tNOTIFY = 124,                  /* tNOTIFY  */
+  YYSYMBOL_tNOTIFYFLAG = 125,              /* tNOTIFYFLAG  */
+  YYSYMBOL_tNULL = 126,                    /* tNULL  */
+  YYSYMBOL_tOBJECT = 127,                  /* tOBJECT  */
+  YYSYMBOL_tODL = 128,                     /* tODL  */
+  YYSYMBOL_tOLEAUTOMATION = 129,           /* tOLEAUTOMATION  */
+  YYSYMBOL_tOPTIMIZE = 130,                /* tOPTIMIZE  */
+  YYSYMBOL_tOPTIONAL = 131,                /* tOPTIONAL  */
+  YYSYMBOL_tOUT = 132,                     /* tOUT  */
+  YYSYMBOL_tPARTIALIGNORE = 133,           /* tPARTIALIGNORE  */
+  YYSYMBOL_tPASCAL = 134,                  /* tPASCAL  */
+  YYSYMBOL_tPOINTERDEFAULT = 135,          /* tPOINTERDEFAULT  */
+  YYSYMBOL_tPRAGMA_WARNING = 136,          /* tPRAGMA_WARNING  */
+  YYSYMBOL_tPROGID = 137,                  /* tPROGID  */
+  YYSYMBOL_tPROPERTIES = 138,              /* tPROPERTIES  */
+  YYSYMBOL_tPROPGET = 139,                 /* tPROPGET  */
+  YYSYMBOL_tPROPPUT = 140,                 /* tPROPPUT  */
+  YYSYMBOL_tPROPPUTREF = 141,              /* tPROPPUTREF  */
+  YYSYMBOL_tPROXY = 142,                   /* tPROXY  */
+  YYSYMBOL_tPTR = 143,                     /* tPTR  */
+  YYSYMBOL_tPUBLIC = 144,                  /* tPUBLIC  */
+  YYSYMBOL_tRANGE = 145,                   /* tRANGE  */
+  YYSYMBOL_tREADONLY = 146,                /* tREADONLY  */
+  YYSYMBOL_tREF = 147,                     /* tREF  */
+  YYSYMBOL_tREGISTER = 148,                /* tREGISTER  */
+  YYSYMBOL_tREPRESENTAS = 149,             /* tREPRESENTAS  */
+  YYSYMBOL_tREQUESTEDIT = 150,             /* tREQUESTEDIT  */
+  YYSYMBOL_tRESTRICTED = 151,              /* tRESTRICTED  */
+  YYSYMBOL_tRETVAL = 152,                  /* tRETVAL  */
+  YYSYMBOL_tSAFEARRAY = 153,               /* tSAFEARRAY  */
+  YYSYMBOL_tSHORT = 154,                   /* tSHORT  */
+  YYSYMBOL_tSIGNED = 155,                  /* tSIGNED  */
+  YYSYMBOL_tSINGLENODE = 156,              /* tSINGLENODE  */
+  YYSYMBOL_tSIZEIS = 157,                  /* tSIZEIS  */
+  YYSYMBOL_tSIZEOF = 158,                  /* tSIZEOF  */
+  YYSYMBOL_tSMALL = 159,                   /* tSMALL  */
+  YYSYMBOL_tSOURCE = 160,                  /* tSOURCE  */
+  YYSYMBOL_tSTATIC = 161,                  /* tSTATIC  */
+  YYSYMBOL_tSTDCALL = 162,                 /* tSTDCALL  */
+  YYSYMBOL_tSTRICTCONTEXTHANDLE = 163,     /* tSTRICTCONTEXTHANDLE  */
+  YYSYMBOL_tSTRING = 164,                  /* tSTRING  */
+  YYSYMBOL_tSTRUCT = 165,                  /* tSTRUCT  */
+  YYSYMBOL_tSWITCH = 166,                  /* tSWITCH  */
+  YYSYMBOL_tSWITCHIS = 167,                /* tSWITCHIS  */
+  YYSYMBOL_tSWITCHTYPE = 168,              /* tSWITCHTYPE  */
+  YYSYMBOL_tTHREADING = 169,               /* tTHREADING  */
+  YYSYMBOL_tTRANSMITAS = 170,              /* tTRANSMITAS  */
+  YYSYMBOL_tTRUE = 171,                    /* tTRUE  */
+  YYSYMBOL_tTYPEDEF = 172,                 /* tTYPEDEF  */
+  YYSYMBOL_tUIDEFAULT = 173,               /* tUIDEFAULT  */
+  YYSYMBOL_tUNION = 174,                   /* tUNION  */
+  YYSYMBOL_tUNIQUE = 175,                  /* tUNIQUE  */
+  YYSYMBOL_tUNSIGNED = 176,                /* tUNSIGNED  */
+  YYSYMBOL_tUSESGETLASTERROR = 177,        /* tUSESGETLASTERROR  */
+  YYSYMBOL_tUSERMARSHAL = 178,             /* tUSERMARSHAL  */
+  YYSYMBOL_tUUID = 179,                    /* tUUID  */
+  YYSYMBOL_tV1ENUM = 180,                  /* tV1ENUM  */
+  YYSYMBOL_tVARARG = 181,                  /* tVARARG  */
+  YYSYMBOL_tVERSION = 182,                 /* tVERSION  */
+  YYSYMBOL_tVIPROGID = 183,                /* tVIPROGID  */
+  YYSYMBOL_tVOID = 184,                    /* tVOID  */
+  YYSYMBOL_tWCHAR = 185,                   /* tWCHAR  */
+  YYSYMBOL_tWIREMARSHAL = 186,             /* tWIREMARSHAL  */
+  YYSYMBOL_tAPARTMENT = 187,               /* tAPARTMENT  */
+  YYSYMBOL_tNEUTRAL = 188,                 /* tNEUTRAL  */
+  YYSYMBOL_tSINGLE = 189,                  /* tSINGLE  */
+  YYSYMBOL_tFREE = 190,                    /* tFREE  */
+  YYSYMBOL_tBOTH = 191,                    /* tBOTH  */
+  YYSYMBOL_192_ = 192,                     /* ','  */
+  YYSYMBOL_193_ = 193,                     /* '?'  */
+  YYSYMBOL_194_ = 194,                     /* ':'  */
+  YYSYMBOL_195_ = 195,                     /* '|'  */
+  YYSYMBOL_196_ = 196,                     /* '^'  */
+  YYSYMBOL_197_ = 197,                     /* '&'  */
+  YYSYMBOL_198_ = 198,                     /* '<'  */
+  YYSYMBOL_199_ = 199,                     /* '>'  */
+  YYSYMBOL_200_ = 200,                     /* '-'  */
+  YYSYMBOL_201_ = 201,                     /* '+'  */
+  YYSYMBOL_202_ = 202,                     /* '*'  */
+  YYSYMBOL_203_ = 203,                     /* '/'  */
+  YYSYMBOL_204_ = 204,                     /* '%'  */
+  YYSYMBOL_205_ = 205,                     /* '!'  */
+  YYSYMBOL_206_ = 206,                     /* '~'  */
+  YYSYMBOL_CAST = 207,                     /* CAST  */
+  YYSYMBOL_PPTR = 208,                     /* PPTR  */
+  YYSYMBOL_POS = 209,                      /* POS  */
+  YYSYMBOL_NEG = 210,                      /* NEG  */
+  YYSYMBOL_ADDRESSOF = 211,                /* ADDRESSOF  */
+  YYSYMBOL_212_ = 212,                     /* '.'  */
+  YYSYMBOL_213_ = 213,                     /* '['  */
+  YYSYMBOL_214_ = 214,                     /* ']'  */
+  YYSYMBOL_215_ = 215,                     /* '{'  */
+  YYSYMBOL_216_ = 216,                     /* '}'  */
+  YYSYMBOL_217_ = 217,                     /* ';'  */
+  YYSYMBOL_218_ = 218,                     /* '('  */
+  YYSYMBOL_219_ = 219,                     /* ')'  */
+  YYSYMBOL_220_ = 220,                     /* '='  */
+  YYSYMBOL_YYACCEPT = 221,                 /* $accept  */
+  YYSYMBOL_input = 222,                    /* input  */
+  YYSYMBOL_m_acf = 223,                    /* m_acf  */
+  YYSYMBOL_gbl_statements = 224,           /* gbl_statements  */
+  YYSYMBOL_225_1 = 225,                    /* $@1  */
+  YYSYMBOL_imp_statements = 226,           /* imp_statements  */
+  YYSYMBOL_227_2 = 227,                    /* $@2  */
+  YYSYMBOL_int_statements = 228,           /* int_statements  */
+  YYSYMBOL_semicolon_opt = 229,            /* semicolon_opt  */
+  YYSYMBOL_statement = 230,                /* statement  */
+  YYSYMBOL_pragma_warning = 231,           /* pragma_warning  */
+  YYSYMBOL_warnings = 232,                 /* warnings  */
+  YYSYMBOL_typedecl = 233,                 /* typedecl  */
+  YYSYMBOL_cppquote = 234,                 /* cppquote  */
+  YYSYMBOL_import_start = 235,             /* import_start  */
+  YYSYMBOL_import = 236,                   /* import  */
+  YYSYMBOL_importlib = 237,                /* importlib  */
+  YYSYMBOL_libraryhdr = 238,               /* libraryhdr  */
+  YYSYMBOL_library_start = 239,            /* library_start  */
+  YYSYMBOL_librarydef = 240,               /* librarydef  */
+  YYSYMBOL_m_args = 241,                   /* m_args  */
+  YYSYMBOL_arg_list = 242,                 /* arg_list  */
+  YYSYMBOL_args = 243,                     /* args  */
+  YYSYMBOL_arg = 244,                      /* arg  */
+  YYSYMBOL_array = 245,                    /* array  */
+  YYSYMBOL_m_attributes = 246,             /* m_attributes  */
+  YYSYMBOL_attributes = 247,               /* attributes  */
+  YYSYMBOL_attrib_list = 248,              /* attrib_list  */
+  YYSYMBOL_str_list = 249,                 /* str_list  */
+  YYSYMBOL_contract_ver = 250,             /* contract_ver  */
+  YYSYMBOL_contract_req = 251,             /* contract_req  */
+  YYSYMBOL_attribute = 252,                /* attribute  */
+  YYSYMBOL_uuid_string = 253,              /* uuid_string  */
+  YYSYMBOL_callconv = 254,                 /* callconv  */
+  YYSYMBOL_cases = 255,                    /* cases  */
+  YYSYMBOL_case = 256,                     /* case  */
+  YYSYMBOL_enums = 257,                    /* enums  */
+  YYSYMBOL_enum_list = 258,                /* enum_list  */
+  YYSYMBOL_enum_member = 259,              /* enum_member  */
+  YYSYMBOL_enum = 260,                     /* enum  */
+  YYSYMBOL_enumdef = 261,                  /* enumdef  */
+  YYSYMBOL_m_exprs = 262,                  /* m_exprs  */
+  YYSYMBOL_m_expr = 263,                   /* m_expr  */
+  YYSYMBOL_expr = 264,                     /* expr  */
+  YYSYMBOL_expr_list_int_const = 265,      /* expr_list_int_const  */
+  YYSYMBOL_expr_int_const = 266,           /* expr_int_const  */
+  YYSYMBOL_expr_const = 267,               /* expr_const  */
+  YYSYMBOL_fields = 268,                   /* fields  */
+  YYSYMBOL_field = 269,                    /* field  */
+  YYSYMBOL_ne_union_field = 270,           /* ne_union_field  */
+  YYSYMBOL_ne_union_fields = 271,          /* ne_union_fields  */
+  YYSYMBOL_union_field = 272,              /* union_field  */
+  YYSYMBOL_s_field = 273,                  /* s_field  */
+  YYSYMBOL_funcdef = 274,                  /* funcdef  */
+  YYSYMBOL_declaration = 275,              /* declaration  */
+  YYSYMBOL_m_ident = 276,                  /* m_ident  */
+  YYSYMBOL_t_ident = 277,                  /* t_ident  */
+  YYSYMBOL_ident = 278,                    /* ident  */
+  YYSYMBOL_base_type = 279,                /* base_type  */
+  YYSYMBOL_m_int = 280,                    /* m_int  */
+  YYSYMBOL_int_std = 281,                  /* int_std  */
+  YYSYMBOL_qualified_seq = 282,            /* qualified_seq  */
+  YYSYMBOL_283_3 = 283,                    /* $@3  */
+  YYSYMBOL_qualified_type = 284,           /* qualified_type  */
+  YYSYMBOL_285_4 = 285,                    /* $@4  */
+  YYSYMBOL_coclass = 286,                  /* coclass  */
+  YYSYMBOL_coclasshdr = 287,               /* coclasshdr  */
+  YYSYMBOL_coclassdef = 288,               /* coclassdef  */
+  YYSYMBOL_apicontract = 289,              /* apicontract  */
+  YYSYMBOL_namespacedef = 290,             /* namespacedef  */
+  YYSYMBOL_coclass_ints = 291,             /* coclass_ints  */
+  YYSYMBOL_coclass_int = 292,              /* coclass_int  */
+  YYSYMBOL_dispinterface = 293,            /* dispinterface  */
+  YYSYMBOL_dispinterfacehdr = 294,         /* dispinterfacehdr  */
+  YYSYMBOL_dispint_props = 295,            /* dispint_props  */
+  YYSYMBOL_dispint_meths = 296,            /* dispint_meths  */
+  YYSYMBOL_dispinterfacedef = 297,         /* dispinterfacedef  */
+  YYSYMBOL_inherit = 298,                  /* inherit  */
+  YYSYMBOL_interface = 299,                /* interface  */
+  YYSYMBOL_interfacehdr = 300,             /* interfacehdr  */
+  YYSYMBOL_interfacedef = 301,             /* interfacedef  */
+  YYSYMBOL_interfacedec = 302,             /* interfacedec  */
+  YYSYMBOL_module = 303,                   /* module  */
+  YYSYMBOL_modulehdr = 304,                /* modulehdr  */
+  YYSYMBOL_moduledef = 305,                /* moduledef  */
+  YYSYMBOL_storage_cls_spec = 306,         /* storage_cls_spec  */
+  YYSYMBOL_function_specifier = 307,       /* function_specifier  */
+  YYSYMBOL_type_qualifier = 308,           /* type_qualifier  */
+  YYSYMBOL_m_type_qual_list = 309,         /* m_type_qual_list  */
+  YYSYMBOL_decl_spec = 310,                /* decl_spec  */
+  YYSYMBOL_m_decl_spec_no_type = 311,      /* m_decl_spec_no_type  */
+  YYSYMBOL_decl_spec_no_type = 312,        /* decl_spec_no_type  */
+  YYSYMBOL_declarator = 313,               /* declarator  */
+  YYSYMBOL_direct_declarator = 314,        /* direct_declarator  */
+  YYSYMBOL_abstract_declarator = 315,      /* abstract_declarator  */
+  YYSYMBOL_abstract_declarator_no_direct = 316, /* abstract_declarator_no_direct  */
+  YYSYMBOL_m_abstract_declarator = 317,    /* m_abstract_declarator  */
+  YYSYMBOL_abstract_direct_declarator = 318, /* abstract_direct_declarator  */
+  YYSYMBOL_any_declarator = 319,           /* any_declarator  */
+  YYSYMBOL_any_declarator_no_direct = 320, /* any_declarator_no_direct  */
+  YYSYMBOL_m_any_declarator = 321,         /* m_any_declarator  */
+  YYSYMBOL_any_direct_declarator = 322,    /* any_direct_declarator  */
+  YYSYMBOL_declarator_list = 323,          /* declarator_list  */
+  YYSYMBOL_m_bitfield = 324,               /* m_bitfield  */
+  YYSYMBOL_struct_declarator = 325,        /* struct_declarator  */
+  YYSYMBOL_struct_declarator_list = 326,   /* struct_declarator_list  */
+  YYSYMBOL_init_declarator = 327,          /* init_declarator  */
+  YYSYMBOL_threading_type = 328,           /* threading_type  */
+  YYSYMBOL_pointer_type = 329,             /* pointer_type  */
+  YYSYMBOL_structdef = 330,                /* structdef  */
+  YYSYMBOL_type = 331,                     /* type  */
+  YYSYMBOL_typedef = 332,                  /* typedef  */
+  YYSYMBOL_uniondef = 333,                 /* uniondef  */
+  YYSYMBOL_version = 334,                  /* version  */
+  YYSYMBOL_acf_statements = 335,           /* acf_statements  */
+  YYSYMBOL_acf_int_statements = 336,       /* acf_int_statements  */
+  YYSYMBOL_acf_int_statement = 337,        /* acf_int_statement  */
+  YYSYMBOL_acf_interface = 338,            /* acf_interface  */
+  YYSYMBOL_acf_attributes = 339,           /* acf_attributes  */
+  YYSYMBOL_acf_attribute_list = 340,       /* acf_attribute_list  */
+  YYSYMBOL_acf_attribute = 341,            /* acf_attribute  */
+  YYSYMBOL_allocate_option_list = 342,     /* allocate_option_list  */
+  YYSYMBOL_allocate_option = 343           /* allocate_option  */
 };
 typedef enum yysymbol_kind_t yysymbol_kind_t;
 
@@ -1131,19 +1152,19 @@
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   3106
+#define YYLAST   3046
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  214
+#define YYNTOKENS  221
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  118
+#define YYNNTS  123
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  418
+#define YYNRULES  434
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  731
+#define YYNSTATES  770
 
 /* YYMAXUTOK -- Last valid token kind.  */
-#define YYMAXUTOK   444
+#define YYMAXUTOK   451
 
 
 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
@@ -1160,16 +1181,16 @@
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,   198,     2,     2,     2,   197,   190,     2,
-     211,   212,   195,   194,   185,   193,   205,   196,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,   187,   210,
-     191,   213,   192,   186,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,   205,     2,     2,     2,   204,   197,     2,
+     218,   219,   202,   201,   192,   200,   212,   203,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,   194,   217,
+     198,   220,   199,   193,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,   206,     2,   207,   189,     2,     2,     2,     2,     2,
+       2,   213,     2,   214,   196,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,   208,   188,   209,   199,     2,     2,     2,
+       2,     2,     2,   215,   195,   216,   206,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -1201,55 +1222,58 @@
      155,   156,   157,   158,   159,   160,   161,   162,   163,   164,
      165,   166,   167,   168,   169,   170,   171,   172,   173,   174,
      175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
-     200,   201,   202,   203,   204
+     185,   186,   187,   188,   189,   190,   191,   207,   208,   209,
+     210,   211
 };
 
 #if YYDEBUG
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,   319,   319,   333,   333,   335,   336,   336,   338,   339,
-     340,   343,   346,   347,   348,   351,   352,   353,   353,   355,
-     356,   357,   360,   361,   362,   363,   366,   367,   370,   371,
-     375,   376,   377,   378,   379,   380,   381,   384,   395,   396,
-     400,   401,   402,   403,   404,   405,   406,   407,   408,   411,
-     413,   421,   427,   431,   432,   434,   438,   442,   443,   446,
-     447,   450,   451,   455,   460,   467,   471,   472,   475,   476,
-     480,   483,   484,   485,   488,   489,   492,   493,   494,   495,
-     496,   497,   498,   499,   500,   501,   502,   503,   504,   505,
-     506,   507,   508,   509,   510,   511,   512,   513,   514,   515,
-     516,   517,   518,   519,   520,   521,   522,   523,   524,   525,
-     526,   527,   528,   529,   530,   531,   532,   533,   534,   535,
-     536,   537,   538,   539,   540,   541,   542,   543,   544,   545,
-     546,   547,   548,   549,   550,   551,   552,   553,   554,   555,
-     556,   557,   558,   559,   560,   561,   562,   563,   564,   565,
-     566,   567,   571,   572,   573,   574,   575,   576,   577,   578,
-     579,   580,   581,   582,   583,   584,   585,   586,   587,   588,
-     589,   590,   591,   592,   593,   594,   598,   599,   604,   605,
-     606,   607,   610,   611,   614,   618,   624,   625,   626,   629,
-     633,   645,   650,   654,   659,   662,   663,   666,   667,   670,
-     671,   672,   673,   674,   675,   676,   677,   678,   679,   680,
-     681,   682,   683,   684,   685,   686,   687,   688,   689,   690,
-     691,   692,   693,   694,   695,   696,   697,   698,   699,   700,
-     701,   702,   703,   704,   705,   706,   707,   709,   711,   712,
-     715,   716,   719,   725,   731,   732,   735,   740,   747,   748,
-     751,   752,   756,   757,   760,   764,   770,   778,   782,   787,
-     788,   791,   792,   793,   796,   798,   801,   802,   803,   804,
-     805,   806,   807,   808,   809,   810,   811,   814,   815,   818,
-     819,   820,   821,   822,   823,   824,   825,   826,   830,   831,
-     831,   835,   836,   836,   839,   840,   848,   854,   858,   859,
-     862,   863,   867,   870,   871,   874,   883,   884,   887,   888,
-     891,   897,   903,   904,   907,   908,   911,   918,   927,   932,
-     936,   937,   940,   941,   944,   949,   956,   957,   958,   962,
-     966,   969,   970,   973,   974,   978,   979,   983,   984,   985,
-     989,   991,   992,   996,   997,   998,   999,  1004,  1006,  1007,
-    1012,  1014,  1018,  1019,  1024,  1025,  1026,  1027,  1031,  1039,
-    1041,  1042,  1047,  1049,  1053,  1054,  1061,  1062,  1063,  1064,
-    1065,  1069,  1076,  1077,  1080,  1081,  1084,  1091,  1092,  1097,
-    1098,  1102,  1103,  1104,  1105,  1106,  1110,  1111,  1112,  1115,
-    1118,  1119,  1120,  1121,  1122,  1123,  1124,  1125,  1126,  1127,
-    1130,  1137,  1139,  1145,  1146,  1147,  1151,  1152,  1155,  1156,
-    1159,  1164,  1172,  1173,  1176,  1177,  1180,  1181,  1182
+       0,   331,   331,   345,   345,   347,   348,   348,   350,   351,
+     352,   355,   358,   360,   361,   362,   365,   366,   367,   367,
+     369,   370,   371,   374,   376,   377,   378,   379,   382,   383,
+     386,   387,   391,   392,   393,   394,   395,   396,   397,   400,
+     411,   412,   416,   417,   418,   419,   420,   421,   422,   423,
+     424,   427,   429,   437,   443,   447,   448,   450,   454,   458,
+     459,   462,   463,   466,   467,   471,   476,   483,   487,   488,
+     491,   492,   496,   499,   500,   501,   504,   505,   509,   510,
+     513,   519,   520,   521,   522,   523,   524,   525,   526,   527,
+     528,   529,   530,   531,   532,   533,   534,   535,   536,   537,
+     538,   539,   540,   541,   542,   543,   544,   545,   546,   547,
+     548,   549,   550,   551,   552,   553,   554,   555,   556,   557,
+     558,   559,   560,   561,   562,   563,   564,   565,   566,   567,
+     568,   569,   570,   571,   572,   573,   574,   575,   576,   577,
+     578,   579,   580,   581,   582,   583,   584,   585,   586,   587,
+     588,   589,   590,   591,   592,   593,   594,   595,   596,   597,
+     601,   602,   603,   604,   605,   606,   607,   608,   609,   610,
+     611,   612,   613,   614,   615,   616,   617,   618,   619,   620,
+     621,   622,   623,   624,   628,   629,   634,   635,   636,   637,
+     640,   641,   644,   648,   654,   655,   656,   659,   663,   675,
+     680,   684,   689,   692,   693,   696,   697,   700,   701,   702,
+     703,   704,   705,   706,   707,   708,   709,   710,   711,   712,
+     713,   714,   715,   716,   717,   718,   719,   720,   721,   722,
+     723,   724,   725,   726,   727,   728,   729,   730,   731,   732,
+     733,   734,   735,   736,   737,   739,   741,   742,   745,   746,
+     749,   755,   761,   762,   765,   770,   777,   778,   781,   782,
+     786,   787,   790,   794,   800,   808,   812,   817,   818,   821,
+     822,   823,   826,   828,   831,   832,   833,   834,   835,   836,
+     837,   838,   839,   840,   841,   844,   845,   848,   849,   850,
+     851,   852,   853,   854,   855,   856,   860,   861,   861,   865,
+     866,   866,   869,   870,   878,   884,   888,   895,   896,   899,
+     900,   904,   907,   908,   911,   920,   921,   924,   925,   928,
+     934,   940,   941,   944,   945,   948,   955,   964,   969,   973,
+     974,   977,   978,   981,   986,   993,   994,   995,   999,  1003,
+    1006,  1007,  1010,  1011,  1015,  1016,  1020,  1021,  1022,  1026,
+    1028,  1029,  1033,  1034,  1035,  1036,  1041,  1043,  1044,  1049,
+    1051,  1055,  1056,  1061,  1062,  1063,  1064,  1068,  1076,  1078,
+    1079,  1084,  1086,  1090,  1091,  1098,  1099,  1100,  1101,  1102,
+    1106,  1113,  1114,  1117,  1118,  1121,  1128,  1129,  1134,  1135,
+    1139,  1140,  1141,  1142,  1143,  1147,  1148,  1149,  1152,  1155,
+    1156,  1157,  1158,  1159,  1160,  1161,  1162,  1163,  1164,  1167,
+    1174,  1176,  1182,  1183,  1184,  1188,  1189,  1193,  1194,  1198,
+    1205,  1214,  1215,  1219,  1220,  1224,  1226,  1227,  1228,  1232,
+    1233,  1238,  1239,  1240,  1241
 };
 #endif
 
@@ -1270,15 +1294,16 @@
   "aSTRING", "aWSTRING", "aSQSTRING", "aUUID", "aEOF", "aACF", "SHL",
   "SHR", "MEMBERPTR", "EQUALITY", "INEQUALITY", "GREATEREQUAL",
   "LESSEQUAL", "LOGICALOR", "LOGICALAND", "ELLIPSIS", "tAGGREGATABLE",
-  "tALLOCATE", "tANNOTATION", "tAPPOBJECT", "tASYNC", "tASYNCUUID",
-  "tAUTOHANDLE", "tBINDABLE", "tBOOLEAN", "tBROADCAST", "tBYTE",
-  "tBYTECOUNT", "tCALLAS", "tCALLBACK", "tCASE", "tCDECL", "tCHAR",
-  "tCOCLASS", "tCODE", "tCOMMSTATUS", "tCONST", "tCONTEXTHANDLE",
-  "tCONTEXTHANDLENOSERIALIZE", "tCONTEXTHANDLESERIALIZE", "tCONTROL",
-  "tCPPQUOTE", "tDECODE", "tDEFAULT", "tDEFAULTBIND", "tDEFAULTCOLLELEM",
+  "tALLNODES", "tALLOCATE", "tANNOTATION", "tAPICONTRACT", "tAPPOBJECT",
+  "tASYNC", "tASYNCUUID", "tAUTOHANDLE", "tBINDABLE", "tBOOLEAN",
+  "tBROADCAST", "tBYTE", "tBYTECOUNT", "tCALLAS", "tCALLBACK", "tCASE",
+  "tCDECL", "tCHAR", "tCOCLASS", "tCODE", "tCOMMSTATUS", "tCONST",
+  "tCONTEXTHANDLE", "tCONTEXTHANDLENOSERIALIZE", "tCONTEXTHANDLESERIALIZE",
+  "tCONTRACT", "tCONTRACTVERSION", "tCONTROL", "tCPPQUOTE", "tCUSTOM",
+  "tDECODE", "tDEFAULT", "tDEFAULTBIND", "tDEFAULTCOLLELEM",
   "tDEFAULTVALUE", "tDEFAULTVTABLE", "tDISABLECONSISTENCYCHECK",
-  "tDISPLAYBIND", "tDISPINTERFACE", "tDLLNAME", "tDOUBLE", "tDUAL",
-  "tENABLEALLOCATE", "tENCODE", "tENDPOINT", "tENTRY", "tENUM",
+  "tDISPLAYBIND", "tDISPINTERFACE", "tDLLNAME", "tDONTFREE", "tDOUBLE",
+  "tDUAL", "tENABLEALLOCATE", "tENCODE", "tENDPOINT", "tENTRY", "tENUM",
   "tERRORSTATUST", "tEXPLICITHANDLE", "tEXTERN", "tFALSE", "tFASTCALL",
   "tFAULTSTATUS", "tFLOAT", "tFORCEALLOCATE", "tHANDLE", "tHANDLET",
   "tHELPCONTEXT", "tHELPFILE", "tHELPSTRING", "tHELPSTRINGCONTEXT",
@@ -1294,10 +1319,10 @@
   "tPROPERTIES", "tPROPGET", "tPROPPUT", "tPROPPUTREF", "tPROXY", "tPTR",
   "tPUBLIC", "tRANGE", "tREADONLY", "tREF", "tREGISTER", "tREPRESENTAS",
   "tREQUESTEDIT", "tRESTRICTED", "tRETVAL", "tSAFEARRAY", "tSHORT",
-  "tSIGNED", "tSIZEIS", "tSIZEOF", "tSMALL", "tSOURCE", "tSTATIC",
-  "tSTDCALL", "tSTRICTCONTEXTHANDLE", "tSTRING", "tSTRUCT", "tSWITCH",
-  "tSWITCHIS", "tSWITCHTYPE", "tTHREADING", "tTRANSMITAS", "tTRUE",
-  "tTYPEDEF", "tUIDEFAULT", "tUNION", "tUNIQUE", "tUNSIGNED",
+  "tSIGNED", "tSINGLENODE", "tSIZEIS", "tSIZEOF", "tSMALL", "tSOURCE",
+  "tSTATIC", "tSTDCALL", "tSTRICTCONTEXTHANDLE", "tSTRING", "tSTRUCT",
+  "tSWITCH", "tSWITCHIS", "tSWITCHTYPE", "tTHREADING", "tTRANSMITAS",
+  "tTRUE", "tTYPEDEF", "tUIDEFAULT", "tUNION", "tUNIQUE", "tUNSIGNED",
   "tUSESGETLASTERROR", "tUSERMARSHAL", "tUUID", "tV1ENUM", "tVARARG",
   "tVERSION", "tVIPROGID", "tVOID", "tWCHAR", "tWIREMARSHAL", "tAPARTMENT",
   "tNEUTRAL", "tSINGLE", "tFREE", "tBOTH", "','", "'?'", "':'", "'|'",
@@ -1309,17 +1334,18 @@
   "cppquote", "import_start", "import", "importlib", "libraryhdr",
   "library_start", "librarydef", "m_args", "arg_list", "args", "arg",
   "array", "m_attributes", "attributes", "attrib_list", "str_list",
-  "attribute", "uuid_string", "callconv", "cases", "case", "enums",
-  "enum_list", "enum_member", "enum", "enumdef", "m_exprs", "m_expr",
-  "expr", "expr_list_int_const", "expr_int_const", "expr_const", "fields",
-  "field", "ne_union_field", "ne_union_fields", "union_field", "s_field",
-  "funcdef", "declaration", "m_ident", "t_ident", "ident", "base_type",
-  "m_int", "int_std", "qualified_seq", "$@3", "qualified_type", "$@4",
-  "coclass", "coclasshdr", "coclassdef", "namespacedef", "coclass_ints",
-  "coclass_int", "dispinterface", "dispinterfacehdr", "dispint_props",
-  "dispint_meths", "dispinterfacedef", "inherit", "interface",
-  "interfacehdr", "interfacedef", "interfacedec", "module", "modulehdr",
-  "moduledef", "storage_cls_spec", "function_specifier", "type_qualifier",
+  "contract_ver", "contract_req", "attribute", "uuid_string", "callconv",
+  "cases", "case", "enums", "enum_list", "enum_member", "enum", "enumdef",
+  "m_exprs", "m_expr", "expr", "expr_list_int_const", "expr_int_const",
+  "expr_const", "fields", "field", "ne_union_field", "ne_union_fields",
+  "union_field", "s_field", "funcdef", "declaration", "m_ident", "t_ident",
+  "ident", "base_type", "m_int", "int_std", "qualified_seq", "$@3",
+  "qualified_type", "$@4", "coclass", "coclasshdr", "coclassdef",
+  "apicontract", "namespacedef", "coclass_ints", "coclass_int",
+  "dispinterface", "dispinterfacehdr", "dispint_props", "dispint_meths",
+  "dispinterfacedef", "inherit", "interface", "interfacehdr",
+  "interfacedef", "interfacedec", "module", "modulehdr", "moduledef",
+  "storage_cls_spec", "function_specifier", "type_qualifier",
   "m_type_qual_list", "decl_spec", "m_decl_spec_no_type",
   "decl_spec_no_type", "declarator", "direct_declarator",
   "abstract_declarator", "abstract_declarator_no_direct",
@@ -1329,7 +1355,8 @@
   "struct_declarator_list", "init_declarator", "threading_type",
   "pointer_type", "structdef", "type", "typedef", "uniondef", "version",
   "acf_statements", "acf_int_statements", "acf_int_statement",
-  "acf_interface", "acf_attributes", "acf_attribute_list", "acf_attribute", YY_NULLPTR
+  "acf_interface", "acf_attributes", "acf_attribute_list", "acf_attribute",
+  "allocate_option_list", "allocate_option", YY_NULLPTR
 };
 
 static const char *
@@ -1362,19 +1389,20 @@
      405,   406,   407,   408,   409,   410,   411,   412,   413,   414,
      415,   416,   417,   418,   419,   420,   421,   422,   423,   424,
      425,   426,   427,   428,   429,   430,   431,   432,   433,   434,
-     435,   436,   437,   438,   439,    44,    63,    58,   124,    94,
-      38,    60,    62,    45,    43,    42,    47,    37,    33,   126,
-     440,   441,   442,   443,   444,    46,    91,    93,   123,   125,
-      59,    40,    41,    61
+     435,   436,   437,   438,   439,   440,   441,   442,   443,   444,
+     445,   446,    44,    63,    58,   124,    94,    38,    60,    62,
+      45,    43,    42,    47,    37,    33,   126,   447,   448,   449,
+     450,   451,    46,    91,    93,   123,   125,    59,    40,    41,
+      61
 };
 #endif
 
-#define YYPACT_NINF (-559)
+#define YYPACT_NINF (-598)
 
 #define yypact_value_is_default(Yyn) \
   ((Yyn) == YYPACT_NINF)
 
-#define YYTABLE_NINF (-413)
+#define YYTABLE_NINF (-422)
 
 #define yytable_value_is_error(Yyn) \
   0
@@ -1383,80 +1411,83 @@
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-    -559,    54,  1627,  -559,  -559,  -559,   -68,   -64,  -559,  -559,
-    -559,   133,  -559,   -94,   204,  -559,   249,  -559,  -559,  -559,
-    -559,    28,   138,  -559,  -559,  -559,  -559,  -559,   329,    28,
-     165,   -19,  -559,     8,    28,   245,  -559,  -559,   330,   366,
-     245,  -559,  -559,  2927,  -559,  -559,  -559,    -4,  -559,  -559,
-    -559,  -559,  -559,    45,  2608,    18,    52,  -559,  -559,  -559,
-      53,    26,  -559,    61,    63,    66,    73,    74,    59,  -559,
-    -559,    87,  -559,    35,    35,    35,    80,  2774,    78,    35,
-      88,    91,  -559,   151,  -559,   -64,   202,  -559,  -559,   300,
-    -559,  -559,   162,  -559,   120,  -559,  -559,    95,  -559,  -559,
-    -559,  -559,  -559,   334,  2774,  -559,  -559,   177,   139,   -88,
-    -120,  -559,  -559,   130,  -559,  -559,   141,  -559,  -559,  -559,
-     147,   148,  -559,  -559,  -559,  -559,  -559,  -559,  -559,  -559,
-    -559,  -559,   154,  -559,  -559,  -559,   155,  -559,  -559,  -559,
-     171,   179,  -559,  -559,  -559,  -559,   184,   191,   195,   207,
-     209,  -559,   211,  -559,  -559,   213,  -559,   214,  -559,  -559,
-     215,   216,  -559,  -559,  -559,  -559,  -559,  -559,  -559,  -559,
-    -559,  -559,  -559,  -559,  -559,   217,  -559,  -559,  -559,   218,
-     220,  -559,  -559,  -559,  -559,  -559,  -559,   221,  -559,  -559,
-     222,  -559,  -559,  -559,   223,  -559,  -559,  -559,   224,   225,
-     226,   228,  -559,  -559,  -559,   229,   230,  -559,  -559,   231,
-     233,   234,  -110,  -559,  -559,  -559,  1757,   806,   208,   378,
-     383,   386,   391,   402,   235,   236,  -559,  -559,  -559,  -559,
-      80,   239,   241,  -559,  -559,  -559,  -559,  -559,   -20,  -559,
-    -559,  -559,   173,   248,  -559,  -559,  -559,  -559,  -559,  -559,
-    -559,  -559,  -559,  -559,  -559,  -559,    80,    80,  -559,   240,
-     -82,  -559,  -559,  -559,    35,  -559,  -559,  -559,   406,  -559,
-    -559,  -559,   -99,  -559,  -559,   472,   267,   -26,  -559,   293,
-     270,  -559,   272,  -559,   475,   175,   407,   665,   665,   476,
-     477,   665,   665,   478,   479,   665,   481,   665,   665,  2140,
-     665,   665,   482,   -77,   483,   665,  2774,   665,   665,  2774,
-     196,  2774,  2774,   175,   232,   485,  2774,  2927,   291,  -559,
-     288,  -559,  -559,  -559,   290,  -559,   294,  -559,  -559,  -559,
-      73,  2653,  -559,   296,  -559,  -559,  -559,  -559,   296,  -109,
-    -559,  -559,    16,  -559,   316,   -81,   297,   301,  -559,  -559,
-    1163,    46,   298,  -559,   665,   560,  2140,  -559,  -559,   303,
-    -559,  -559,   151,  -559,   312,  -559,   407,   302,   336,   309,
-    -559,   516,  -559,    42,   208,    58,   313,  -559,  -559,   317,
-     318,  -559,  -559,  -559,  -559,  -559,  -559,  -559,  -559,  -559,
-     320,  -559,   665,   665,   665,   665,   665,   665,   549,  2363,
-    -105,  -559,  2363,   325,   328,  -559,   -69,   332,   335,   337,
-     338,   339,   341,   352,  1397,   353,  2653,    31,   354,   -67,
-    -559,  2363,   369,   370,   372,   347,   374,   -62,  2145,   381,
-    -559,  -559,  -559,  -559,  -559,   384,   385,   398,   400,   319,
-    -559,   401,   403,   404,  -559,  2927,   524,  -559,  -559,  -559,
-      80,    73,    -8,  -559,  1044,  -559,   355,  2653,   331,  1476,
-     405,   454,  1282,    73,  -559,  2653,  -559,  -559,  -559,  -559,
-     632,  -559,   584,   410,   363,  -559,  -559,  -559,  -559,   425,
-    -559,  -559,    62,   665,  -559,    24,  -559,  2653,  -559,   411,
-    -559,   409,  -559,   415,  -559,  -559,  -559,  2653,    -1,    -1,
-      -1,    -1,    -1,    -1,  2233,   295,   665,   665,   591,   665,
-     665,   665,   665,   665,   665,   665,   665,   665,   665,   665,
-     665,   665,   665,   665,   665,   665,   623,   665,   665,  -559,
-    -559,  -559,   618,  -559,  -559,  -559,  -559,  -559,  -559,  -559,
-    -559,  -559,  -559,    31,  -559,  1876,  -559,    31,  -559,  -559,
-    -559,   -79,  -559,   665,  -559,  -559,  -559,  -559,   665,  -559,
-    -559,  -559,  -559,  -559,  -559,  -559,  -559,   622,  -559,  -559,
-    -559,  -559,   418,  -559,  -559,   448,  -559,  -559,  -559,  -559,
-      80,   203,  -559,  -559,  2653,   426,  -559,  -559,  -559,    73,
-    -559,  -559,  -559,  -559,  2052,   406,   431,   429,   425,  -559,
-    -559,  -559,  -559,    31,   441,   407,  -559,  -559,   295,  -559,
-    -559,  1964,  -559,   295,  -559,   442,   -60,    84,    84,  -559,
-     382,   382,   322,   322,  2259,  2382,  2342,  2415,  2441,  2389,
-     322,   322,    97,    97,    -1,    -1,    -1,  -559,  2303,  -559,
-    -559,  -559,    38,  -559,   450,    31,   451,  -559,  2140,  -559,
-    -559,   452,  -559,    73,   925,    80,  -559,  -559,  1401,  -559,
-    -559,  -559,  -559,   648,  -559,  -559,   473,  -559,   -71,  -559,
-     458,  -559,   467,    32,  -559,   469,    31,   470,  -559,   665,
-    2140,  -559,   665,  -559,  -559,    38,  -559,  -559,  -559,   471,
-    -559,  -559,  -559,  -559,    73,   460,   665,  -559,    31,  -559,
-    -559,  -559,  -559,    38,  -559,  -559,  -559,    -1,   474,  2363,
-    -559,  -559,  -559,  -559,  -559,  -559,    36,  -559,  -559,   665,
-     497,  -559,  -559,   498,   -37,   -37,  -559,  -559,   480,  -559,
-    -559
+    -598,    80,  1572,  -598,  -598,  -598,  -112,   -69,  -598,  -598,
+    -598,   175,  -598,   -79,   236,  -598,   244,  -598,  -598,  -598,
+    -598,    48,   150,  -598,  -598,  -598,  -598,  -598,   283,    48,
+     125,   -44,  -598,    -6,    48,   359,  -598,  -598,   294,   309,
+     359,  -598,  -598,  2860,  -598,  -598,  -598,   -23,  -598,  -598,
+    -598,  -598,  -598,    44,  2590,     8,     9,  -598,  -598,  -598,
+      18,    33,  -598,    46,    56,    55,    83,    62,    66,    97,
+    -598,  -598,    86,  -598,   356,   356,   356,    76,  2714,    85,
+     356,    94,    99,  -598,    21,  -598,   -69,   211,  -598,  -598,
+     310,  -598,  -598,   136,  -598,   137,  -598,  -598,   140,  -598,
+    -598,  -598,  -598,  -598,   361,  2714,  -598,  -598,   144,   152,
+    -113,   -97,  -598,  -598,   153,  -598,  -598,   154,  -598,  -598,
+    -598,   164,   165,  -598,  -598,  -598,  -598,  -598,   169,   173,
+    -598,   176,  -598,  -598,  -598,  -598,   184,  -598,  -598,  -598,
+     188,  -598,  -598,  -598,   191,   194,  -598,  -598,  -598,  -598,
+     195,   209,   210,   221,   224,  -598,   231,  -598,  -598,   233,
+    -598,   237,  -598,  -598,   238,   249,  -598,  -598,  -598,  -598,
+    -598,  -598,  -598,  -598,  -598,  -598,  -598,  -598,  -598,   251,
+    -598,  -598,  -598,   253,   258,  -598,  -598,  -598,  -598,  -598,
+    -598,   281,  -598,  -598,   282,  -598,  -598,  -598,   284,  -598,
+    -598,  -598,   285,   287,   291,   293,  -598,  -598,  -598,   296,
+     297,  -598,  -598,   298,   303,   304,   -66,  -598,  -598,  -598,
+    1705,   867,   155,   374,   373,   385,   392,   395,   402,   232,
+     245,  -598,  -598,  -598,  -598,    76,   295,   311,  -598,  -598,
+    -598,  -598,  -598,  -598,   -45,  -598,  -598,  -598,   181,   286,
+    -598,  -598,  -598,  -598,  -598,  -598,  -598,  -598,  -598,  -598,
+    -598,  -598,    76,    76,  -598,   234,  -147,  -598,  -598,  -598,
+     356,  -598,  -598,  -598,   420,   308,  -598,  -598,  -598,   -55,
+    -598,  -598,   522,   312,   -81,  -598,   335,   313,  -598,   315,
+    -598,   520,   178,   440,   728,  2625,   527,   178,   728,   525,
+     526,   728,   728,   528,   530,   728,   531,   728,   728,  2123,
+     728,   728,   533,   -48,   534,   728,  2714,   728,   728,  2714,
+     247,  2714,  2714,   178,   159,   535,  2714,  2860,   324,  -598,
+     328,  -598,  -598,  -598,   332,  -598,   333,   336,  -598,  -598,
+    -598,    62,  2625,  -598,   337,   338,  -598,  -598,  -598,  -598,
+     338,   -92,  -598,  -598,    -8,  -598,   360,   -59,   339,   340,
+    -598,  -598,  1204,    42,   341,  -598,   728,   103,  2123,  -598,
+    -598,   345,  -598,  -598,    27,    21,  -598,   344,  -598,   440,
+     346,   369,   347,  -598,   557,  -598,    -7,   155,    24,   349,
+    -598,  -598,   350,   351,  -598,  -598,  -598,  -598,  -598,  -598,
+    -598,  -598,  -598,   353,  -598,   728,   728,   728,   728,   728,
+     728,   643,  2381,  -133,  -598,   357,   386,   376,   370,   399,
+    2381,   371,   384,  -598,  -116,   387,   388,   389,   390,   393,
+     401,   404,   563,   408,  2625,   208,   409,   -83,  -598,  2381,
+     410,   411,   412,   426,   414,   -76,  2156,   415,  -598,  -598,
+    -598,  -598,  -598,   416,   417,   418,   419,   427,  -598,   421,
+     423,   425,  -598,  2860,   555,  -598,  -598,  -598,  -598,    76,
+     405,    62,    -3,  -598,  1115,  -598,   451,  2625,   430,  1448,
+     441,   506,  1239,    62,  -598,  2625,  -598,  -598,  -598,  -598,
+     663,  -598,  2293,   437,   466,  -598,  -598,  -598,  -598,  -598,
+    -598,  -598,   -68,  -598,  -598,   433,  -598,  -598,    68,   728,
+    -598,    26,  -598,  2625,  -598,   442,  -598,   443,  -598,   445,
+    -598,  -598,  -598,  2625,     2,     2,     2,     2,     2,     2,
+    2222,   239,   728,   728,   656,   728,   728,   728,   728,   728,
+     728,   728,   728,   728,   728,   728,   728,   728,   728,   728,
+     728,   728,   660,   728,   728,  -598,  -598,   527,   657,  -598,
+     728,  -598,  -598,   658,  -598,  -598,  -598,  -598,  -598,  -598,
+    -598,  -598,  -598,  -598,   208,  -598,  1794,  -598,   208,  -598,
+    -598,  -598,  -141,  -598,   728,  -598,  -598,  -598,  -598,   728,
+    -598,  -598,  -598,  -598,  -598,  -598,  -598,  -598,   662,  -598,
+    -598,  -598,  -598,   448,  -598,  -598,   484,  -598,  -598,  -598,
+    -598,  -598,    76,   229,  -598,  -598,  2625,   460,  -598,  -598,
+    -598,    62,  -598,  -598,  -598,  -598,  2034,   420,    27,  -598,
+     465,   464,   433,  -598,  -598,  -598,  -598,   208,   467,   440,
+    -598,  -598,   239,  -598,  -598,  1914,  -598,   239,  -598,   463,
+     -71,    64,    64,  -598,  1833,  1833,   413,   413,   398,  2247,
+    2360,  2411,  1564,  1893,   413,   413,   143,   143,     2,     2,
+       2,  -598,  2321,  -598,  -598,  -598,   469,  -598,  -598,    41,
+    -598,   471,   208,   475,  -598,  2123,  -598,  -598,   478,  -598,
+      62,   991,    76,  -598,  -598,  1328,  -598,  -598,  -598,  -598,
+    -598,   680,  -598,  -598,   492,  -598,   -67,  -598,   485,  -598,
+     480,   306,  -598,   482,   208,   486,  -598,   728,  2123,  -598,
+     728,  -598,  -598,  -598,    41,  -598,  -598,  -598,   487,  -598,
+    -598,  -598,  -598,    62,   490,   728,  -598,   208,  -598,  -598,
+    -598,  -598,    41,  -598,  -598,  -598,     2,   491,  2381,  -598,
+    -598,  -598,  -598,  -598,  -598,    15,  -598,  -598,   728,   509,
+    -598,  -598,   515,  -130,  -130,  -598,  -598,   495,  -598,  -598
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -1464,114 +1495,119 @@
      means the default is an error.  */
 static const yytype_int16 yydefact[] =
 {
-       5,     0,     3,     1,    35,   291,     0,   406,   274,   266,
-     285,     0,   330,     0,     0,   273,   261,   275,   326,   272,
-     276,   277,     0,   329,   279,   286,   287,   284,     0,   277,
-       0,     0,   328,     0,   277,     0,   281,   327,   261,   261,
-     271,   390,   267,    76,     2,    14,    36,     0,    30,    15,
-      33,    15,    13,     0,    69,   393,     0,   392,   268,   391,
-       0,     0,    11,     0,     0,     0,    28,     0,   312,     9,
-       8,     0,    12,   335,   335,   335,     0,     0,   395,   335,
-       0,   397,   292,     0,     4,   406,     0,   294,   295,     0,
-     303,   304,   394,   263,     0,   278,   283,     0,   314,   315,
-     282,   298,   299,     0,     0,   280,   269,   396,     0,   398,
-       0,   270,    77,     0,    79,    80,     0,    81,    82,    83,
-       0,     0,    86,    87,    88,    89,    90,    91,    92,    93,
-      94,    95,     0,    97,    98,    99,     0,   101,   102,   103,
-       0,     0,   106,   107,   108,   109,     0,     0,     0,     0,
-       0,   115,     0,   117,   118,     0,   120,     0,   122,   123,
-     126,     0,   127,   128,   129,   130,   131,   132,   133,   134,
-     135,   136,   137,   138,   139,     0,   141,   142,   143,     0,
-       0,   146,   147,   148,   149,   388,   150,     0,   152,   386,
-       0,   154,   155,   156,     0,   158,   159,   160,     0,     0,
-       0,     0,   165,   387,   166,     0,     0,   170,   171,     0,
-       0,     0,     0,    71,   175,    31,    68,    68,    68,   261,
-       0,     0,   261,   261,     0,   393,   296,   305,   316,   324,
-       0,   395,   397,    32,    10,   300,     6,   321,     0,    29,
-     319,   320,     0,     0,    26,   339,   336,   338,   337,   264,
-     265,   178,   179,   180,   181,   331,     0,     0,   343,   379,
-     342,   258,   393,   395,   335,   397,   333,    34,     0,   417,
-     416,   418,     0,   414,   407,     0,     0,    68,    50,     0,
-       0,   244,     0,   250,     0,     0,     0,     0,     0,     0,
+       5,     0,     3,     1,    37,   299,     0,   415,   282,   274,
+     293,     0,   339,     0,     0,   281,   269,   283,   335,   280,
+     284,   285,     0,   338,   287,   294,   295,   292,     0,   285,
+       0,     0,   337,     0,   285,     0,   289,   336,   269,   269,
+     279,   399,   275,    81,     2,    15,    38,     0,    32,    16,
+      35,    16,    14,     0,    71,   402,     0,   401,   276,   400,
+       0,     0,    11,     0,     0,     0,     0,    30,     0,   321,
+       9,     8,     0,    13,   344,   344,   344,     0,     0,   404,
+     344,     0,   406,   300,     0,     4,   415,     0,   302,   303,
+       0,   312,   313,   403,   271,     0,   286,   291,     0,   323,
+     324,   290,   307,   308,     0,     0,   288,   277,   405,     0,
+     407,     0,   278,    82,     0,    84,    85,     0,    86,    87,
+      88,     0,     0,    91,    92,    93,    94,    95,     0,     0,
+      98,     0,   100,   101,   102,   103,     0,   105,   106,   107,
+       0,   109,   110,   111,     0,     0,   114,   115,   116,   117,
+       0,     0,     0,     0,     0,   123,     0,   125,   126,     0,
+     128,     0,   130,   131,   134,     0,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,     0,
+     149,   150,   151,     0,     0,   154,   155,   156,   157,   397,
+     158,     0,   160,   395,     0,   162,   163,   164,     0,   166,
+     167,   168,     0,     0,     0,     0,   173,   396,   174,     0,
+       0,   178,   179,     0,     0,     0,     0,    73,   183,    33,
+      70,    70,    70,     0,   269,     0,     0,   269,   269,     0,
+     402,   304,   314,   325,   333,     0,   404,   406,    34,    10,
+     309,    12,     6,   330,     0,    31,   328,   329,     0,     0,
+      28,   348,   345,   347,   346,   272,   273,   186,   187,   188,
+     189,   340,     0,     0,   352,   388,   351,   266,   402,   404,
+     344,   406,   342,    36,     0,     0,   427,   426,   428,     0,
+     423,   416,     0,     0,    70,    52,     0,     0,   252,     0,
+     258,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   197,     0,     0,     0,     0,     0,   197,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    76,    70,    51,
-       0,    23,    24,    25,     0,    21,     0,    19,    16,    22,
-      28,     0,    69,   394,    53,    54,   322,   323,   396,   398,
-      55,   257,    68,     5,     0,    68,     0,     0,   313,    26,
-      68,     0,     0,   341,     0,     0,    57,   345,   334,     0,
-     288,   293,     0,   413,     0,    49,     0,     0,   188,   193,
-     189,     0,   399,    68,    68,    68,     0,   177,   176,     0,
-       0,   208,   199,   200,   201,   205,   206,   207,   202,   203,
-       0,   204,     0,     0,     0,     0,     0,     0,     0,   242,
-       0,   240,   243,     0,     0,    74,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   364,     0,     0,
-     195,   198,     0,     0,     0,     0,     0,     0,     0,     0,
-     381,   382,   383,   384,   385,     0,     0,     0,     0,   403,
-     405,     0,     0,     0,    72,    76,     0,    20,    17,    56,
-       0,    28,     0,   301,    68,   306,     0,     0,     0,     0,
-       0,     0,    68,    28,    27,    69,   332,   340,   344,   380,
-       0,    67,     0,     0,    61,    58,    59,   289,   415,   408,
-     191,   194,    68,     0,    38,     0,   389,     0,   245,     0,
-     401,    69,   251,     0,    78,   169,    84,     0,   232,   231,
-     230,   233,   228,   229,     0,   352,     0,     0,     0,     0,
+       0,   205,     0,     0,     0,     0,     0,   205,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    81,    72,    53,
+       0,    25,    26,    27,     0,    22,     0,     0,    20,    17,
+      24,    30,     0,    71,     0,   403,    55,    56,   331,   332,
+     405,   407,    57,   265,    70,     5,     0,    70,     0,     0,
+     322,    28,    70,     0,     0,   350,     0,     0,    59,   354,
+     343,     0,   296,   301,     0,     0,   422,     0,    51,     0,
+       0,   196,   201,   197,     0,   408,    70,    70,    70,     0,
+     185,   184,     0,     0,   216,   207,   208,   209,   213,   214,
+     215,   210,   211,     0,   212,     0,     0,     0,     0,     0,
+       0,     0,   250,     0,   248,     0,     0,    78,     0,     0,
+     251,     0,     0,    76,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   373,     0,     0,   203,   206,
+       0,     0,     0,     0,     0,     0,     0,     0,   390,   391,
+     392,   393,   394,     0,     0,     0,     0,   412,   414,     0,
+       0,     0,    74,    81,     0,    21,    23,    18,    58,     0,
+       0,    30,     0,   310,    70,   315,     0,     0,     0,     0,
+       0,     0,    70,    30,    29,    71,   341,   349,   353,   389,
+       0,    69,     0,     0,    63,    60,    61,   297,   433,   431,
+     434,   432,     0,   429,   424,   417,   199,   202,    70,     0,
+      40,     0,   398,     0,   253,     0,   410,    71,   259,     0,
+      83,   177,    89,     0,   240,   239,   238,   241,   236,   237,
+       0,   361,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    85,
-      96,   100,     0,   104,   105,   110,   111,   112,   113,   114,
-     116,   119,   121,   364,   331,    57,   369,   364,   366,   365,
-      64,   361,   125,   197,   124,   140,   144,   145,     0,   153,
-     157,   161,   162,   164,   163,   167,   168,     0,   172,   173,
-     174,    73,     0,    15,   372,   400,   297,   302,     7,   308,
-       0,   395,   307,   310,     0,     0,   256,   311,    26,    28,
-     325,    66,    65,   346,     0,     0,   412,     0,   408,   190,
-     192,    39,    37,     0,   397,   259,   249,   248,   352,   239,
-     331,    57,   356,   352,   353,     0,   349,   221,   222,   234,
-     215,   216,   219,   220,   210,   211,     0,   212,   213,   214,
-     218,   217,   224,   223,   226,   227,   225,   235,     0,   241,
-      75,    63,   364,   331,     0,   364,     0,   360,    57,   368,
-     196,     0,   404,    28,    68,     0,   254,   309,    68,   317,
-      62,    60,   290,     0,   411,   409,   374,   377,     0,   247,
-       0,   260,     0,   352,   331,     0,   364,     0,   348,     0,
-      57,   355,     0,   238,   359,   364,   370,   363,   367,     0,
-     151,    52,    18,   373,    28,     0,     0,   376,     0,   246,
-     182,   237,   347,   364,   357,   351,   354,   236,     0,   209,
-     362,   371,   318,   410,   375,   378,     0,   350,   358,     0,
-       0,   402,   183,     0,    68,    68,   253,   185,     0,   184,
-     252
+       0,     0,     0,     0,     0,    90,    96,     0,     0,    97,
+       0,   104,   108,     0,   112,   113,   118,   119,   120,   121,
+     122,   124,   127,   129,   373,   340,    59,   378,   373,   375,
+     374,    66,   370,   133,   205,   132,   148,   152,   153,     0,
+     161,   165,   169,   170,   172,   171,   175,   176,     0,   180,
+     181,   182,    75,     0,    16,   381,   409,   306,   305,   311,
+       7,   317,     0,   404,   316,   319,     0,     0,   264,   320,
+      28,    30,   334,    68,    67,   355,     0,     0,     0,   425,
+     421,     0,   417,   198,   200,    41,    39,     0,   406,   267,
+     257,   256,   361,   247,   340,    59,   365,   361,   362,     0,
+     358,   229,   230,   242,   223,   224,   227,   228,   218,   219,
+       0,   220,   221,   222,   226,   225,   232,   231,   234,   235,
+     233,   243,     0,   249,    80,    79,     0,    77,    65,   373,
+     340,     0,   373,     0,   369,    59,   377,   204,     0,   413,
+      30,    70,     0,   262,   318,    70,   326,    64,    62,   298,
+     430,     0,   420,   418,   383,   386,     0,   255,     0,   268,
+       0,   361,   340,     0,   373,     0,   357,     0,    59,   364,
+       0,   246,    99,   368,   373,   379,   372,   376,     0,   159,
+      54,    19,   382,    30,     0,     0,   385,     0,   254,   190,
+     245,   356,   373,   366,   360,   363,   244,     0,   217,   371,
+     380,   327,   419,   384,   387,     0,   359,   367,     0,     0,
+     411,   191,     0,    70,    70,   261,   193,     0,   192,   260
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -559,  -559,  -559,   344,  -559,   -47,  -559,  -322,  -293,     0,
-    -559,  -559,  -559,  -559,  -559,   227,  -559,  -559,  -559,    10,
-    -513,  -559,  -559,  -288,  -252,  -212,    -2,  -559,  -559,  -273,
-     376,   -75,  -559,  -559,  -559,  -559,  -559,   210,    13,   387,
-     140,  -198,  -559,  -272,  -277,  -559,  -559,  -559,  -559,   -30,
-    -279,  -559,   243,  -559,     9,   -66,  -559,   118,   114,   104,
-    -559,   463,  -559,     5,  -559,    11,    14,  -559,  -559,   652,
-    -559,  -559,  -559,  -559,  -559,   -25,  -559,    20,    19,  -559,
-    -559,    22,  -559,  -559,  -311,  -509,   -49,    -5,   -17,  -238,
-    -559,  -559,  -559,  -545,  -559,  -558,  -559,  -501,  -559,  -559,
-    -559,    12,  -559,   484,  -559,   412,     1,   -51,  -559,     7,
-    -559,   624,   110,  -559,  -559,   116,  -559,   357
+    -598,  -598,  -598,   358,  -598,   -46,  -598,  -350,  -325,     0,
+    -598,  -598,  -598,  -598,  -598,   241,  -598,  -598,  -598,    11,
+    -516,  -598,  -598,  -282,  -258,  -216,    -2,  -598,  -598,   157,
+    -598,  -284,  -201,   -70,  -598,  -598,  -598,  -598,  -598,   207,
+      13,   406,   135,  -210,  -598,  -279,  -291,  -598,  -598,  -598,
+    -598,   -39,  -224,  -598,   250,  -598,    -4,   -73,  -598,   139,
+     142,   101,  -598,   494,  -598,    10,  -598,    17,    19,    20,
+    -598,  -598,   672,  -598,  -598,  -598,  -598,  -598,   -37,  -598,
+      22,    16,  -598,  -598,    23,  -598,  -598,  -331,  -527,   -53,
+     -38,   -24,  -233,  -598,  -598,  -598,  -577,  -598,  -597,  -598,
+    -429,  -598,  -598,  -598,    -5,  -598,   498,  -598,   431,     1,
+     -64,  -598,     7,  -598,   644,   111,  -598,  -598,   116,  -598,
+     377,  -598,   123
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,     1,    44,     2,   343,   216,   573,   350,   240,   321,
-      46,   485,    47,    48,    49,    50,   322,   224,    51,   323,
-     473,   474,   475,   476,   546,    53,   332,   212,   406,   213,
-     379,   547,   716,   722,   367,   368,   369,   370,   262,   419,
-     420,   399,   400,   401,   403,   373,   488,   492,   375,   727,
-     728,   585,    56,   670,    94,   548,    57,    96,    58,   361,
-     595,    59,   268,   324,    61,   325,   326,   342,   453,    64,
-      65,   345,   459,    66,   243,    67,    68,   327,   328,   229,
-      71,   329,    73,    74,    75,   351,    76,   245,    77,   259,
-     260,   614,   677,   615,   616,   549,   646,   550,   551,   575,
-     697,   667,   668,   261,   435,   214,   263,    79,    80,   265,
-     441,    84,   597,   598,    85,    86,   272,   273
+      -1,     1,    44,     2,   355,   220,   604,   362,   246,   331,
+      46,   511,    47,    48,    49,    50,   332,   229,    51,   333,
+     493,   494,   495,   496,   577,    53,   343,   216,   424,   418,
+     415,   217,   392,   578,   755,   761,   380,   381,   382,   383,
+     268,   437,   438,   412,   413,   414,   421,   386,   514,   518,
+     388,   766,   767,   617,    56,   708,    95,   579,    57,    97,
+      58,   373,   627,    59,   274,   334,    61,   335,   336,   337,
+     354,   473,    65,    66,   357,   479,    67,   249,    68,    69,
+     338,   339,   234,    72,   340,    74,    75,    76,   363,    77,
+     251,    78,   265,   266,   648,   715,   649,   650,   580,   683,
+     581,   582,   606,   736,   705,   706,   267,   453,   218,   269,
+      80,    81,   271,   459,    85,   631,   632,    86,    87,   279,
+     280,   502,   503
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -1579,806 +1615,801 @@
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      54,   257,    45,    78,   217,   230,   331,    60,   357,    81,
-     258,   415,    52,    62,   407,    55,    63,   508,   352,   353,
-     408,    70,    69,   411,    72,   413,   264,   462,   418,   228,
-     456,   601,   644,   425,   249,   642,   250,   449,  -412,   282,
-     466,   249,   641,   250,   444,   666,   647,   108,   110,   249,
-    -262,   250,    14,   280,     3,   231,   246,   246,   246,   226,
-     185,   232,   246,   672,   189,   366,   458,   225,   678,   247,
-     248,  -262,   251,   251,   266,   317,   719,   469,    12,   251,
-     528,    12,    28,   249,    12,   250,   362,   251,   283,   720,
-     402,   203,    12,   402,    28,   489,   493,   318,   675,  -262,
-     414,   673,   508,   421,   252,   252,    18,   529,   363,   421,
-     428,   252,   344,   467,   698,   508,   532,    89,   553,   252,
-    -262,   251,   -45,   553,   355,    43,    95,   355,   702,   356,
-     452,    23,   648,   457,   685,   689,    87,    82,    88,   699,
-     666,   684,    83,   533,   687,   554,   355,   100,    97,   106,
-     560,   680,   105,   252,   111,   257,   402,   472,   576,   253,
-     253,   487,   457,   457,   258,   703,   253,   708,   101,    43,
-     590,   102,   571,   726,   253,   705,   347,    32,     5,     6,
-      43,   257,   257,  -186,   710,   377,   254,   254,   378,    37,
-     258,   258,   103,   254,   498,   499,   500,   501,   502,   503,
-     504,   254,   717,   269,   526,   527,   215,    90,   253,    91,
-     218,   600,   574,   346,    54,    54,   270,    78,    78,   104,
-     380,   271,    43,    81,    81,   451,   544,   610,   -40,    55,
-      55,   108,   110,   544,   235,   254,   602,   355,   355,   439,
-     440,   255,   545,   611,   355,   721,   242,   246,    43,   545,
-     417,   486,    92,   612,    93,   426,   639,   256,   429,   358,
-     436,   437,   233,   234,    43,   443,   658,   490,    43,   236,
-     366,  -187,   501,   237,   238,   255,   257,   521,   522,   523,
-     524,   525,   450,   239,   241,   258,   651,    10,   -42,   526,
-     527,   256,   523,   524,   525,   244,   659,   416,   267,   649,
-     480,   -44,   526,   527,   275,   278,   661,   417,   617,   618,
-     276,   620,   621,   622,   623,   624,   625,   626,   627,   628,
-     629,   630,   631,   632,   633,   634,   635,   636,   277,   638,
-      21,   466,    98,   107,    99,    93,   251,   279,   506,   507,
-     508,   284,   656,    24,    25,    26,    27,   281,   465,   505,
-     464,    78,   285,    29,   416,   421,   612,    81,   286,   287,
-     691,   612,   466,    55,   681,   288,   289,   543,   252,   109,
-    -262,    93,   -41,   491,   466,   257,   430,   431,   432,   433,
-     434,   333,   290,    93,   258,  -262,   334,   -43,   335,   336,
-     291,   337,   466,    34,   338,   292,    93,    36,   506,   507,
-     508,   712,   293,   511,   512,   339,   294,    93,   580,   359,
-     249,   360,   250,  -255,    43,  -255,   230,   693,   295,   714,
-     296,   612,   297,   253,   298,   299,   300,   301,   302,   303,
-     613,   304,   305,   306,   307,   308,   309,   310,   603,   311,
-     312,   313,   314,   340,   315,   316,   -46,   723,   608,   -47,
-     254,   -48,    54,   354,    45,    78,   349,   584,   581,    60,
-     465,    81,   464,    78,    52,    62,   231,    55,    63,    81,
-     645,   577,   232,    70,    69,    55,    72,   364,   225,   365,
-     371,   707,   372,   374,   709,   376,   404,   405,   409,   410,
-     610,   412,   422,   424,   604,   442,   417,   445,   402,   446,
-     447,   355,   448,   455,  -262,   257,   611,   460,   477,   461,
-     468,   481,   457,   457,   258,   521,   522,   523,   524,   525,
-     479,   482,   483,   484,   567,   494,   654,   526,   527,   495,
-     496,   497,   558,   613,   572,   230,   676,   530,   613,   671,
-     531,   582,   579,   416,   534,   417,    22,   535,   594,   536,
-     537,   538,   381,   539,     5,     6,   382,   383,   384,   385,
-     386,   387,   417,   381,   540,   542,   552,   382,   383,   384,
-     385,   386,   387,   519,   520,   521,   522,   523,   524,   525,
-     257,   555,   556,     8,   557,     9,   559,   526,   527,   258,
-     596,    10,   416,   562,   619,    12,   563,   564,   613,   417,
-     506,   507,   508,   509,   510,   511,   512,   513,   514,   416,
-     565,    15,   566,   568,   587,   569,   570,   219,    17,   606,
-      18,   388,   593,   605,    19,   607,   637,    20,   640,   652,
-     653,   417,   388,   655,    21,   381,   657,    83,   664,   382,
-     383,   384,   385,   386,   387,    23,   416,    24,    25,    26,
-      27,   669,    54,   695,   679,    78,   465,    29,   464,    78,
-     696,    81,   686,   688,   690,    81,   700,    55,   381,   389,
-     713,    55,   382,   383,   384,   385,   386,   387,   416,   701,
-     389,   704,   706,   711,   724,   725,   718,   454,   588,   438,
-     730,    32,   599,   650,   427,   729,    33,    34,    35,   662,
-     390,    36,   586,    37,   388,   348,   227,   222,   665,   274,
-     715,   390,   663,   391,   341,   423,   223,     0,    40,   478,
-       0,     0,     0,     0,   391,     0,    41,    42,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   388,     0,   392,
-       0,     0,   393,   394,   395,     0,     0,   396,   397,     0,
-     392,     0,   389,   393,   394,   470,     0,     0,   396,   397,
-     398,     0,     0,     0,     0,     0,     0,   471,     0,     0,
-     515,   398,   516,   517,   518,   519,   520,   521,   522,   523,
-     524,   525,     0,   390,     0,   389,     0,     0,     0,   526,
-     527,   592,     0,     0,     0,     0,   391,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       4,     5,     6,     0,     0,     0,   390,     0,     0,     0,
-       0,     0,   392,     0,     0,   393,   394,   395,     0,   391,
-     396,   397,     0,     0,     0,     0,     0,     0,     0,   591,
-       8,     0,     9,   398,     0,     0,     0,     0,    10,    11,
-       0,     0,    12,     0,     0,   392,     0,    13,   393,   394,
-     395,     0,     0,   396,   397,     0,    14,     0,    15,     0,
-       0,     0,     0,     0,    16,    17,   398,    18,     0,     0,
-       0,    19,     0,     0,    20,     0,     0,     0,     0,     0,
-       0,    21,     0,     0,     0,     0,     0,     0,    22,   320,
-       0,     0,    23,     0,    24,    25,    26,    27,    28,     0,
-       0,     0,     0,     0,    29,     0,     0,     0,     0,    30,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     4,
-       5,     6,     0,     0,     0,     0,    31,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    32,     0,
-       0,     0,     0,    33,    34,    35,     0,     0,    36,     8,
-      37,     9,     0,     0,    38,     0,     0,    10,    11,     0,
-       0,    12,     0,    39,     0,    40,    13,     0,     0,     0,
-       0,     0,     0,    41,    42,    14,     0,    15,     0,     0,
-       0,     0,     0,    16,    17,     0,    18,     0,     0,     0,
-      19,     0,     0,    20,     0,     0,     0,     0,     0,     0,
-      21,     0,    43,     0,     0,   330,     0,    22,   320,     0,
-       0,    23,     0,    24,    25,    26,    27,    28,     0,     0,
-       0,     0,     0,    29,     0,     0,     0,     0,    30,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     4,     5,
-       6,     0,     0,     0,     0,    31,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    32,     0,     0,
-       0,     0,    33,    34,    35,     0,     0,    36,     8,    37,
-       9,     0,     0,    38,     0,     0,    10,    11,     0,     0,
-      12,     0,    39,     0,    40,    13,     0,     0,     0,     0,
-       0,     0,    41,    42,    14,     0,    15,     0,     0,     0,
-       0,     0,    16,    17,     0,    18,     0,     0,     0,    19,
-       0,     0,    20,     0,     0,     0,     0,     0,     0,    21,
-       0,    43,     0,     0,   692,     0,    22,     0,     0,     0,
-      23,     0,    24,    25,    26,    27,    28,     0,     0,     0,
-       0,     0,    29,     0,     0,     0,     0,    30,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     4,     5,     6,
-       0,     0,     0,     0,    31,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    32,     0,     0,     0,
-       0,    33,    34,    35,     0,     0,    36,     8,    37,     9,
-       0,     0,    38,     0,     0,    10,     0,     0,     0,    12,
-       0,    39,     0,    40,    13,     0,     0,     0,     0,     0,
-       0,    41,    42,     0,     0,    15,     0,     0,     0,     0,
-       0,    16,    17,     0,    18,     0,     0,     0,    19,     0,
+      54,   235,    45,    79,   264,   221,   342,   263,   369,    82,
+     425,   482,    60,    52,   270,    55,   468,   233,    71,    62,
+     534,    63,    64,   426,    70,    73,   429,   433,   431,   364,
+     365,   436,   486,   635,   109,   111,   443,   253,   254,  -421,
+     704,   287,   272,   462,   255,   255,   256,   256,   679,   275,
+     252,   252,   252,  -270,   498,   236,   252,   758,   476,   554,
+     681,   237,    14,    28,   231,   710,   367,   230,   379,   289,
+     716,   368,   367,   759,  -270,   489,   563,   685,   276,   255,
+       3,   256,   534,    43,   257,   257,   555,   765,   420,    12,
+      12,   420,   277,   356,   499,   189,   419,   278,   432,   193,
+      83,   439,  -270,   564,   -47,    28,   394,   439,   446,   584,
+     395,   396,   397,   398,   399,   400,   584,   711,   290,   257,
+     258,   258,   456,  -270,   628,   737,   327,   207,   102,   713,
+     487,   103,    43,   478,   741,  -194,   585,   375,   472,    90,
+     704,   477,   367,   591,    84,   678,   608,   718,   328,   684,
+     738,   629,    96,   724,    43,   258,   420,   492,   622,   376,
+      98,   534,   264,   515,   519,   263,   457,   458,   101,   728,
+     513,   477,   477,   106,   104,   259,   259,   107,    88,   602,
+      89,   401,   112,   500,   359,   742,     5,     6,   390,   264,
+     264,   391,   263,   263,   219,   524,   525,   526,   527,   528,
+     529,   530,   747,   260,   260,    43,    43,   358,   471,   512,
+     259,   255,   105,   256,   552,   553,   222,   501,    54,    54,
+     393,    79,    79,   109,   111,   -42,   238,    82,    82,   402,
+     634,   760,   370,    55,    55,   239,   605,    43,   260,    91,
+     516,    92,   416,   575,   261,   636,   252,    93,   240,    94,
+     723,   257,   444,   726,   367,   447,   435,   454,   455,   576,
+     262,   403,   461,   241,   547,   548,   549,   550,   551,   676,
+     695,   242,   243,   646,   404,   673,   552,   553,   261,   245,
+     527,    43,   257,   247,  -195,   744,    99,   258,   100,   469,
+     264,   248,   379,   263,   262,   749,   696,   108,   244,    94,
+     405,   250,   -44,   406,   407,   490,   506,   434,   409,   410,
+     688,   273,   110,   756,    94,   435,   -46,   491,   258,   282,
+     283,   411,   651,   652,   686,   654,   655,   656,   657,   658,
+     659,   660,   661,   662,   663,   664,   665,   666,   667,   668,
+     669,   670,   259,   672,   698,   549,   550,   551,   486,   257,
+     420,  -270,   284,   -43,    12,   552,   553,   285,   531,  -270,
+     485,   -45,   484,    79,   286,   730,   434,   288,    43,    82,
+     260,   291,   292,   259,   439,    55,   345,   344,    94,   693,
+     486,   574,   293,   294,   646,   258,   517,   295,   346,   646,
+     347,   296,   719,   486,   297,   348,   264,   349,   350,   263,
+      94,   260,   298,    10,    12,   351,   299,    94,   751,   300,
+     575,   486,   301,   302,   532,   533,   534,   535,   536,   537,
+     538,   367,   540,   371,   612,   372,   576,   303,   304,   532,
+     533,   534,   235,    18,   448,   449,   450,   451,   452,   305,
+     259,   644,   306,   255,   753,   256,  -263,   352,  -263,   307,
+      21,   308,   367,   646,   366,   309,   310,   645,    23,   732,
+     637,   647,   -48,    24,    25,    26,    27,   311,   260,   312,
+     642,   313,    54,    29,    45,    79,   314,   616,   613,   762,
+     485,    82,   484,    79,    60,    52,   236,    55,   609,    82,
+      71,    62,   237,    63,    64,    55,    70,    73,   230,   315,
+     316,   361,   317,   318,    32,   319,   682,   746,   644,   320,
+     748,   321,   -49,    34,   322,   323,   324,    37,    36,   367,
+     638,   325,   326,   435,   645,   420,   374,   377,   -50,   384,
+     389,   378,   385,   387,   417,   422,   423,   463,   427,   264,
+     428,   430,   263,   440,   442,   460,   464,   477,   477,   465,
+     466,   467,   470,  -270,   475,   481,   480,   497,   691,   505,
+     488,   508,   507,   235,   510,   603,   709,   509,   520,   521,
+     522,   523,   647,   435,   434,   714,   556,   647,   557,   532,
+     533,   534,   535,   536,   537,   538,   539,   540,   558,   559,
+     561,   560,   435,   542,   543,   544,   545,   546,   547,   548,
+     549,   550,   551,   562,    22,   630,   565,   566,   567,   568,
+     552,   553,   569,   547,   548,   549,   550,   551,   589,   264,
+     570,   607,   263,   571,   434,   552,   553,   573,   583,   586,
+     587,   588,   435,   590,   593,   594,   595,   596,   597,   598,
+     599,   647,   600,   434,   601,   611,   394,   614,     5,     6,
+     395,   396,   397,   398,   399,   400,   625,   619,   626,   653,
+     640,   639,   641,   671,   675,   435,   394,   690,   677,   689,
+     395,   396,   397,   398,   399,   400,   692,   694,    84,     8,
+     702,     9,   717,   434,   707,   734,   735,    10,   722,    54,
+     725,    12,    79,   485,   727,   484,    79,   729,    82,   740,
+     739,   743,    82,   763,    55,   745,   750,   752,    55,   764,
+     757,    15,   769,   474,   674,   633,   434,   224,    17,   687,
+      18,   401,   620,   445,    19,   768,   232,    20,   699,   618,
+     281,   394,   754,   353,    21,   395,   396,   397,   398,   399,
+     400,   401,   360,   703,   441,    23,   701,    24,    25,    26,
+      27,   700,   504,     0,     0,     0,   541,    29,   542,   543,
+     544,   545,   546,   547,   548,   549,   550,   551,     0,   402,
+       0,     0,     0,     0,     0,   552,   553,     0,     0,     0,
+       0,     0,   572,     0,     0,     0,     0,     0,     0,   402,
+       0,    32,     0,     0,     0,     0,    33,    34,    35,     0,
+       0,   403,    36,     0,    37,     0,   401,     0,   227,     0,
+       0,     0,     0,     0,   404,     0,     0,   228,     0,    40,
+       0,   403,     0,     0,     0,     0,     0,    41,    42,     0,
+       0,     0,     0,     0,   404,     0,     0,     0,     0,     0,
+     405,     0,     0,   406,   407,   408,     0,     0,   409,   410,
+       0,     0,     0,     0,   402,     0,     0,     0,     0,     0,
+     405,   411,     0,   406,   407,   408,     0,     0,   409,   410,
+       0,     4,     5,     6,     0,     0,     0,   623,     0,     0,
+       0,   411,     0,     0,     0,     0,   403,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   404,
+       0,     0,     0,     8,     0,     9,     0,     0,     0,     0,
+       0,    10,    11,     0,     0,    12,     0,     0,     0,     0,
+       0,     0,    13,     0,     0,   405,     0,     0,   406,   407,
+     408,     0,    14,   409,   410,    15,     0,     0,     0,     0,
+       0,    16,    17,     0,    18,     0,   411,     0,    19,     0,
        0,    20,     0,     0,     0,     0,     0,     0,    21,     0,
-      43,     0,     0,   578,     0,    22,     0,     0,     0,    23,
-       0,    24,    25,    26,    27,     0,     0,     0,     0,     0,
-       0,    29,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     4,     5,     6,     0,
+       0,     0,     0,     0,     0,    22,   330,     0,     0,    23,
+       0,    24,    25,    26,    27,    28,     0,     0,     0,     0,
+       0,    29,     0,     0,     0,     0,    30,     0,     0,     0,
+       0,     0,     0,     0,     0,     4,     5,     6,     0,     0,
        0,     0,     0,    31,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,    32,     0,     0,     0,     0,
-      33,    34,    35,     0,     0,    36,     8,    37,     9,     0,
-       0,    38,     0,     0,    10,     0,     0,     0,    12,     0,
-      39,     0,    40,    13,     0,     0,     0,     0,     0,     0,
-      41,    42,     0,     0,    15,     0,     0,     0,     0,     0,
-      16,    17,     0,    18,     0,     0,     0,    19,     0,     0,
-      20,     0,     0,     0,     0,     0,     0,    21,     0,    43,
-       0,     0,   463,     0,    22,     0,     0,     0,    23,     0,
-      24,    25,    26,    27,     0,     0,     0,     0,     0,     0,
-      29,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     4,     5,     6,     0,     0,
-       0,     0,    31,   506,   507,   508,   509,   510,   511,   512,
-     513,   514,     0,     0,    32,     0,     0,     0,     0,    33,
-      34,    35,     0,     0,    36,     8,    37,     9,     0,     0,
-      38,     0,     0,    10,     0,     0,     0,    12,     0,    39,
-       0,    40,    13,     0,     0,     0,     0,     0,     0,    41,
-      42,     0,     0,    15,     0,     0,     0,     0,     0,    16,
-      17,     0,    18,     0,     0,     0,    19,     0,     0,    20,
-       0,     5,     6,     0,     0,     0,    21,     0,    43,     0,
-       0,   589,     0,    22,     0,     0,     0,    23,     0,    24,
-      25,    26,    27,     0,     0,     0,     0,     0,     0,    29,
-       8,     0,     9,     0,     0,     0,     0,     0,    10,     0,
-       0,     0,    12,     0,     0,     0,     0,     0,     0,     0,
-       0,    31,     0,     0,     0,     0,     0,     0,    15,     0,
-       0,     0,     0,    32,   219,    17,     0,    18,    33,    34,
-      35,    19,     0,    36,    20,    37,     0,     0,     0,    38,
-       0,    21,     0,     0,     0,     0,     0,     0,    39,     0,
-      40,     0,    23,     0,    24,    25,    26,    27,    41,    42,
-       0,     0,     0,   515,    29,   516,   517,   518,   519,   520,
-     521,   522,   523,   524,   525,     0,     0,     0,     0,     0,
-       0,     0,   526,   527,     0,     0,     0,    43,     0,   541,
-     694,     0,     0,     0,     0,     0,     0,     0,    32,     0,
-       0,     0,     0,    33,    34,    35,     0,     0,    36,     0,
-      37,     4,     5,     6,   222,     0,     0,     0,     0,     0,
-       0,     0,     7,   223,     0,    40,     0,     0,     0,     0,
-       0,     0,     0,    41,    42,     0,     0,     0,     0,     0,
-       0,     8,     0,     9,     0,     0,     0,     0,     0,    10,
-      11,     0,     0,    12,     0,     0,     0,     0,    13,     0,
-       0,     0,    43,     0,     0,   583,     0,    14,     0,    15,
+      33,    34,    35,     0,     0,     0,    36,     8,    37,     9,
+       0,     0,    38,     0,     0,    10,    11,     0,     0,    12,
+       0,    39,     0,    40,     0,     0,    13,     0,     0,     0,
+       0,    41,    42,     0,     0,     0,    14,     0,     0,    15,
        0,     0,     0,     0,     0,    16,    17,     0,    18,     0,
        0,     0,    19,     0,     0,    20,     0,     0,     0,     0,
-       0,     0,    21,     0,     0,     0,     0,     0,     0,    22,
-       0,     0,     0,    23,     0,    24,    25,    26,    27,    28,
+      43,     0,    21,   341,     0,     0,     0,     0,     0,    22,
+     330,     0,     0,    23,     0,    24,    25,    26,    27,    28,
        0,     0,     0,     0,     0,    29,     0,     0,     0,     0,
-      30,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    31,     0,     0,
-       0,     4,     5,     6,     0,     0,     0,     0,     0,    32,
-       0,   319,     0,     0,    33,    34,    35,     0,     0,    36,
-       0,    37,     0,     0,     0,    38,     0,     0,     0,     0,
-       0,     8,   -68,     9,    39,     0,    40,     0,     0,    10,
-      11,     0,     0,    12,    41,    42,     0,     0,    13,     0,
-       0,     0,     0,     0,     0,     0,     0,    14,     0,    15,
-       0,     0,     0,     0,     0,    16,    17,     0,    18,     0,
-       0,     0,    19,    43,     0,    20,     0,     0,     0,     0,
-       0,     0,    21,     0,     0,     0,     0,     0,     0,    22,
-     320,     0,     0,    23,     0,    24,    25,    26,    27,    28,
-       0,     0,     0,     0,     0,    29,     0,     0,     0,     0,
-      30,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     5,     6,     0,     0,     0,     0,    31,     0,     0,
+      30,     0,     0,     0,     0,     0,     0,     0,     0,     4,
+       5,     6,     0,     0,     0,     0,     0,    31,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,    32,
-       0,     0,     0,     0,    33,    34,    35,     0,     0,    36,
-       8,    37,     9,     0,     0,    38,     0,   251,    10,     0,
-       0,     0,    12,     0,    39,     0,    40,     0,     0,     0,
-       0,     0,     0,     0,    41,    42,     0,     0,    15,     0,
-       0,     0,     0,     0,   219,    17,     0,    18,     0,   252,
-       0,    19,     0,     0,    20,     0,     0,     0,     0,     0,
-       0,    21,     0,    43,     0,     0,     0,     0,     0,     5,
-       6,     0,    23,     0,    24,    25,    26,    27,     0,     0,
-       0,     0,     0,     0,    29,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     8,     0,
-       9,     0,     0,     0,   253,   251,    10,     0,     0,     0,
-      12,     0,     0,     0,     0,     0,     0,     0,    32,     0,
-       0,     0,     0,    33,    34,    35,    15,     0,    36,     0,
-      37,   254,   219,    17,   222,    18,     0,   252,     0,    19,
-       0,     0,    20,   223,     0,    40,     0,     0,     0,    21,
-       0,     0,     0,    41,    42,     0,     0,     5,     6,     0,
+       0,     0,     0,     0,    33,    34,    35,     0,     0,     0,
+      36,     8,    37,     9,     0,     0,    38,     0,     0,    10,
+      11,     0,     0,    12,     0,    39,     0,    40,     0,     0,
+      13,     0,     0,     0,     0,    41,    42,     0,     0,     0,
+      14,     0,     0,    15,     0,     0,     0,     0,     0,    16,
+      17,     0,    18,     0,     0,     0,    19,     0,     0,    20,
+       0,     0,     0,     0,    43,     0,    21,   731,     4,     5,
+       6,     0,     0,    22,     0,     0,     0,    23,     0,    24,
+      25,    26,    27,    28,     0,     0,     0,     0,     0,    29,
+       0,     0,     0,     0,    30,     0,     0,     0,     0,     0,
+       8,     0,     9,     4,     5,     6,     0,     0,    10,     0,
+       0,    31,    12,     0,     0,     0,     0,     0,     0,    13,
+       0,     0,     0,    32,     0,     0,     0,     0,    33,    34,
+      35,     0,    15,     0,    36,     8,    37,     9,    16,    17,
+      38,    18,     0,    10,     0,    19,     0,    12,    20,    39,
+       0,    40,     0,     0,    13,    21,     0,     0,     0,    41,
+      42,     0,    22,     0,     0,     0,    23,    15,    24,    25,
+      26,    27,     0,    16,    17,     0,    18,     0,    29,     0,
+      19,     0,     0,    20,     0,     0,     0,     0,    43,     0,
+      21,   610,     4,     5,     6,     0,     0,    22,     0,     0,
+      31,    23,     0,    24,    25,    26,    27,     0,     0,     0,
+       0,     0,    32,    29,     0,     0,     0,    33,    34,    35,
+       0,     0,     0,    36,     8,    37,     9,     0,     0,    38,
+       0,     0,    10,     0,     0,    31,    12,     0,    39,     0,
+      40,     0,     0,    13,     0,     0,     0,    32,    41,    42,
+       0,     0,    33,    34,    35,     0,    15,     0,    36,     0,
+      37,     0,    16,    17,    38,    18,     0,     0,     0,    19,
+       0,     0,    20,    39,     0,    40,     0,    43,     0,    21,
+     483,     0,     0,    41,    42,     0,    22,     0,     0,     0,
       23,     0,    24,    25,    26,    27,     0,     0,     0,     0,
-       0,   643,    29,     0,     0,     0,     0,   660,     0,     0,
-       0,     0,    43,     0,     0,     0,     8,     0,     9,     0,
-       0,     0,   253,     0,    10,     0,     0,     0,    12,     0,
+       0,     0,    29,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    43,     5,     6,   621,     0,     0,     0,     0,
+       0,     0,     0,     0,    31,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,    32,     0,     0,     0,
-       0,    33,    34,    35,    15,     0,    36,     0,    37,   254,
-     219,    17,   222,    18,     0,     0,     0,    19,     0,     0,
-      20,   223,     0,    40,     0,     0,     0,    21,     0,     0,
-       0,    41,    42,     0,     0,     5,     6,     0,    23,     0,
-      24,    25,    26,    27,     0,     0,     0,     0,     0,   674,
-      29,   506,   507,   508,   509,   510,   511,   512,   513,   514,
-      43,     0,     0,     0,     8,     0,     9,     0,     0,     0,
-       0,     0,    10,     0,     0,     0,    12,     0,     0,     0,
-       0,     0,     0,     0,    32,     0,     0,     0,     0,    33,
-      34,    35,    15,     0,    36,     0,    37,     0,   219,    17,
-     222,    18,     0,     0,     0,    19,     0,     0,    20,   223,
+       0,    33,    34,    35,     8,     0,     9,    36,     0,    37,
+       0,     0,    10,    38,     0,     0,    12,     0,     0,     0,
+       0,     0,    39,     0,    40,     0,     0,     0,     0,     0,
+       0,     0,    41,    42,     0,     0,    15,     0,     0,     0,
+       0,     0,   224,    17,     0,    18,     0,     0,     0,    19,
+       0,     0,    20,     0,     0,     0,     0,     0,     0,    21,
+       0,    43,     0,     0,   733,     0,     0,     0,     0,     0,
+      23,     0,    24,    25,    26,    27,     0,     0,     0,     0,
+       0,     0,    29,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     4,     5,     6,     0,
+     532,   533,   534,   535,   536,   537,   538,     7,     0,     0,
+       0,     0,     0,     0,     0,     0,    32,     0,     0,     0,
+       0,    33,    34,    35,     0,     0,     0,    36,     8,    37,
+       9,     0,     0,   227,     0,     0,    10,    11,     0,     0,
+      12,     0,   228,     0,    40,     0,     0,    13,     0,     0,
+       0,     0,    41,    42,     0,     0,     0,    14,     0,     0,
+      15,     0,     0,     0,     0,     0,    16,    17,     0,    18,
+       0,     0,     0,    19,     0,     0,    20,     0,     0,     0,
+       0,    43,     0,    21,   615,     0,     0,     0,     0,     0,
+      22,     0,     0,     0,    23,     0,    24,    25,    26,    27,
+      28,     0,     0,     0,     0,     0,    29,     0,     0,     0,
+       0,    30,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    31,     4,
+       5,     6,     0,     0,     0,     0,     0,     0,     0,   329,
+      32,     0,     0,     0,     0,    33,    34,    35,     0,     0,
+       0,    36,     0,    37,     0,     0,     0,    38,     0,     0,
+       0,     8,     0,     9,   -70,     0,    39,     0,    40,    10,
+      11,     0,     0,    12,     0,     0,    41,    42,     0,     0,
+      13,   544,   545,   546,   547,   548,   549,   550,   551,     0,
+      14,     0,     0,    15,     0,     0,   552,   553,     0,    16,
+      17,     0,    18,     0,     0,    43,    19,     0,     0,    20,
+       0,     0,     0,     0,     0,     0,    21,     0,     0,     5,
+       6,     0,     0,    22,   330,     0,     0,    23,     0,    24,
+      25,    26,    27,    28,     0,     0,     0,     0,     0,    29,
+       0,     0,     0,     0,    30,     0,     0,     0,     0,     0,
+       8,     0,     9,     0,     0,     0,     0,   257,    10,     0,
+       0,    31,    12,     0,     0,     0,     0,     0,     0,   532,
+     533,   534,     0,    32,   537,   538,     0,     0,    33,    34,
+      35,     0,    15,     0,    36,     0,    37,     0,   224,    17,
+      38,    18,     0,   258,     0,    19,     0,     0,    20,    39,
        0,    40,     0,     0,     0,    21,     0,     0,     0,    41,
       42,     0,     0,     0,     0,     0,    23,     0,    24,    25,
-      26,    27,     0,     0,     0,     0,     0,     0,    29,   506,
-     507,   508,   509,   510,   511,   512,   513,   514,    43,     0,
+      26,    27,     0,     0,     0,     0,     0,     0,    29,   532,
+     533,   534,   535,   536,   537,   538,     0,     0,    43,     5,
+       6,     0,     0,     0,     0,     0,     0,     0,   259,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   506,   507,   508,   509,   510,
-     511,   512,    32,   514,     0,     0,     0,    33,    34,    35,
-       0,     0,    36,     0,    37,     0,     0,     0,   222,     0,
-       0,     0,     0,     0,     0,     0,     0,   223,     0,    40,
-       0,     0,     0,     0,     0,     0,     0,    41,    42,   506,
-     507,   508,   509,   510,   511,   512,   513,   514,     0,     0,
-       0,   515,     0,   516,   517,   518,   519,   520,   521,   522,
-     523,   524,   525,     0,     0,     0,    43,     0,     0,     0,
-     526,   527,     0,     0,     0,     0,     0,   561,   506,   507,
-     508,   509,   510,   511,   512,   513,   514,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   506,
-     507,   508,   509,   510,   511,   512,   513,   514,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   506,   507,
-     508,   509,   510,   511,   512,   506,   507,   508,   509,   510,
-     511,   512,     0,     0,     0,     0,     0,     0,     0,   515,
-       0,   516,   517,   518,   519,   520,   521,   522,   523,   524,
-     525,   506,   507,   508,   509,   510,   511,   512,   526,   527,
-       0,     0,     0,     0,     0,   609,     0,   516,   517,   518,
-     519,   520,   521,   522,   523,   524,   525,   506,   507,   508,
-     509,   510,   511,   512,   526,   527,     0,     0,     0,     0,
+       0,     0,    32,     0,     0,     0,     0,    33,    34,    35,
+       8,     0,     9,    36,     0,    37,   260,   257,    10,   227,
+       0,     0,    12,     0,     0,     0,     0,     0,   228,     0,
+      40,     0,     0,     0,     0,     0,     0,     0,    41,    42,
+       0,     0,    15,     0,     0,     0,     0,     0,   224,    17,
+       0,    18,     0,   258,     0,    19,   680,     0,    20,     0,
+       0,     0,     0,     0,     0,    21,     0,    43,     0,     0,
+       0,     0,     0,     0,     0,     0,    23,     0,    24,    25,
+      26,    27,     0,     0,     0,     0,     0,     0,    29,     0,
+       0,   545,   546,   547,   548,   549,   550,   551,     0,     5,
+       6,     0,     0,     0,     0,   552,   553,     0,   259,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   697,
+       0,     0,    32,     0,     0,     0,     0,    33,    34,    35,
+       8,     0,     9,    36,     0,    37,   260,     0,    10,   227,
+       0,     0,    12,     0,     0,     0,     0,     0,   228,     0,
+      40,   545,   546,   547,   548,   549,   550,   551,    41,    42,
+       0,     0,    15,     0,     0,   552,   553,     0,   224,    17,
+       0,    18,     0,     0,     0,    19,   712,     0,    20,     0,
+       0,     0,     0,     0,     0,    21,     0,    43,     5,     6,
+       0,     0,     0,     0,     0,     0,    23,     0,    24,    25,
+      26,    27,     0,     0,     0,     0,     0,     0,    29,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     8,
+       0,     9,     0,     0,     0,     0,     0,    10,     0,     0,
+       0,    12,   532,   533,   534,   535,   536,   537,   538,   539,
+     540,     0,    32,     0,     0,     0,     0,    33,    34,    35,
+       0,    15,     0,    36,     0,    37,     0,   224,    17,   227,
+      18,     0,     0,     0,    19,     0,     0,    20,   228,     0,
+      40,     0,     0,     0,    21,     0,     0,     0,    41,    42,
+       0,     0,     0,     0,     0,    23,     0,    24,    25,    26,
+      27,     0,     0,     0,     0,     0,     0,    29,   532,   533,
+     534,   535,   536,   537,   538,   539,   540,    43,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   515,
-       0,   516,   517,   518,   519,   520,   521,   522,   523,   524,
-     525,     0,     0,     0,     0,     0,     0,     0,   526,   527,
-     683,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   515,   682,
-     516,   517,   518,   519,   520,   521,   522,   523,   524,   525,
-       0,     0,     0,     0,     0,     0,     0,   526,   527,   515,
-       0,   516,   517,   518,   519,   520,   521,   522,   523,   524,
-     525,     0,     0,     0,     0,     0,     0,     0,   526,   527,
-     516,   517,   518,   519,   520,   521,   522,   523,   524,   525,
-     519,   520,   521,   522,   523,   524,   525,   526,   527,     0,
-       0,     0,     0,     0,   526,   527,     0,     0,     0,     0,
-       0,     0,     0,     0,   517,   518,   519,   520,   521,   522,
-     523,   524,   525,     5,     6,     0,     0,     0,     0,     0,
-     526,   527,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   518,   519,   520,   521,   522,   523,   524,   525,     0,
-       0,     0,     8,     0,     9,     0,   526,   527,     0,     0,
-      10,    11,     0,     0,    12,     0,     0,     0,     5,     6,
-       0,     0,     0,     0,     0,     0,     0,     0,    14,     0,
-      15,     0,     0,     0,     0,     0,   219,    17,     0,    18,
-       0,     0,     0,    19,     0,     0,    20,     8,     0,     9,
-       0,     0,     0,    21,     0,    10,     0,     0,     0,    12,
-       0,     0,     0,     0,    23,     0,    24,    25,    26,    27,
-      28,     0,     0,   220,     0,    15,    29,     0,     0,     0,
-     221,   219,    17,     0,    18,     0,     0,     0,    19,     0,
-       0,    20,     0,     0,     0,     0,     0,     0,    21,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    23,
-      32,    24,    25,    26,    27,    33,    34,    35,     0,     0,
-      36,    29,    37,     0,     0,     0,   222,     0,     0,     0,
-       0,     0,     0,     0,     0,   223,     0,    40,     0,     5,
-       6,     0,     0,     0,     0,    41,    42,     0,     0,     0,
-       0,     0,     0,     0,     0,    32,     0,     0,     0,     0,
-      33,    34,    35,     0,     0,    36,     0,    37,     8,     0,
-       9,   222,     0,     0,     0,     0,    10,     0,     0,     0,
-     223,     0,    40,     0,     0,     0,     0,     0,     0,     0,
-      41,    42,     0,     0,     0,     0,    15,     0,     0,     0,
-       0,     0,   219,    17,     0,     0,     0,     0,     0,    19,
-       0,     0,    20,     0,     0,     0,     0,     0,     0,    21,
+       0,     0,     0,   532,   533,   534,   535,   536,   537,   538,
+       0,    32,     0,     0,     0,     0,    33,    34,    35,     0,
+       0,     0,    36,     0,    37,     0,     0,     0,   227,     0,
+       0,     0,     0,     0,     0,     0,     0,   228,     0,    40,
+       0,     0,     0,     0,     0,     0,     0,    41,    42,   532,
+     533,   534,   535,   536,   537,   538,   539,   540,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    24,    25,    26,    27,     0,     0,     0,     0,
-       0,     0,    29,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    43,   532,   533,   534,
+     535,   536,   537,   538,   539,   540,     0,     0,     0,   541,
+       0,   542,   543,   544,   545,   546,   547,   548,   549,   550,
+     551,     0,     0,     0,     0,     0,     0,     0,   552,   553,
+       0,     0,     0,     0,     0,   592,   532,   533,   534,   535,
+     536,   537,   538,   539,   540,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   532,   533,   534,
+     535,   536,   537,   538,   539,   540,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   541,     0,   542,   543,   544,
+     545,   546,   547,   548,   549,   550,   551,   532,   533,   534,
+     535,   536,   537,   538,   552,   553,     0,     0,     0,     0,
+       0,   643,   542,   543,   544,   545,   546,   547,   548,   549,
+     550,   551,     0,     0,     0,     0,     0,     0,     0,   552,
+     553,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   541,     0,   542,   543,
+     544,   545,   546,   547,   548,   549,   550,   551,     0,     0,
+       0,     0,     0,     0,     0,   552,   553,   624,     0,     0,
+       0,     0,     0,     0,   541,     0,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,     0,     0,     0,     0,
+       0,     0,     0,   552,   553,   721,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   541,   720,   542,   543,   544,   545,   546,
+     547,   548,   549,   550,   551,     0,     0,     0,     0,     0,
+       0,     0,   552,   553,   541,     0,   542,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,     0,     0,     0,     0,
+       0,     0,     0,   552,   553,     5,     6,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   543,   544,   545,
+     546,   547,   548,   549,   550,   551,     0,     0,     0,     0,
+     223,     0,     0,   552,   553,     0,     8,     0,     9,     0,
+       5,     6,     0,     0,    10,    11,     0,     0,    12,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    14,     0,     0,    15,     0,
+       0,     8,     0,     9,   224,    17,     0,    18,     0,    10,
+       0,    19,     0,    12,    20,     0,     0,     0,     0,     0,
+       0,    21,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    23,    15,    24,    25,    26,    27,    28,   224,
+      17,   225,    18,     0,    29,     0,    19,     0,   226,    20,
+       0,     0,     0,     0,     0,     0,    21,     0,     0,     5,
+       6,     0,     0,     0,     0,     0,     0,    23,     0,    24,
+      25,    26,    27,     0,     0,     0,     0,     0,    32,    29,
+       0,     0,     0,    33,    34,    35,     0,     0,     0,    36,
+       8,    37,     9,     0,     0,   227,     0,     0,    10,     0,
+       0,     0,     0,     0,   228,     0,    40,     0,     0,     0,
+       0,     0,     0,    32,    41,    42,     0,     0,    33,    34,
+      35,     0,    15,     0,    36,     0,    37,     0,   224,    17,
+     227,     0,     0,     0,     0,    19,     0,     0,    20,   228,
+       0,    40,     0,     0,     0,    21,     0,     0,     0,    41,
+      42,     0,     0,     0,     0,     0,     0,     0,    24,    25,
+      26,    27,     0,     0,     0,     0,     0,     0,    29,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    33,    34,    35,     0,     0,    36,     0,     0,     0,
-       0,     0,   222,     0,     0,     0,     0,     0,     0,     0,
-       0,   223,     0,    40,     0,     0,     0,     0,     0,     0,
-       0,    41,    42,   112,     0,   113,   114,   115,   116,   117,
-     118,     0,   119,     0,     0,   120,     0,   121,     0,     0,
-       0,   122,   123,     0,   124,   125,   126,   127,     0,   128,
-     129,   130,   131,   132,   133,   134,   135,     0,   136,     0,
-     137,   138,   139,   140,   141,     0,     0,   142,     0,     0,
-       0,   143,     0,   144,   145,     0,   146,   147,   148,   149,
-     150,   151,     0,   152,   153,   154,   155,   156,   157,     0,
-       0,   158,     0,     0,   159,     0,     0,     0,     0,     0,
-     160,   161,     0,   162,   163,     0,   164,   165,     0,     0,
-       0,   166,   167,   168,   169,   170,   171,     0,   172,   173,
-     174,   175,   176,   177,   178,     0,   179,     0,   180,     0,
-     181,   182,   183,   184,   185,   186,   187,   188,   189,     0,
-     190,   191,   192,   193,     0,     0,     0,   194,     0,     0,
-     195,     0,     0,   196,   197,     0,     0,   198,   199,   200,
-     201,     0,     0,   202,     0,   203,     0,   204,   205,   206,
-     207,   208,   209,   210,     0,     0,   211
+       0,     0,     0,     0,     0,     0,     0,    33,    34,    35,
+       0,     0,     0,    36,     0,     0,     0,     0,     0,   227,
+       0,     0,     0,     0,     0,     0,   113,     0,   228,   114,
+      40,   115,   116,   117,   118,   119,     0,   120,    41,    42,
+     121,     0,   122,     0,     0,     0,   123,   124,     0,   125,
+     126,   127,   128,   129,   130,     0,   131,   132,   133,   134,
+     135,   136,   137,   138,   139,     0,   140,     0,     0,   141,
+     142,   143,   144,   145,     0,     0,   146,     0,     0,     0,
+     147,     0,   148,   149,     0,   150,   151,   152,   153,   154,
+     155,     0,   156,   157,   158,   159,   160,   161,     0,     0,
+     162,     0,     0,   163,     0,     0,     0,     0,     0,   164,
+     165,     0,   166,   167,     0,   168,   169,     0,     0,     0,
+     170,   171,   172,   173,   174,   175,     0,   176,   177,   178,
+     179,   180,   181,   182,     0,   183,     0,   184,     0,   185,
+     186,   187,   188,   189,   190,   191,   192,   193,     0,   194,
+     195,   196,   197,     0,     0,     0,     0,   198,     0,     0,
+     199,     0,     0,   200,   201,     0,     0,   202,   203,   204,
+     205,     0,     0,   206,     0,   207,     0,   208,   209,   210,
+     211,   212,   213,   214,     0,     0,   215
 };
 
 static const yytype_int16 yycheck[] =
 {
-       2,    76,     2,     2,    51,    54,   218,     2,   260,     2,
-      76,   299,     2,     2,   291,     2,     2,    18,   256,   257,
-     292,     2,     2,   295,     2,   297,    77,   349,   300,    54,
-     111,     7,   545,   305,     3,   544,     5,   330,   102,   159,
-     351,     3,   543,     5,   317,   603,   547,    38,    39,     3,
-     159,     5,    60,   104,     0,    54,    73,    74,    75,    54,
-     137,    54,    79,   608,   141,   277,   345,    54,   613,    74,
-      75,   159,    41,    41,    79,   185,    40,   354,    46,    41,
-     185,    46,   102,     3,    46,     5,   185,    41,   208,    53,
-     288,   168,    46,   291,   102,   374,   375,   207,   611,   208,
-     298,   610,    18,   301,    73,    73,    71,   212,   207,   307,
-     308,    73,   132,   351,   185,    18,   185,   211,   185,    73,
-     208,    41,   210,   185,   206,   206,    98,   206,   673,   211,
-     342,    96,   211,   345,   643,   648,     3,   205,     5,   210,
-     698,   642,   206,   212,   645,   212,   206,    29,    10,    35,
-     212,   211,    34,    73,    40,   230,   354,   355,   451,   128,
-     128,   373,   374,   375,   230,   674,   128,   680,     3,   206,
-     463,     6,   445,   210,   128,   676,     3,   142,     5,     6,
-     206,   256,   257,   209,   685,    10,   155,   155,    13,   154,
-     256,   257,   211,   155,   392,   393,   394,   395,   396,   397,
-     398,   155,   703,    52,   205,   206,   210,     3,   128,     5,
-     165,   483,   450,   238,   216,   217,    65,   216,   217,   211,
-     286,    70,   206,   216,   217,   209,   195,   195,   210,   216,
-     217,   222,   223,   195,   208,   155,   212,   206,   206,     7,
-       8,   195,   211,   211,   206,   209,   187,   264,   206,   211,
-     299,   209,     3,   505,     5,   306,   528,   211,   309,   264,
-     311,   312,   210,   210,   206,   316,   588,   209,   206,   208,
-     482,   209,   470,   210,   208,   195,   351,   193,   194,   195,
-     196,   197,   331,   210,   210,   351,   558,    42,   210,   205,
-     206,   211,   195,   196,   197,   208,   589,   299,   210,   551,
-     366,   210,   205,   206,   102,   210,   594,   356,   506,   507,
-      10,   509,   510,   511,   512,   513,   514,   515,   516,   517,
-     518,   519,   520,   521,   522,   523,   524,   525,   208,   527,
-      85,   642,     3,     3,     5,     5,    41,     3,    16,    17,
-      18,   211,   580,    98,    99,   100,   101,   208,   350,   398,
-     350,   350,   211,   108,   356,   553,   608,   350,   211,   211,
-     653,   613,   673,   350,   616,   211,   211,   416,    73,     3,
-     208,     5,   210,   375,   685,   450,   180,   181,   182,   183,
-     184,     3,   211,     5,   450,   208,     3,   210,     5,     3,
-     211,     5,   703,   148,     3,   211,     5,   152,    16,    17,
-      18,   694,   211,    21,    22,     3,   211,     5,   457,     3,
-       3,     5,     5,   210,   206,   212,   465,   655,   211,   696,
-     211,   673,   211,   128,   211,   211,   211,   211,   211,   211,
-     505,   211,   211,   211,   211,   211,   211,   211,   487,   211,
-     211,   211,   211,   208,   211,   211,   210,   719,   497,   210,
-     155,   210,   454,   213,   454,   454,   208,   459,   457,   454,
-     462,   454,   462,   462,   454,   454,   465,   454,   454,   462,
-     545,   452,   465,   454,   454,   462,   454,     5,   465,   212,
-     187,   679,   212,   211,   682,    10,    10,    10,    10,    10,
-     195,    10,    10,    10,   487,    10,   545,   206,   696,   211,
-     210,   206,   208,   187,   208,   580,   211,   210,   205,   208,
-     212,   209,   724,   725,   580,   193,   194,   195,   196,   197,
-     208,   185,   213,     7,   205,   212,   573,   205,   206,   212,
-     212,   211,   185,   608,    10,   584,   611,   212,   613,   605,
-     212,   210,   187,   545,   212,   594,    92,   212,   185,   212,
-     212,   212,     3,   212,     5,     6,     7,     8,     9,    10,
-      11,    12,   611,     3,   212,   212,   212,     7,     8,     9,
-      10,    11,    12,   191,   192,   193,   194,   195,   196,   197,
-     655,   212,   212,    34,   212,    36,   212,   205,   206,   655,
-     165,    42,   594,   212,     3,    46,   212,   212,   673,   648,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,   611,
-     212,    62,   212,   212,   209,   212,   212,    68,    69,   210,
-      71,    72,   212,   212,    75,   210,     3,    78,    10,     7,
-     212,   680,    72,   185,    85,     3,   210,   206,   209,     7,
-       8,     9,    10,    11,    12,    96,   648,    98,    99,   100,
-     101,   210,   654,     5,   212,   654,   658,   108,   658,   658,
-     187,   654,   212,   212,   212,   658,   208,   654,     3,   120,
-     210,   658,     7,     8,     9,    10,    11,    12,   680,   212,
-     120,   212,   212,   212,   187,   187,   212,   343,   461,   313,
-     210,   142,   482,   553,   307,   725,   147,   148,   149,   595,
-     151,   152,   459,   154,    72,   242,    54,   158,   598,    85,
-     698,   151,   596,   164,   230,   303,   167,    -1,   169,   362,
-      -1,    -1,    -1,    -1,   164,    -1,   177,   178,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    72,    -1,   190,
-      -1,    -1,   193,   194,   195,    -1,    -1,   198,   199,    -1,
-     190,    -1,   120,   193,   194,   195,    -1,    -1,   198,   199,
-     211,    -1,    -1,    -1,    -1,    -1,    -1,   207,    -1,    -1,
-     186,   211,   188,   189,   190,   191,   192,   193,   194,   195,
-     196,   197,    -1,   151,    -1,   120,    -1,    -1,    -1,   205,
-     206,   207,    -1,    -1,    -1,    -1,   164,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-       4,     5,     6,    -1,    -1,    -1,   151,    -1,    -1,    -1,
-      -1,    -1,   190,    -1,    -1,   193,   194,   195,    -1,   164,
-     198,   199,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   207,
-      34,    -1,    36,   211,    -1,    -1,    -1,    -1,    42,    43,
-      -1,    -1,    46,    -1,    -1,   190,    -1,    51,   193,   194,
-     195,    -1,    -1,   198,   199,    -1,    60,    -1,    62,    -1,
-      -1,    -1,    -1,    -1,    68,    69,   211,    71,    -1,    -1,
-      -1,    75,    -1,    -1,    78,    -1,    -1,    -1,    -1,    -1,
-      -1,    85,    -1,    -1,    -1,    -1,    -1,    -1,    92,    93,
-      -1,    -1,    96,    -1,    98,    99,   100,   101,   102,    -1,
-      -1,    -1,    -1,    -1,   108,    -1,    -1,    -1,    -1,   113,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     4,
-       5,     6,    -1,    -1,    -1,    -1,   130,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   142,    -1,
-      -1,    -1,    -1,   147,   148,   149,    -1,    -1,   152,    34,
-     154,    36,    -1,    -1,   158,    -1,    -1,    42,    43,    -1,
-      -1,    46,    -1,   167,    -1,   169,    51,    -1,    -1,    -1,
-      -1,    -1,    -1,   177,   178,    60,    -1,    62,    -1,    -1,
-      -1,    -1,    -1,    68,    69,    -1,    71,    -1,    -1,    -1,
-      75,    -1,    -1,    78,    -1,    -1,    -1,    -1,    -1,    -1,
-      85,    -1,   206,    -1,    -1,   209,    -1,    92,    93,    -1,
-      -1,    96,    -1,    98,    99,   100,   101,   102,    -1,    -1,
-      -1,    -1,    -1,   108,    -1,    -1,    -1,    -1,   113,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     4,     5,
-       6,    -1,    -1,    -1,    -1,   130,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   142,    -1,    -1,
-      -1,    -1,   147,   148,   149,    -1,    -1,   152,    34,   154,
-      36,    -1,    -1,   158,    -1,    -1,    42,    43,    -1,    -1,
-      46,    -1,   167,    -1,   169,    51,    -1,    -1,    -1,    -1,
-      -1,    -1,   177,   178,    60,    -1,    62,    -1,    -1,    -1,
-      -1,    -1,    68,    69,    -1,    71,    -1,    -1,    -1,    75,
-      -1,    -1,    78,    -1,    -1,    -1,    -1,    -1,    -1,    85,
-      -1,   206,    -1,    -1,   209,    -1,    92,    -1,    -1,    -1,
-      96,    -1,    98,    99,   100,   101,   102,    -1,    -1,    -1,
-      -1,    -1,   108,    -1,    -1,    -1,    -1,   113,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,     4,     5,     6,
-      -1,    -1,    -1,    -1,   130,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   142,    -1,    -1,    -1,
-      -1,   147,   148,   149,    -1,    -1,   152,    34,   154,    36,
-      -1,    -1,   158,    -1,    -1,    42,    -1,    -1,    -1,    46,
-      -1,   167,    -1,   169,    51,    -1,    -1,    -1,    -1,    -1,
-      -1,   177,   178,    -1,    -1,    62,    -1,    -1,    -1,    -1,
-      -1,    68,    69,    -1,    71,    -1,    -1,    -1,    75,    -1,
-      -1,    78,    -1,    -1,    -1,    -1,    -1,    -1,    85,    -1,
-     206,    -1,    -1,   209,    -1,    92,    -1,    -1,    -1,    96,
-      -1,    98,    99,   100,   101,    -1,    -1,    -1,    -1,    -1,
-      -1,   108,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,     4,     5,     6,    -1,
-      -1,    -1,    -1,   130,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   142,    -1,    -1,    -1,    -1,
-     147,   148,   149,    -1,    -1,   152,    34,   154,    36,    -1,
-      -1,   158,    -1,    -1,    42,    -1,    -1,    -1,    46,    -1,
-     167,    -1,   169,    51,    -1,    -1,    -1,    -1,    -1,    -1,
-     177,   178,    -1,    -1,    62,    -1,    -1,    -1,    -1,    -1,
-      68,    69,    -1,    71,    -1,    -1,    -1,    75,    -1,    -1,
-      78,    -1,    -1,    -1,    -1,    -1,    -1,    85,    -1,   206,
-      -1,    -1,   209,    -1,    92,    -1,    -1,    -1,    96,    -1,
-      98,    99,   100,   101,    -1,    -1,    -1,    -1,    -1,    -1,
-     108,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       2,    54,     2,     2,    77,    51,   222,    77,   266,     2,
+     301,   361,     2,     2,    78,     2,   341,    54,     2,     2,
+      18,     2,     2,   302,     2,     2,   305,   309,   307,   262,
+     263,   310,   363,     7,    38,    39,   315,    75,    76,   108,
+     637,   105,    80,   327,     3,     3,     5,     5,   575,    28,
+      74,    75,    76,   166,    27,    54,    80,    42,   117,   192,
+     576,    54,    65,   108,    54,   642,   213,    54,   284,   166,
+     647,   218,   213,    58,   166,   366,   192,   218,    57,     3,
+       0,     5,    18,   213,    43,    43,   219,   217,   298,    48,
+      48,   301,    71,   138,    67,   143,   297,    76,   308,   147,
+     212,   311,   215,   219,   217,   108,     3,   317,   318,   192,
+       7,     8,     9,    10,    11,    12,   192,   644,   215,    43,
+      79,    79,   323,   215,   192,   192,   192,   175,     3,   645,
+     363,     6,   213,   357,   711,   216,   219,   192,   354,   218,
+     737,   357,   213,   219,   213,   574,   471,   218,   214,   578,
+     217,   219,   104,   680,   213,    79,   366,   367,   483,   214,
+      10,    18,   235,   387,   388,   235,     7,     8,    29,   685,
+     386,   387,   388,    34,   218,   134,   134,    35,     3,   463,
+       5,    78,    40,   156,     3,   712,     5,     6,    10,   262,
+     263,    13,   262,   263,   217,   405,   406,   407,   408,   409,
+     410,   411,   718,   162,   162,   213,   213,   244,   216,   216,
+     134,     3,   218,     5,   212,   213,   172,   190,   220,   221,
+     293,   220,   221,   227,   228,   217,   217,   220,   221,   126,
+     509,   216,   270,   220,   221,   217,   469,   213,   162,     3,
+     216,     5,   295,   202,   202,   219,   270,     3,   215,     5,
+     679,    43,   316,   682,   213,   319,   309,   321,   322,   218,
+     218,   158,   326,   217,   200,   201,   202,   203,   204,   560,
+     620,   215,   217,   531,   171,   554,   212,   213,   202,   217,
+     490,   213,    43,   217,   216,   714,     3,    79,     5,   342,
+     363,   194,   508,   363,   218,   724,   621,     3,   215,     5,
+     197,   215,   217,   200,   201,   202,   379,   309,   205,   206,
+     589,   217,     3,   742,     5,   368,   217,   214,    79,   108,
+      10,   218,   532,   533,   582,   535,   536,   537,   538,   539,
+     540,   541,   542,   543,   544,   545,   546,   547,   548,   549,
+     550,   551,   134,   553,   626,   202,   203,   204,   679,    43,
+     560,   215,   215,   217,    48,   212,   213,   217,   411,   215,
+     362,   217,   362,   362,     3,   690,   368,   215,   213,   362,
+     162,   218,   218,   134,   584,   362,     3,     3,     5,   612,
+     711,   434,   218,   218,   642,    79,   388,   218,     3,   647,
+       5,   218,   650,   724,   218,     3,   469,     5,     3,   469,
+       5,   162,   218,    44,    48,     3,   218,     5,   733,   218,
+     202,   742,   218,   218,    16,    17,    18,    19,    20,    21,
+      22,   213,    24,     3,   477,     5,   218,   218,   218,    16,
+      17,    18,   485,    77,   187,   188,   189,   190,   191,   218,
+     134,   202,   218,     3,   735,     5,   217,   215,   219,   218,
+      91,   218,   213,   711,   220,   218,   218,   218,   102,   692,
+     513,   531,   217,   104,   105,   106,   107,   218,   162,   218,
+     523,   218,   474,   114,   474,   474,   218,   479,   477,   758,
+     482,   474,   482,   482,   474,   474,   485,   474,   472,   482,
+     474,   474,   485,   474,   474,   482,   474,   474,   485,   218,
+     218,   215,   218,   218,   148,   218,   576,   717,   202,   218,
+     720,   218,   217,   154,   218,   218,   218,   161,   159,   213,
+     513,   218,   218,   576,   218,   735,   218,     5,   217,   194,
+      10,   219,   219,   218,     7,    10,    10,   213,    10,   612,
+      10,    10,   612,    10,    10,    10,   218,   763,   764,   217,
+     217,   215,   215,   215,   194,   215,   217,   212,   604,   215,
+     219,   192,   216,   616,     7,    10,   639,   220,   219,   219,
+     219,   218,   642,   626,   576,   645,   219,   647,   192,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,   212,   219,
+     219,   192,   645,   195,   196,   197,   198,   199,   200,   201,
+     202,   203,   204,   219,    98,   172,   219,   219,   219,   219,
+     212,   213,   219,   200,   201,   202,   203,   204,   192,   692,
+     219,   216,   692,   219,   626,   212,   213,   219,   219,   219,
+     219,   219,   685,   219,   219,   219,   219,   219,   219,   212,
+     219,   711,   219,   645,   219,   194,     3,   217,     5,     6,
+       7,     8,     9,    10,    11,    12,   219,   216,   192,     3,
+     217,   219,   217,     3,     7,   718,     3,   219,    10,     7,
+       7,     8,     9,    10,    11,    12,   192,   217,   213,    36,
+     216,    38,   219,   685,   217,     5,   194,    44,   219,   691,
+     219,    48,   691,   695,   219,   695,   695,   219,   691,   219,
+     215,   219,   695,   194,   691,   219,   219,   217,   695,   194,
+     219,    68,   217,   355,   557,   508,   718,    74,    75,   584,
+      77,    78,   481,   317,    81,   764,    54,    84,   627,   479,
+      86,     3,   737,   235,    91,     7,     8,     9,    10,    11,
+      12,    78,   248,   632,   313,   102,   630,   104,   105,   106,
+     107,   628,   375,    -1,    -1,    -1,   193,   114,   195,   196,
+     197,   198,   199,   200,   201,   202,   203,   204,    -1,   126,
+      -1,    -1,    -1,    -1,    -1,   212,   213,    -1,    -1,    -1,
+      -1,    -1,   219,    -1,    -1,    -1,    -1,    -1,    -1,   126,
+      -1,   148,    -1,    -1,    -1,    -1,   153,   154,   155,    -1,
+      -1,   158,   159,    -1,   161,    -1,    78,    -1,   165,    -1,
+      -1,    -1,    -1,    -1,   171,    -1,    -1,   174,    -1,   176,
+      -1,   158,    -1,    -1,    -1,    -1,    -1,   184,   185,    -1,
+      -1,    -1,    -1,    -1,   171,    -1,    -1,    -1,    -1,    -1,
+     197,    -1,    -1,   200,   201,   202,    -1,    -1,   205,   206,
+      -1,    -1,    -1,    -1,   126,    -1,    -1,    -1,    -1,    -1,
+     197,   218,    -1,   200,   201,   202,    -1,    -1,   205,   206,
+      -1,     4,     5,     6,    -1,    -1,    -1,   214,    -1,    -1,
+      -1,   218,    -1,    -1,    -1,    -1,   158,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   171,
+      -1,    -1,    -1,    36,    -1,    38,    -1,    -1,    -1,    -1,
+      -1,    44,    45,    -1,    -1,    48,    -1,    -1,    -1,    -1,
+      -1,    -1,    55,    -1,    -1,   197,    -1,    -1,   200,   201,
+     202,    -1,    65,   205,   206,    68,    -1,    -1,    -1,    -1,
+      -1,    74,    75,    -1,    77,    -1,   218,    -1,    81,    -1,
+      -1,    84,    -1,    -1,    -1,    -1,    -1,    -1,    91,    -1,
+      -1,    -1,    -1,    -1,    -1,    98,    99,    -1,    -1,   102,
+      -1,   104,   105,   106,   107,   108,    -1,    -1,    -1,    -1,
+      -1,   114,    -1,    -1,    -1,    -1,   119,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,     4,     5,     6,    -1,    -1,
-      -1,    -1,   130,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    -1,    -1,   142,    -1,    -1,    -1,    -1,   147,
-     148,   149,    -1,    -1,   152,    34,   154,    36,    -1,    -1,
-     158,    -1,    -1,    42,    -1,    -1,    -1,    46,    -1,   167,
-      -1,   169,    51,    -1,    -1,    -1,    -1,    -1,    -1,   177,
-     178,    -1,    -1,    62,    -1,    -1,    -1,    -1,    -1,    68,
-      69,    -1,    71,    -1,    -1,    -1,    75,    -1,    -1,    78,
-      -1,     5,     6,    -1,    -1,    -1,    85,    -1,   206,    -1,
-      -1,   209,    -1,    92,    -1,    -1,    -1,    96,    -1,    98,
-      99,   100,   101,    -1,    -1,    -1,    -1,    -1,    -1,   108,
-      34,    -1,    36,    -1,    -1,    -1,    -1,    -1,    42,    -1,
-      -1,    -1,    46,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   130,    -1,    -1,    -1,    -1,    -1,    -1,    62,    -1,
-      -1,    -1,    -1,   142,    68,    69,    -1,    71,   147,   148,
-     149,    75,    -1,   152,    78,   154,    -1,    -1,    -1,   158,
-      -1,    85,    -1,    -1,    -1,    -1,    -1,    -1,   167,    -1,
-     169,    -1,    96,    -1,    98,    99,   100,   101,   177,   178,
-      -1,    -1,    -1,   186,   108,   188,   189,   190,   191,   192,
-     193,   194,   195,   196,   197,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   205,   206,    -1,    -1,    -1,   206,    -1,   212,
-     209,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   142,    -1,
-      -1,    -1,    -1,   147,   148,   149,    -1,    -1,   152,    -1,
-     154,     4,     5,     6,   158,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    15,   167,    -1,   169,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   177,   178,    -1,    -1,    -1,    -1,    -1,
-      -1,    34,    -1,    36,    -1,    -1,    -1,    -1,    -1,    42,
-      43,    -1,    -1,    46,    -1,    -1,    -1,    -1,    51,    -1,
-      -1,    -1,   206,    -1,    -1,   209,    -1,    60,    -1,    62,
-      -1,    -1,    -1,    -1,    -1,    68,    69,    -1,    71,    -1,
-      -1,    -1,    75,    -1,    -1,    78,    -1,    -1,    -1,    -1,
-      -1,    -1,    85,    -1,    -1,    -1,    -1,    -1,    -1,    92,
-      -1,    -1,    -1,    96,    -1,    98,    99,   100,   101,   102,
-      -1,    -1,    -1,    -1,    -1,   108,    -1,    -1,    -1,    -1,
-     113,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   130,    -1,    -1,
-      -1,     4,     5,     6,    -1,    -1,    -1,    -1,    -1,   142,
-      -1,    14,    -1,    -1,   147,   148,   149,    -1,    -1,   152,
-      -1,   154,    -1,    -1,    -1,   158,    -1,    -1,    -1,    -1,
-      -1,    34,   165,    36,   167,    -1,   169,    -1,    -1,    42,
-      43,    -1,    -1,    46,   177,   178,    -1,    -1,    51,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    60,    -1,    62,
-      -1,    -1,    -1,    -1,    -1,    68,    69,    -1,    71,    -1,
-      -1,    -1,    75,   206,    -1,    78,    -1,    -1,    -1,    -1,
-      -1,    -1,    85,    -1,    -1,    -1,    -1,    -1,    -1,    92,
-      93,    -1,    -1,    96,    -1,    98,    99,   100,   101,   102,
-      -1,    -1,    -1,    -1,    -1,   108,    -1,    -1,    -1,    -1,
-     113,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,     5,     6,    -1,    -1,    -1,    -1,   130,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   142,
-      -1,    -1,    -1,    -1,   147,   148,   149,    -1,    -1,   152,
-      34,   154,    36,    -1,    -1,   158,    -1,    41,    42,    -1,
-      -1,    -1,    46,    -1,   167,    -1,   169,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   177,   178,    -1,    -1,    62,    -1,
-      -1,    -1,    -1,    -1,    68,    69,    -1,    71,    -1,    73,
-      -1,    75,    -1,    -1,    78,    -1,    -1,    -1,    -1,    -1,
-      -1,    85,    -1,   206,    -1,    -1,    -1,    -1,    -1,     5,
-       6,    -1,    96,    -1,    98,    99,   100,   101,    -1,    -1,
-      -1,    -1,    -1,    -1,   108,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    34,    -1,
-      36,    -1,    -1,    -1,   128,    41,    42,    -1,    -1,    -1,
-      46,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   142,    -1,
-      -1,    -1,    -1,   147,   148,   149,    62,    -1,   152,    -1,
-     154,   155,    68,    69,   158,    71,    -1,    73,    -1,    75,
-      -1,    -1,    78,   167,    -1,   169,    -1,    -1,    -1,    85,
-      -1,    -1,    -1,   177,   178,    -1,    -1,     5,     6,    -1,
-      96,    -1,    98,    99,   100,   101,    -1,    -1,    -1,    -1,
-      -1,   195,   108,    -1,    -1,    -1,    -1,    25,    -1,    -1,
-      -1,    -1,   206,    -1,    -1,    -1,    34,    -1,    36,    -1,
-      -1,    -1,   128,    -1,    42,    -1,    -1,    -1,    46,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   142,    -1,    -1,    -1,
-      -1,   147,   148,   149,    62,    -1,   152,    -1,   154,   155,
-      68,    69,   158,    71,    -1,    -1,    -1,    75,    -1,    -1,
-      78,   167,    -1,   169,    -1,    -1,    -1,    85,    -1,    -1,
-      -1,   177,   178,    -1,    -1,     5,     6,    -1,    96,    -1,
-      98,    99,   100,   101,    -1,    -1,    -1,    -1,    -1,   195,
-     108,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-     206,    -1,    -1,    -1,    34,    -1,    36,    -1,    -1,    -1,
-      -1,    -1,    42,    -1,    -1,    -1,    46,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   142,    -1,    -1,    -1,    -1,   147,
-     148,   149,    62,    -1,   152,    -1,   154,    -1,    68,    69,
-     158,    71,    -1,    -1,    -1,    75,    -1,    -1,    78,   167,
-      -1,   169,    -1,    -1,    -1,    85,    -1,    -1,    -1,   177,
-     178,    -1,    -1,    -1,    -1,    -1,    96,    -1,    98,    99,
-     100,   101,    -1,    -1,    -1,    -1,    -1,    -1,   108,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,   206,    -1,
+      -1,    -1,    -1,   136,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   148,    -1,    -1,    -1,    -1,
+     153,   154,   155,    -1,    -1,    -1,   159,    36,   161,    38,
+      -1,    -1,   165,    -1,    -1,    44,    45,    -1,    -1,    48,
+      -1,   174,    -1,   176,    -1,    -1,    55,    -1,    -1,    -1,
+      -1,   184,   185,    -1,    -1,    -1,    65,    -1,    -1,    68,
+      -1,    -1,    -1,    -1,    -1,    74,    75,    -1,    77,    -1,
+      -1,    -1,    81,    -1,    -1,    84,    -1,    -1,    -1,    -1,
+     213,    -1,    91,   216,    -1,    -1,    -1,    -1,    -1,    98,
+      99,    -1,    -1,   102,    -1,   104,   105,   106,   107,   108,
+      -1,    -1,    -1,    -1,    -1,   114,    -1,    -1,    -1,    -1,
+     119,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     4,
+       5,     6,    -1,    -1,    -1,    -1,    -1,   136,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   148,
+      -1,    -1,    -1,    -1,   153,   154,   155,    -1,    -1,    -1,
+     159,    36,   161,    38,    -1,    -1,   165,    -1,    -1,    44,
+      45,    -1,    -1,    48,    -1,   174,    -1,   176,    -1,    -1,
+      55,    -1,    -1,    -1,    -1,   184,   185,    -1,    -1,    -1,
+      65,    -1,    -1,    68,    -1,    -1,    -1,    -1,    -1,    74,
+      75,    -1,    77,    -1,    -1,    -1,    81,    -1,    -1,    84,
+      -1,    -1,    -1,    -1,   213,    -1,    91,   216,     4,     5,
+       6,    -1,    -1,    98,    -1,    -1,    -1,   102,    -1,   104,
+     105,   106,   107,   108,    -1,    -1,    -1,    -1,    -1,   114,
+      -1,    -1,    -1,    -1,   119,    -1,    -1,    -1,    -1,    -1,
+      36,    -1,    38,     4,     5,     6,    -1,    -1,    44,    -1,
+      -1,   136,    48,    -1,    -1,    -1,    -1,    -1,    -1,    55,
+      -1,    -1,    -1,   148,    -1,    -1,    -1,    -1,   153,   154,
+     155,    -1,    68,    -1,   159,    36,   161,    38,    74,    75,
+     165,    77,    -1,    44,    -1,    81,    -1,    48,    84,   174,
+      -1,   176,    -1,    -1,    55,    91,    -1,    -1,    -1,   184,
+     185,    -1,    98,    -1,    -1,    -1,   102,    68,   104,   105,
+     106,   107,    -1,    74,    75,    -1,    77,    -1,   114,    -1,
+      81,    -1,    -1,    84,    -1,    -1,    -1,    -1,   213,    -1,
+      91,   216,     4,     5,     6,    -1,    -1,    98,    -1,    -1,
+     136,   102,    -1,   104,   105,   106,   107,    -1,    -1,    -1,
+      -1,    -1,   148,   114,    -1,    -1,    -1,   153,   154,   155,
+      -1,    -1,    -1,   159,    36,   161,    38,    -1,    -1,   165,
+      -1,    -1,    44,    -1,    -1,   136,    48,    -1,   174,    -1,
+     176,    -1,    -1,    55,    -1,    -1,    -1,   148,   184,   185,
+      -1,    -1,   153,   154,   155,    -1,    68,    -1,   159,    -1,
+     161,    -1,    74,    75,   165,    77,    -1,    -1,    -1,    81,
+      -1,    -1,    84,   174,    -1,   176,    -1,   213,    -1,    91,
+     216,    -1,    -1,   184,   185,    -1,    98,    -1,    -1,    -1,
+     102,    -1,   104,   105,   106,   107,    -1,    -1,    -1,    -1,
+      -1,    -1,   114,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   213,     5,     6,   216,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   136,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   148,    -1,    -1,    -1,
+      -1,   153,   154,   155,    36,    -1,    38,   159,    -1,   161,
+      -1,    -1,    44,   165,    -1,    -1,    48,    -1,    -1,    -1,
+      -1,    -1,   174,    -1,   176,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   184,   185,    -1,    -1,    68,    -1,    -1,    -1,
+      -1,    -1,    74,    75,    -1,    77,    -1,    -1,    -1,    81,
+      -1,    -1,    84,    -1,    -1,    -1,    -1,    -1,    -1,    91,
+      -1,   213,    -1,    -1,   216,    -1,    -1,    -1,    -1,    -1,
+     102,    -1,   104,   105,   106,   107,    -1,    -1,    -1,    -1,
+      -1,    -1,   114,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,     4,     5,     6,    -1,
+      16,    17,    18,    19,    20,    21,    22,    15,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   148,    -1,    -1,    -1,
+      -1,   153,   154,   155,    -1,    -1,    -1,   159,    36,   161,
+      38,    -1,    -1,   165,    -1,    -1,    44,    45,    -1,    -1,
+      48,    -1,   174,    -1,   176,    -1,    -1,    55,    -1,    -1,
+      -1,    -1,   184,   185,    -1,    -1,    -1,    65,    -1,    -1,
+      68,    -1,    -1,    -1,    -1,    -1,    74,    75,    -1,    77,
+      -1,    -1,    -1,    81,    -1,    -1,    84,    -1,    -1,    -1,
+      -1,   213,    -1,    91,   216,    -1,    -1,    -1,    -1,    -1,
+      98,    -1,    -1,    -1,   102,    -1,   104,   105,   106,   107,
+     108,    -1,    -1,    -1,    -1,    -1,   114,    -1,    -1,    -1,
+      -1,   119,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   136,     4,
+       5,     6,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    14,
+     148,    -1,    -1,    -1,    -1,   153,   154,   155,    -1,    -1,
+      -1,   159,    -1,   161,    -1,    -1,    -1,   165,    -1,    -1,
+      -1,    36,    -1,    38,   172,    -1,   174,    -1,   176,    44,
+      45,    -1,    -1,    48,    -1,    -1,   184,   185,    -1,    -1,
+      55,   197,   198,   199,   200,   201,   202,   203,   204,    -1,
+      65,    -1,    -1,    68,    -1,    -1,   212,   213,    -1,    74,
+      75,    -1,    77,    -1,    -1,   213,    81,    -1,    -1,    84,
+      -1,    -1,    -1,    -1,    -1,    -1,    91,    -1,    -1,     5,
+       6,    -1,    -1,    98,    99,    -1,    -1,   102,    -1,   104,
+     105,   106,   107,   108,    -1,    -1,    -1,    -1,    -1,   114,
+      -1,    -1,    -1,    -1,   119,    -1,    -1,    -1,    -1,    -1,
+      36,    -1,    38,    -1,    -1,    -1,    -1,    43,    44,    -1,
+      -1,   136,    48,    -1,    -1,    -1,    -1,    -1,    -1,    16,
+      17,    18,    -1,   148,    21,    22,    -1,    -1,   153,   154,
+     155,    -1,    68,    -1,   159,    -1,   161,    -1,    74,    75,
+     165,    77,    -1,    79,    -1,    81,    -1,    -1,    84,   174,
+      -1,   176,    -1,    -1,    -1,    91,    -1,    -1,    -1,   184,
+     185,    -1,    -1,    -1,    -1,    -1,   102,    -1,   104,   105,
+     106,   107,    -1,    -1,    -1,    -1,    -1,    -1,   114,    16,
+      17,    18,    19,    20,    21,    22,    -1,    -1,   213,     5,
+       6,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   134,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    16,    17,    18,    19,    20,
-      21,    22,   142,    24,    -1,    -1,    -1,   147,   148,   149,
-      -1,    -1,   152,    -1,   154,    -1,    -1,    -1,   158,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   167,    -1,   169,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   177,   178,    16,
+      -1,    -1,   148,    -1,    -1,    -1,    -1,   153,   154,   155,
+      36,    -1,    38,   159,    -1,   161,   162,    43,    44,   165,
+      -1,    -1,    48,    -1,    -1,    -1,    -1,    -1,   174,    -1,
+     176,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   184,   185,
+      -1,    -1,    68,    -1,    -1,    -1,    -1,    -1,    74,    75,
+      -1,    77,    -1,    79,    -1,    81,   202,    -1,    84,    -1,
+      -1,    -1,    -1,    -1,    -1,    91,    -1,   213,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   102,    -1,   104,   105,
+     106,   107,    -1,    -1,    -1,    -1,    -1,    -1,   114,    -1,
+      -1,   198,   199,   200,   201,   202,   203,   204,    -1,     5,
+       6,    -1,    -1,    -1,    -1,   212,   213,    -1,   134,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    25,
+      -1,    -1,   148,    -1,    -1,    -1,    -1,   153,   154,   155,
+      36,    -1,    38,   159,    -1,   161,   162,    -1,    44,   165,
+      -1,    -1,    48,    -1,    -1,    -1,    -1,    -1,   174,    -1,
+     176,   198,   199,   200,   201,   202,   203,   204,   184,   185,
+      -1,    -1,    68,    -1,    -1,   212,   213,    -1,    74,    75,
+      -1,    77,    -1,    -1,    -1,    81,   202,    -1,    84,    -1,
+      -1,    -1,    -1,    -1,    -1,    91,    -1,   213,     5,     6,
+      -1,    -1,    -1,    -1,    -1,    -1,   102,    -1,   104,   105,
+     106,   107,    -1,    -1,    -1,    -1,    -1,    -1,   114,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    36,
+      -1,    38,    -1,    -1,    -1,    -1,    -1,    44,    -1,    -1,
+      -1,    48,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    -1,   148,    -1,    -1,    -1,    -1,   153,   154,   155,
+      -1,    68,    -1,   159,    -1,   161,    -1,    74,    75,   165,
+      77,    -1,    -1,    -1,    81,    -1,    -1,    84,   174,    -1,
+     176,    -1,    -1,    -1,    91,    -1,    -1,    -1,   184,   185,
+      -1,    -1,    -1,    -1,    -1,   102,    -1,   104,   105,   106,
+     107,    -1,    -1,    -1,    -1,    -1,    -1,   114,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,   213,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    16,    17,    18,    19,    20,    21,    22,
+      -1,   148,    -1,    -1,    -1,    -1,   153,   154,   155,    -1,
+      -1,    -1,   159,    -1,   161,    -1,    -1,    -1,   165,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   174,    -1,   176,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   184,   185,    16,
       17,    18,    19,    20,    21,    22,    23,    24,    -1,    -1,
-      -1,   186,    -1,   188,   189,   190,   191,   192,   193,   194,
-     195,   196,   197,    -1,    -1,    -1,   206,    -1,    -1,    -1,
-     205,   206,    -1,    -1,    -1,    -1,    -1,   212,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    16,    17,
-      18,    19,    20,    21,    22,    16,    17,    18,    19,    20,
-      21,    22,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   186,
-      -1,   188,   189,   190,   191,   192,   193,   194,   195,   196,
-     197,    16,    17,    18,    19,    20,    21,    22,   205,   206,
-      -1,    -1,    -1,    -1,    -1,   212,    -1,   188,   189,   190,
-     191,   192,   193,   194,   195,   196,   197,    16,    17,    18,
-      19,    20,    21,    22,   205,   206,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   186,
-      -1,   188,   189,   190,   191,   192,   193,   194,   195,   196,
-     197,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   205,   206,
-     207,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   186,   187,
-     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   205,   206,   186,
-      -1,   188,   189,   190,   191,   192,   193,   194,   195,   196,
-     197,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   205,   206,
-     188,   189,   190,   191,   192,   193,   194,   195,   196,   197,
-     191,   192,   193,   194,   195,   196,   197,   205,   206,    -1,
-      -1,    -1,    -1,    -1,   205,   206,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   189,   190,   191,   192,   193,   194,
-     195,   196,   197,     5,     6,    -1,    -1,    -1,    -1,    -1,
-     205,   206,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   190,   191,   192,   193,   194,   195,   196,   197,    -1,
-      -1,    -1,    34,    -1,    36,    -1,   205,   206,    -1,    -1,
-      42,    43,    -1,    -1,    46,    -1,    -1,    -1,     5,     6,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    60,    -1,
-      62,    -1,    -1,    -1,    -1,    -1,    68,    69,    -1,    71,
-      -1,    -1,    -1,    75,    -1,    -1,    78,    34,    -1,    36,
-      -1,    -1,    -1,    85,    -1,    42,    -1,    -1,    -1,    46,
-      -1,    -1,    -1,    -1,    96,    -1,    98,    99,   100,   101,
-     102,    -1,    -1,   105,    -1,    62,   108,    -1,    -1,    -1,
-     112,    68,    69,    -1,    71,    -1,    -1,    -1,    75,    -1,
-      -1,    78,    -1,    -1,    -1,    -1,    -1,    -1,    85,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    96,
-     142,    98,    99,   100,   101,   147,   148,   149,    -1,    -1,
-     152,   108,   154,    -1,    -1,    -1,   158,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   167,    -1,   169,    -1,     5,
-       6,    -1,    -1,    -1,    -1,   177,   178,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   142,    -1,    -1,    -1,    -1,
-     147,   148,   149,    -1,    -1,   152,    -1,   154,    34,    -1,
-      36,   158,    -1,    -1,    -1,    -1,    42,    -1,    -1,    -1,
-     167,    -1,   169,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     177,   178,    -1,    -1,    -1,    -1,    62,    -1,    -1,    -1,
-      -1,    -1,    68,    69,    -1,    -1,    -1,    -1,    -1,    75,
-      -1,    -1,    78,    -1,    -1,    -1,    -1,    -1,    -1,    85,
+      -1,    -1,    -1,    -1,    -1,    -1,   213,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    -1,    -1,    -1,   193,
+      -1,   195,   196,   197,   198,   199,   200,   201,   202,   203,
+     204,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   212,   213,
+      -1,    -1,    -1,    -1,    -1,   219,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   193,    -1,   195,   196,   197,
+     198,   199,   200,   201,   202,   203,   204,    16,    17,    18,
+      19,    20,    21,    22,   212,   213,    -1,    -1,    -1,    -1,
+      -1,   219,   195,   196,   197,   198,   199,   200,   201,   202,
+     203,   204,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   212,
+     213,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    98,    99,   100,   101,    -1,    -1,    -1,    -1,
-      -1,    -1,   108,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   193,    -1,   195,   196,
+     197,   198,   199,   200,   201,   202,   203,   204,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   212,   213,   214,    -1,    -1,
+      -1,    -1,    -1,    -1,   193,    -1,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   212,   213,   214,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   193,   194,   195,   196,   197,   198,   199,
+     200,   201,   202,   203,   204,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   212,   213,   193,    -1,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   212,   213,     5,     6,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,    -1,    -1,    -1,    -1,
+      30,    -1,    -1,   212,   213,    -1,    36,    -1,    38,    -1,
+       5,     6,    -1,    -1,    44,    45,    -1,    -1,    48,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    65,    -1,    -1,    68,    -1,
+      -1,    36,    -1,    38,    74,    75,    -1,    77,    -1,    44,
+      -1,    81,    -1,    48,    84,    -1,    -1,    -1,    -1,    -1,
+      -1,    91,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   102,    68,   104,   105,   106,   107,   108,    74,
+      75,   111,    77,    -1,   114,    -1,    81,    -1,   118,    84,
+      -1,    -1,    -1,    -1,    -1,    -1,    91,    -1,    -1,     5,
+       6,    -1,    -1,    -1,    -1,    -1,    -1,   102,    -1,   104,
+     105,   106,   107,    -1,    -1,    -1,    -1,    -1,   148,   114,
+      -1,    -1,    -1,   153,   154,   155,    -1,    -1,    -1,   159,
+      36,   161,    38,    -1,    -1,   165,    -1,    -1,    44,    -1,
+      -1,    -1,    -1,    -1,   174,    -1,   176,    -1,    -1,    -1,
+      -1,    -1,    -1,   148,   184,   185,    -1,    -1,   153,   154,
+     155,    -1,    68,    -1,   159,    -1,   161,    -1,    74,    75,
+     165,    -1,    -1,    -1,    -1,    81,    -1,    -1,    84,   174,
+      -1,   176,    -1,    -1,    -1,    91,    -1,    -1,    -1,   184,
+     185,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   104,   105,
+     106,   107,    -1,    -1,    -1,    -1,    -1,    -1,   114,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   147,   148,   149,    -1,    -1,   152,    -1,    -1,    -1,
-      -1,    -1,   158,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   167,    -1,   169,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   177,   178,    26,    -1,    28,    29,    30,    31,    32,
-      33,    -1,    35,    -1,    -1,    38,    -1,    40,    -1,    -1,
-      -1,    44,    45,    -1,    47,    48,    49,    50,    -1,    52,
-      53,    54,    55,    56,    57,    58,    59,    -1,    61,    -1,
-      63,    64,    65,    66,    67,    -1,    -1,    70,    -1,    -1,
-      -1,    74,    -1,    76,    77,    -1,    79,    80,    81,    82,
-      83,    84,    -1,    86,    87,    88,    89,    90,    91,    -1,
-      -1,    94,    -1,    -1,    97,    -1,    -1,    -1,    -1,    -1,
-     103,   104,    -1,   106,   107,    -1,   109,   110,    -1,    -1,
-      -1,   114,   115,   116,   117,   118,   119,    -1,   121,   122,
-     123,   124,   125,   126,   127,    -1,   129,    -1,   131,    -1,
-     133,   134,   135,   136,   137,   138,   139,   140,   141,    -1,
-     143,   144,   145,   146,    -1,    -1,    -1,   150,    -1,    -1,
-     153,    -1,    -1,   156,   157,    -1,    -1,   160,   161,   162,
-     163,    -1,    -1,   166,    -1,   168,    -1,   170,   171,   172,
-     173,   174,   175,   176,    -1,    -1,   179
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   153,   154,   155,
+      -1,    -1,    -1,   159,    -1,    -1,    -1,    -1,    -1,   165,
+      -1,    -1,    -1,    -1,    -1,    -1,    26,    -1,   174,    29,
+     176,    31,    32,    33,    34,    35,    -1,    37,   184,   185,
+      40,    -1,    42,    -1,    -1,    -1,    46,    47,    -1,    49,
+      50,    51,    52,    53,    54,    -1,    56,    57,    58,    59,
+      60,    61,    62,    63,    64,    -1,    66,    -1,    -1,    69,
+      70,    71,    72,    73,    -1,    -1,    76,    -1,    -1,    -1,
+      80,    -1,    82,    83,    -1,    85,    86,    87,    88,    89,
+      90,    -1,    92,    93,    94,    95,    96,    97,    -1,    -1,
+     100,    -1,    -1,   103,    -1,    -1,    -1,    -1,    -1,   109,
+     110,    -1,   112,   113,    -1,   115,   116,    -1,    -1,    -1,
+     120,   121,   122,   123,   124,   125,    -1,   127,   128,   129,
+     130,   131,   132,   133,    -1,   135,    -1,   137,    -1,   139,
+     140,   141,   142,   143,   144,   145,   146,   147,    -1,   149,
+     150,   151,   152,    -1,    -1,    -1,    -1,   157,    -1,    -1,
+     160,    -1,    -1,   163,   164,    -1,    -1,   167,   168,   169,
+     170,    -1,    -1,   173,    -1,   175,    -1,   177,   178,   179,
+     180,   181,   182,   183,    -1,    -1,   186
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
      symbol of state STATE-NUM.  */
 static const yytype_int16 yystos[] =
 {
-       0,   215,   217,     0,     4,     5,     6,    15,    34,    36,
-      42,    43,    46,    51,    60,    62,    68,    69,    71,    75,
-      78,    85,    92,    96,    98,    99,   100,   101,   102,   108,
-     113,   130,   142,   147,   148,   149,   152,   154,   158,   167,
-     169,   177,   178,   206,   216,   223,   224,   226,   227,   228,
-     229,   232,   233,   239,   240,   252,   266,   270,   272,   275,
-     277,   278,   279,   280,   283,   284,   287,   289,   290,   291,
-     292,   294,   295,   296,   297,   298,   300,   302,   320,   321,
-     322,   323,   205,   206,   325,   328,   329,     3,     5,   211,
-       3,     5,     3,     5,   268,    98,   271,    10,     3,     5,
-     271,     3,     6,   211,   211,   271,   272,     3,   268,     3,
-     268,   272,    26,    28,    29,    30,    31,    32,    33,    35,
-      38,    40,    44,    45,    47,    48,    49,    50,    52,    53,
-      54,    55,    56,    57,    58,    59,    61,    63,    64,    65,
-      66,    67,    70,    74,    76,    77,    79,    80,    81,    82,
-      83,    84,    86,    87,    88,    89,    90,    91,    94,    97,
-     103,   104,   106,   107,   109,   110,   114,   115,   116,   117,
-     118,   119,   121,   122,   123,   124,   125,   126,   127,   129,
-     131,   133,   134,   135,   136,   137,   138,   139,   140,   141,
-     143,   144,   145,   146,   150,   153,   156,   157,   160,   161,
-     162,   163,   166,   168,   170,   171,   172,   173,   174,   175,
-     176,   179,   241,   243,   319,   210,   219,   219,   165,    68,
-     105,   112,   158,   167,   231,   252,   277,   283,   289,   293,
-     300,   320,   323,   210,   210,   208,   208,   210,   208,   210,
-     222,   210,   187,   288,   208,   301,   302,   301,   301,     3,
-       5,    41,    73,   128,   155,   195,   211,   245,   269,   303,
-     304,   317,   252,   320,   321,   323,   301,   210,   276,    52,
-      65,    70,   330,   331,   325,   102,    10,   208,   210,     3,
-     321,   208,   159,   208,   211,   211,   211,   211,   211,   211,
-     211,   211,   211,   211,   211,   211,   211,   211,   211,   211,
-     211,   211,   211,   211,   211,   211,   211,   211,   211,   211,
-     211,   211,   211,   211,   211,   211,   211,   185,   207,    14,
-      93,   223,   230,   233,   277,   279,   280,   291,   292,   295,
-     209,   239,   240,     3,     3,     5,     3,     5,     3,     3,
-     208,   317,   281,   218,   132,   285,   289,     3,   275,   208,
-     221,   299,   303,   303,   213,   206,   211,   238,   301,     3,
-       5,   273,   185,   207,     5,   212,   239,   248,   249,   250,
-     251,   187,   212,   259,   211,   262,    10,    10,    13,   244,
-     269,     3,     7,     8,     9,    10,    11,    12,    72,   120,
-     151,   164,   190,   193,   194,   195,   198,   199,   211,   255,
-     256,   257,   255,   258,    10,    10,   242,   258,   257,    10,
-      10,   257,    10,   257,   255,   237,   240,   300,   257,   253,
-     254,   255,    10,   319,    10,   257,   321,   253,   255,   321,
-     180,   181,   182,   183,   184,   318,   321,   321,   244,     7,
-       8,   324,    10,   321,   243,   206,   211,   210,   208,   222,
-     300,   209,   239,   282,   217,   187,   111,   239,   264,   286,
-     210,   208,   221,   209,   223,   240,   298,   303,   212,   258,
-     195,   207,   255,   234,   235,   236,   237,   205,   331,   208,
-     269,   209,   185,   213,     7,   225,   209,   239,   260,   264,
-     209,   240,   261,   264,   212,   212,   212,   211,   255,   255,
-     255,   255,   255,   255,   255,   300,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,   186,   188,   189,   190,   191,
-     192,   193,   194,   195,   196,   197,   205,   206,   185,   212,
-     212,   212,   185,   212,   212,   212,   212,   212,   212,   212,
-     212,   212,   212,   300,   195,   211,   238,   245,   269,   309,
-     311,   312,   212,   185,   212,   212,   212,   212,   185,   212,
-     212,   212,   212,   212,   212,   212,   212,   205,   212,   212,
-     212,   243,    10,   220,   303,   313,   222,   292,   209,   187,
-     300,   320,   210,   209,   240,   265,   266,   209,   229,   209,
-     222,   207,   207,   212,   185,   274,   165,   326,   327,   251,
-     257,     7,   212,   300,   323,   212,   210,   210,   300,   212,
-     195,   211,   238,   245,   305,   307,   308,   255,   255,     3,
-     255,   255,   255,   255,   255,   255,   255,   255,   255,   255,
-     255,   255,   255,   255,   255,   255,   255,     3,   255,   257,
-      10,   311,   299,   195,   234,   245,   310,   311,   211,   238,
-     254,   257,     7,   212,   219,   185,   303,   210,   221,   222,
-      25,   237,   273,   329,   209,   326,   309,   315,   316,   210,
-     267,   269,   307,   299,   195,   234,   245,   306,   307,   212,
-     211,   238,   187,   207,   311,   299,   212,   311,   212,   234,
-     212,   222,   209,   303,   209,     5,   187,   314,   185,   210,
-     208,   212,   307,   299,   212,   311,   212,   255,   234,   255,
-     311,   212,   222,   210,   258,   315,   246,   311,   212,    40,
-      53,   209,   247,   257,   187,   187,   210,   263,   264,   263,
-     210
+       0,   222,   224,     0,     4,     5,     6,    15,    36,    38,
+      44,    45,    48,    55,    65,    68,    74,    75,    77,    81,
+      84,    91,    98,   102,   104,   105,   106,   107,   108,   114,
+     119,   136,   148,   153,   154,   155,   159,   161,   165,   174,
+     176,   184,   185,   213,   223,   230,   231,   233,   234,   235,
+     236,   239,   240,   246,   247,   261,   275,   279,   281,   284,
+     286,   287,   288,   289,   290,   293,   294,   297,   299,   300,
+     301,   302,   304,   305,   306,   307,   308,   310,   312,   330,
+     331,   332,   333,   212,   213,   335,   338,   339,     3,     5,
+     218,     3,     5,     3,     5,   277,   104,   280,    10,     3,
+       5,   280,     3,     6,   218,   218,   280,   281,     3,   277,
+       3,   277,   281,    26,    29,    31,    32,    33,    34,    35,
+      37,    40,    42,    46,    47,    49,    50,    51,    52,    53,
+      54,    56,    57,    58,    59,    60,    61,    62,    63,    64,
+      66,    69,    70,    71,    72,    73,    76,    80,    82,    83,
+      85,    86,    87,    88,    89,    90,    92,    93,    94,    95,
+      96,    97,   100,   103,   109,   110,   112,   113,   115,   116,
+     120,   121,   122,   123,   124,   125,   127,   128,   129,   130,
+     131,   132,   133,   135,   137,   139,   140,   141,   142,   143,
+     144,   145,   146,   147,   149,   150,   151,   152,   157,   160,
+     163,   164,   167,   168,   169,   170,   173,   175,   177,   178,
+     179,   180,   181,   182,   183,   186,   248,   252,   329,   217,
+     226,   226,   172,    30,    74,   111,   118,   165,   174,   238,
+     261,   286,   293,   299,   303,   310,   330,   333,   217,   217,
+     215,   217,   215,   217,   215,   217,   229,   217,   194,   298,
+     215,   311,   312,   311,   311,     3,     5,    43,    79,   134,
+     162,   202,   218,   254,   278,   313,   314,   327,   261,   330,
+     331,   333,   311,   217,   285,    28,    57,    71,    76,   340,
+     341,   335,   108,    10,   215,   217,     3,   331,   215,   166,
+     215,   218,   218,   218,   218,   218,   218,   218,   218,   218,
+     218,   218,   218,   218,   218,   218,   218,   218,   218,   218,
+     218,   218,   218,   218,   218,   218,   218,   218,   218,   218,
+     218,   218,   218,   218,   218,   218,   218,   192,   214,    14,
+      99,   230,   237,   240,   286,   288,   289,   290,   301,   302,
+     305,   216,   246,   247,     3,     3,     3,     5,     3,     5,
+       3,     3,   215,   327,   291,   225,   138,   295,   299,     3,
+     284,   215,   228,   309,   313,   313,   220,   213,   218,   245,
+     311,     3,     5,   282,   218,   192,   214,     5,   219,   246,
+     257,   258,   259,   260,   194,   219,   268,   218,   271,    10,
+      10,    13,   253,   278,     3,     7,     8,     9,    10,    11,
+      12,    78,   126,   158,   171,   197,   200,   201,   202,   205,
+     206,   218,   264,   265,   266,   251,   310,     7,   250,   253,
+     264,   267,    10,    10,   249,   267,   266,    10,    10,   266,
+      10,   266,   264,   244,   247,   310,   266,   262,   263,   264,
+      10,   329,    10,   266,   331,   262,   264,   331,   187,   188,
+     189,   190,   191,   328,   331,   331,   253,     7,     8,   334,
+      10,   331,   252,   213,   218,   217,   217,   215,   229,   310,
+     215,   216,   246,   292,   224,   194,   117,   246,   273,   296,
+     217,   215,   228,   216,   230,   247,   308,   313,   219,   267,
+     202,   214,   264,   241,   242,   243,   244,   212,    27,    67,
+     156,   190,   342,   343,   341,   215,   278,   216,   192,   220,
+       7,   232,   216,   246,   269,   273,   216,   247,   270,   273,
+     219,   219,   219,   218,   264,   264,   264,   264,   264,   264,
+     264,   310,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,   193,   195,   196,   197,   198,   199,   200,   201,   202,
+     203,   204,   212,   213,   192,   219,   219,   192,   212,   219,
+     192,   219,   219,   192,   219,   219,   219,   219,   219,   219,
+     219,   219,   219,   219,   310,   202,   218,   245,   254,   278,
+     319,   321,   322,   219,   192,   219,   219,   219,   219,   192,
+     219,   219,   219,   219,   219,   219,   219,   219,   212,   219,
+     219,   219,   252,    10,   227,   313,   323,   216,   229,   302,
+     216,   194,   310,   330,   217,   216,   247,   274,   275,   216,
+     236,   216,   229,   214,   214,   219,   192,   283,   192,   219,
+     172,   336,   337,   260,   266,     7,   219,   310,   333,   219,
+     217,   217,   310,   219,   202,   218,   245,   254,   315,   317,
+     318,   264,   264,     3,   264,   264,   264,   264,   264,   264,
+     264,   264,   264,   264,   264,   264,   264,   264,   264,   264,
+     264,     3,   264,   266,   250,     7,   267,    10,   321,   309,
+     202,   241,   254,   320,   321,   218,   245,   263,   266,     7,
+     219,   226,   192,   313,   217,   228,   229,    25,   244,   282,
+     343,   339,   216,   336,   319,   325,   326,   217,   276,   278,
+     317,   309,   202,   241,   254,   316,   317,   219,   218,   245,
+     194,   214,   219,   321,   309,   219,   321,   219,   241,   219,
+     229,   216,   313,   216,     5,   194,   324,   192,   217,   215,
+     219,   317,   309,   219,   321,   219,   264,   241,   264,   321,
+     219,   229,   217,   267,   325,   255,   321,   219,    42,    58,
+     216,   256,   266,   194,   194,   217,   272,   273,   272,   217
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_int16 yyr1[] =
 {
-       0,   214,   215,   216,   216,   217,   218,   217,   217,   217,
-     217,   217,   217,   217,   217,   219,   219,   220,   219,   219,
-     219,   219,   219,   219,   219,   219,   221,   221,   222,   222,
-     223,   223,   223,   223,   223,   223,   223,   224,   225,   225,
-     226,   226,   226,   226,   226,   226,   226,   226,   226,   227,
-     228,   229,   230,   231,   231,   232,   233,   234,   234,   235,
-     235,   236,   236,   237,   237,   238,   238,   238,   239,   239,
-     240,   241,   241,   241,   242,   242,   243,   243,   243,   243,
-     243,   243,   243,   243,   243,   243,   243,   243,   243,   243,
-     243,   243,   243,   243,   243,   243,   243,   243,   243,   243,
-     243,   243,   243,   243,   243,   243,   243,   243,   243,   243,
-     243,   243,   243,   243,   243,   243,   243,   243,   243,   243,
-     243,   243,   243,   243,   243,   243,   243,   243,   243,   243,
-     243,   243,   243,   243,   243,   243,   243,   243,   243,   243,
-     243,   243,   243,   243,   243,   243,   243,   243,   243,   243,
-     243,   243,   243,   243,   243,   243,   243,   243,   243,   243,
-     243,   243,   243,   243,   243,   243,   243,   243,   243,   243,
-     243,   243,   243,   243,   243,   243,   244,   244,   245,   245,
-     245,   245,   246,   246,   247,   247,   248,   248,   248,   249,
-     249,   250,   251,   251,   252,   253,   253,   254,   254,   255,
-     255,   255,   255,   255,   255,   255,   255,   255,   255,   255,
-     255,   255,   255,   255,   255,   255,   255,   255,   255,   255,
-     255,   255,   255,   255,   255,   255,   255,   255,   255,   255,
-     255,   255,   255,   255,   255,   255,   255,   255,   255,   255,
-     256,   256,   257,   258,   259,   259,   260,   260,   261,   261,
-     262,   262,   263,   263,   264,   264,   265,   266,   266,   267,
-     267,   268,   268,   268,   269,   269,   270,   270,   270,   270,
-     270,   270,   270,   270,   270,   270,   270,   271,   271,   272,
-     272,   272,   272,   272,   272,   272,   272,   272,   273,   274,
-     273,   275,   276,   275,   277,   277,   278,   279,   280,   280,
-     281,   281,   282,   283,   283,   284,   285,   285,   286,   286,
-     287,   287,   288,   288,   289,   289,   290,   291,   291,   291,
-     292,   292,   293,   293,   294,   295,   296,   296,   296,   297,
-     298,   299,   299,   300,   300,   301,   301,   302,   302,   302,
-     303,   303,   303,   304,   304,   304,   304,   305,   305,   305,
-     306,   306,   307,   307,   308,   308,   308,   308,   308,   309,
-     309,   309,   310,   310,   311,   311,   312,   312,   312,   312,
-     312,   312,   313,   313,   314,   314,   315,   316,   316,   317,
-     317,   318,   318,   318,   318,   318,   319,   319,   319,   320,
-     321,   321,   321,   321,   321,   321,   321,   321,   321,   321,
-     322,   323,   323,   324,   324,   324,   325,   325,   326,   326,
-     327,   328,   329,   329,   330,   330,   331,   331,   331
+       0,   221,   222,   223,   223,   224,   225,   224,   224,   224,
+     224,   224,   224,   224,   224,   224,   226,   226,   227,   226,
+     226,   226,   226,   226,   226,   226,   226,   226,   228,   228,
+     229,   229,   230,   230,   230,   230,   230,   230,   230,   231,
+     232,   232,   233,   233,   233,   233,   233,   233,   233,   233,
+     233,   234,   235,   236,   237,   238,   238,   239,   240,   241,
+     241,   242,   242,   243,   243,   244,   244,   245,   245,   245,
+     246,   246,   247,   248,   248,   248,   249,   249,   250,   250,
+     251,   252,   252,   252,   252,   252,   252,   252,   252,   252,
+     252,   252,   252,   252,   252,   252,   252,   252,   252,   252,
+     252,   252,   252,   252,   252,   252,   252,   252,   252,   252,
+     252,   252,   252,   252,   252,   252,   252,   252,   252,   252,
+     252,   252,   252,   252,   252,   252,   252,   252,   252,   252,
+     252,   252,   252,   252,   252,   252,   252,   252,   252,   252,
+     252,   252,   252,   252,   252,   252,   252,   252,   252,   252,
+     252,   252,   252,   252,   252,   252,   252,   252,   252,   252,
+     252,   252,   252,   252,   252,   252,   252,   252,   252,   252,
+     252,   252,   252,   252,   252,   252,   252,   252,   252,   252,
+     252,   252,   252,   252,   253,   253,   254,   254,   254,   254,
+     255,   255,   256,   256,   257,   257,   257,   258,   258,   259,
+     260,   260,   261,   262,   262,   263,   263,   264,   264,   264,
+     264,   264,   264,   264,   264,   264,   264,   264,   264,   264,
+     264,   264,   264,   264,   264,   264,   264,   264,   264,   264,
+     264,   264,   264,   264,   264,   264,   264,   264,   264,   264,
+     264,   264,   264,   264,   264,   264,   264,   264,   265,   265,
+     266,   267,   268,   268,   269,   269,   270,   270,   271,   271,
+     272,   272,   273,   273,   274,   275,   275,   276,   276,   277,
+     277,   277,   278,   278,   279,   279,   279,   279,   279,   279,
+     279,   279,   279,   279,   279,   280,   280,   281,   281,   281,
+     281,   281,   281,   281,   281,   281,   282,   283,   282,   284,
+     285,   284,   286,   286,   287,   288,   289,   290,   290,   291,
+     291,   292,   293,   293,   294,   295,   295,   296,   296,   297,
+     297,   298,   298,   299,   299,   300,   301,   301,   301,   302,
+     302,   303,   303,   304,   305,   306,   306,   306,   307,   308,
+     309,   309,   310,   310,   311,   311,   312,   312,   312,   313,
+     313,   313,   314,   314,   314,   314,   315,   315,   315,   316,
+     316,   317,   317,   318,   318,   318,   318,   318,   319,   319,
+     319,   320,   320,   321,   321,   322,   322,   322,   322,   322,
+     322,   323,   323,   324,   324,   325,   326,   326,   327,   327,
+     328,   328,   328,   328,   328,   329,   329,   329,   330,   331,
+     331,   331,   331,   331,   331,   331,   331,   331,   331,   332,
+     333,   333,   334,   334,   334,   335,   335,   336,   336,   337,
+     338,   339,   339,   340,   340,   341,   341,   341,   341,   342,
+     342,   343,   343,   343,   343
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
 static const yytype_int8 yyr2[] =
 {
        0,     2,     2,     0,     2,     0,     0,     6,     2,     2,
-       3,     2,     2,     2,     2,     0,     2,     0,     6,     2,
-       3,     2,     2,     2,     2,     2,     0,     2,     0,     1,
-       1,     2,     2,     1,     2,     1,     1,     6,     1,     2,
-       1,     2,     1,     2,     1,     2,     2,     2,     2,     4,
-       3,     3,     5,     2,     2,     3,     4,     0,     1,     1,
-       3,     1,     3,     3,     2,     3,     3,     2,     0,     1,
-       3,     1,     3,     4,     1,     3,     0,     1,     4,     1,
-       1,     1,     1,     1,     4,     4,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     4,     1,     1,     1,
-       4,     1,     1,     1,     4,     4,     1,     1,     1,     1,
-       4,     4,     4,     4,     4,     1,     4,     1,     1,     4,
-       1,     4,     1,     1,     4,     4,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       4,     1,     1,     1,     4,     4,     1,     1,     1,     1,
-       1,     6,     1,     4,     1,     1,     1,     4,     1,     1,
-       1,     4,     4,     4,     4,     1,     1,     4,     4,     4,
-       1,     1,     4,     4,     4,     1,     1,     1,     1,     1,
-       1,     1,     0,     2,     4,     3,     0,     2,     1,     1,
-       3,     2,     3,     1,     5,     1,     3,     0,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     5,
+       3,     2,     3,     2,     2,     2,     0,     2,     0,     6,
+       2,     3,     2,     3,     2,     2,     2,     2,     0,     2,
+       0,     1,     1,     2,     2,     1,     2,     1,     1,     6,
+       1,     2,     1,     2,     1,     2,     1,     2,     2,     2,
+       2,     4,     3,     3,     5,     2,     2,     3,     4,     0,
+       1,     1,     3,     1,     3,     3,     2,     3,     3,     2,
+       0,     1,     3,     1,     3,     4,     1,     3,     1,     3,
+       3,     0,     1,     4,     1,     1,     1,     1,     1,     4,
+       4,     1,     1,     1,     1,     1,     4,     4,     1,     6,
+       1,     1,     1,     1,     4,     1,     1,     1,     4,     1,
+       1,     1,     4,     4,     1,     1,     1,     1,     4,     4,
+       4,     4,     4,     1,     4,     1,     1,     4,     1,     4,
+       1,     1,     4,     4,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     4,     1,
+       1,     1,     4,     4,     1,     1,     1,     1,     1,     6,
+       1,     4,     1,     1,     1,     4,     1,     1,     1,     4,
+       4,     4,     4,     1,     1,     4,     4,     4,     1,     1,
+       4,     4,     4,     1,     1,     1,     1,     1,     1,     1,
+       0,     2,     4,     3,     0,     2,     1,     1,     3,     2,
+       3,     1,     5,     1,     3,     0,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     5,     3,     3,
        3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
-       3,     3,     3,     3,     3,     3,     3,     3,     2,     2,
-       2,     2,     2,     2,     3,     3,     5,     5,     4,     3,
-       1,     3,     1,     1,     0,     2,     4,     3,     2,     2,
-       0,     2,     2,     1,     3,     2,     1,     3,     2,     0,
-       1,     0,     1,     1,     1,     1,     1,     1,     1,     2,
-       2,     1,     1,     1,     1,     1,     1,     0,     1,     1,
-       2,     1,     2,     2,     1,     1,     1,     1,     1,     0,
-       4,     1,     0,     4,     2,     2,     2,     5,     2,     2,
-       0,     2,     2,     2,     2,     2,     2,     3,     2,     3,
-       5,     5,     0,     2,     2,     2,     2,     6,     8,     2,
-       2,     2,     2,     2,     2,     5,     1,     1,     1,     1,
-       1,     0,     2,     2,     3,     0,     1,     2,     2,     2,
-       3,     2,     1,     1,     3,     2,     4,     3,     2,     1,
-       3,     2,     0,     1,     3,     2,     1,     3,     4,     3,
-       2,     1,     3,     2,     0,     1,     1,     3,     2,     1,
-       3,     4,     1,     3,     0,     2,     2,     1,     3,     1,
-       3,     1,     1,     1,     1,     1,     1,     1,     1,     5,
-       1,     1,     1,     1,     2,     1,     2,     1,     2,     4,
-       5,     5,    10,     1,     3,     1,     0,     2,     0,     2,
-       4,     6,     0,     3,     1,     3,     1,     1,     1
+       3,     3,     3,     3,     3,     3,     2,     2,     2,     2,
+       2,     2,     3,     3,     5,     5,     4,     3,     1,     3,
+       1,     1,     0,     2,     4,     3,     2,     2,     0,     2,
+       2,     1,     3,     2,     1,     3,     2,     0,     1,     0,
+       1,     1,     1,     1,     1,     1,     1,     2,     2,     1,
+       1,     1,     1,     1,     1,     0,     1,     1,     2,     1,
+       2,     2,     1,     1,     1,     1,     1,     0,     4,     1,
+       0,     4,     2,     2,     2,     5,     5,     2,     2,     0,
+       2,     2,     2,     2,     2,     2,     3,     2,     3,     5,
+       5,     0,     2,     2,     2,     2,     6,     8,     2,     2,
+       2,     2,     2,     2,     5,     1,     1,     1,     1,     1,
+       0,     2,     2,     3,     0,     1,     2,     2,     2,     3,
+       2,     1,     1,     3,     2,     4,     3,     2,     1,     3,
+       2,     0,     1,     3,     2,     1,     3,     4,     3,     2,
+       1,     3,     2,     0,     1,     1,     3,     2,     1,     3,
+       4,     1,     3,     0,     2,     2,     1,     3,     1,     3,
+       1,     1,     1,     1,     1,     1,     1,     1,     5,     1,
+       1,     1,     1,     2,     1,     2,     1,     2,     4,     5,
+       5,    10,     1,     3,     1,     0,     2,     0,     2,     4,
+       6,     0,     3,     1,     3,     4,     1,     1,     1,     1,
+       3,     1,     1,     1,     1
 };
 
 
@@ -3116,7 +3147,7 @@
   switch (yyn)
     {
   case 2: /* input: gbl_statements m_acf  */
-#line 319 "tools/widl/parser.y"
+#line 331 "tools/widl/parser.y"
                                                 { check_statements((yyvsp[-1].stmt_list), FALSE);
 						  check_all_user_types((yyvsp[-1].stmt_list));
 						  write_header((yyvsp[-1].stmt_list));
@@ -3129,197 +3160,211 @@
 						  write_dlldata((yyvsp[-1].stmt_list));
 						  write_local_stubs((yyvsp[-1].stmt_list));
 						}
-#line 3133 "tools/widl/parser.tab.c"
+#line 3164 "tools/widl/parser.tab.c"
     break;
 
   case 5: /* gbl_statements: %empty  */
-#line 335 "tools/widl/parser.y"
+#line 347 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = NULL; }
-#line 3139 "tools/widl/parser.tab.c"
+#line 3170 "tools/widl/parser.tab.c"
     break;
 
   case 6: /* $@1: %empty  */
-#line 336 "tools/widl/parser.y"
+#line 348 "tools/widl/parser.y"
                                           { push_namespace((yyvsp[-1].str)); }
-#line 3145 "tools/widl/parser.tab.c"
+#line 3176 "tools/widl/parser.tab.c"
     break;
 
   case 7: /* gbl_statements: gbl_statements namespacedef '{' $@1 gbl_statements '}'  */
-#line 337 "tools/widl/parser.y"
+#line 349 "tools/widl/parser.y"
                                                 { pop_namespace((yyvsp[-4].str)); (yyval.stmt_list) = append_statements((yyvsp[-5].stmt_list), (yyvsp[-1].stmt_list)); }
-#line 3151 "tools/widl/parser.tab.c"
+#line 3182 "tools/widl/parser.tab.c"
     break;
 
   case 8: /* gbl_statements: gbl_statements interfacedec  */
-#line 338 "tools/widl/parser.y"
+#line 350 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_reference((yyvsp[0].type))); }
-#line 3157 "tools/widl/parser.tab.c"
+#line 3188 "tools/widl/parser.tab.c"
     break;
 
   case 9: /* gbl_statements: gbl_statements interfacedef  */
-#line 339 "tools/widl/parser.y"
+#line 351 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type))); }
-#line 3163 "tools/widl/parser.tab.c"
+#line 3194 "tools/widl/parser.tab.c"
     break;
 
   case 10: /* gbl_statements: gbl_statements coclass ';'  */
-#line 340 "tools/widl/parser.y"
+#line 352 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = (yyvsp[-2].stmt_list);
 						  reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0);
 						}
-#line 3171 "tools/widl/parser.tab.c"
+#line 3202 "tools/widl/parser.tab.c"
     break;
 
   case 11: /* gbl_statements: gbl_statements coclassdef  */
-#line 343 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
-						  reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0);
-						}
-#line 3179 "tools/widl/parser.tab.c"
-    break;
-
-  case 12: /* gbl_statements: gbl_statements moduledef  */
-#line 346 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_module((yyvsp[0].type))); }
-#line 3185 "tools/widl/parser.tab.c"
-    break;
-
-  case 13: /* gbl_statements: gbl_statements librarydef  */
-#line 347 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_library((yyvsp[0].typelib))); }
-#line 3191 "tools/widl/parser.tab.c"
-    break;
-
-  case 14: /* gbl_statements: gbl_statements statement  */
-#line 348 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
-#line 3197 "tools/widl/parser.tab.c"
-    break;
-
-  case 15: /* imp_statements: %empty  */
-#line 351 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = NULL; }
-#line 3203 "tools/widl/parser.tab.c"
-    break;
-
-  case 16: /* imp_statements: imp_statements interfacedec  */
-#line 352 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_reference((yyvsp[0].type))); }
-#line 3209 "tools/widl/parser.tab.c"
-    break;
-
-  case 17: /* $@2: %empty  */
-#line 353 "tools/widl/parser.y"
-                                          { push_namespace((yyvsp[-1].str)); }
-#line 3215 "tools/widl/parser.tab.c"
-    break;
-
-  case 18: /* imp_statements: imp_statements namespacedef '{' $@2 imp_statements '}'  */
-#line 354 "tools/widl/parser.y"
-                                                { pop_namespace((yyvsp[-4].str)); (yyval.stmt_list) = append_statements((yyvsp[-5].stmt_list), (yyvsp[-1].stmt_list)); }
-#line 3221 "tools/widl/parser.tab.c"
-    break;
-
-  case 19: /* imp_statements: imp_statements interfacedef  */
 #line 355 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type))); }
-#line 3227 "tools/widl/parser.tab.c"
-    break;
-
-  case 20: /* imp_statements: imp_statements coclass ';'  */
-#line 356 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = (yyvsp[-2].stmt_list); reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
-#line 3233 "tools/widl/parser.tab.c"
-    break;
-
-  case 21: /* imp_statements: imp_statements coclassdef  */
-#line 357 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
 						  reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0);
 						}
+#line 3210 "tools/widl/parser.tab.c"
+    break;
+
+  case 12: /* gbl_statements: gbl_statements apicontract ';'  */
+#line 358 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-2].stmt_list), make_statement_type_decl((yyvsp[-1].type)));
+	                                          reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
+#line 3217 "tools/widl/parser.tab.c"
+    break;
+
+  case 13: /* gbl_statements: gbl_statements moduledef  */
+#line 360 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_module((yyvsp[0].type))); }
+#line 3223 "tools/widl/parser.tab.c"
+    break;
+
+  case 14: /* gbl_statements: gbl_statements librarydef  */
+#line 361 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_library((yyvsp[0].typelib))); }
+#line 3229 "tools/widl/parser.tab.c"
+    break;
+
+  case 15: /* gbl_statements: gbl_statements statement  */
+#line 362 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
+#line 3235 "tools/widl/parser.tab.c"
+    break;
+
+  case 16: /* imp_statements: %empty  */
+#line 365 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = NULL; }
 #line 3241 "tools/widl/parser.tab.c"
     break;
 
-  case 22: /* imp_statements: imp_statements moduledef  */
-#line 360 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_module((yyvsp[0].type))); }
+  case 17: /* imp_statements: imp_statements interfacedec  */
+#line 366 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_reference((yyvsp[0].type))); }
 #line 3247 "tools/widl/parser.tab.c"
     break;
 
-  case 23: /* imp_statements: imp_statements statement  */
-#line 361 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
+  case 18: /* $@2: %empty  */
+#line 367 "tools/widl/parser.y"
+                                          { push_namespace((yyvsp[-1].str)); }
 #line 3253 "tools/widl/parser.tab.c"
     break;
 
-  case 24: /* imp_statements: imp_statements importlib  */
-#line 362 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_importlib((yyvsp[0].str))); }
+  case 19: /* imp_statements: imp_statements namespacedef '{' $@2 imp_statements '}'  */
+#line 368 "tools/widl/parser.y"
+                                                { pop_namespace((yyvsp[-4].str)); (yyval.stmt_list) = append_statements((yyvsp[-5].stmt_list), (yyvsp[-1].stmt_list)); }
 #line 3259 "tools/widl/parser.tab.c"
     break;
 
-  case 25: /* imp_statements: imp_statements librarydef  */
-#line 363 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_library((yyvsp[0].typelib))); }
+  case 20: /* imp_statements: imp_statements interfacedef  */
+#line 369 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type))); }
 #line 3265 "tools/widl/parser.tab.c"
     break;
 
-  case 26: /* int_statements: %empty  */
-#line 366 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = NULL; }
+  case 21: /* imp_statements: imp_statements coclass ';'  */
+#line 370 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = (yyvsp[-2].stmt_list); reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
 #line 3271 "tools/widl/parser.tab.c"
     break;
 
-  case 27: /* int_statements: int_statements statement  */
-#line 367 "tools/widl/parser.y"
-                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
-#line 3277 "tools/widl/parser.tab.c"
+  case 22: /* imp_statements: imp_statements coclassdef  */
+#line 371 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
+						  reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0);
+						}
+#line 3279 "tools/widl/parser.tab.c"
     break;
 
-  case 30: /* statement: cppquote  */
-#line 375 "tools/widl/parser.y"
-                                                { (yyval.statement) = make_statement_cppquote((yyvsp[0].str)); }
-#line 3283 "tools/widl/parser.tab.c"
+  case 23: /* imp_statements: imp_statements apicontract ';'  */
+#line 374 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-2].stmt_list), make_statement_type_decl((yyvsp[-1].type)));
+	                                          reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
+#line 3286 "tools/widl/parser.tab.c"
     break;
 
-  case 31: /* statement: typedecl ';'  */
+  case 24: /* imp_statements: imp_statements moduledef  */
 #line 376 "tools/widl/parser.y"
-                                                { (yyval.statement) = make_statement_type_decl((yyvsp[-1].type)); }
-#line 3289 "tools/widl/parser.tab.c"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_module((yyvsp[0].type))); }
+#line 3292 "tools/widl/parser.tab.c"
     break;
 
-  case 32: /* statement: declaration ';'  */
+  case 25: /* imp_statements: imp_statements statement  */
 #line 377 "tools/widl/parser.y"
-                                                { (yyval.statement) = make_statement_declaration((yyvsp[-1].var)); }
-#line 3295 "tools/widl/parser.tab.c"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
+#line 3298 "tools/widl/parser.tab.c"
     break;
 
-  case 33: /* statement: import  */
+  case 26: /* imp_statements: imp_statements importlib  */
 #line 378 "tools/widl/parser.y"
-                                                { (yyval.statement) = make_statement_import((yyvsp[0].str)); }
-#line 3301 "tools/widl/parser.tab.c"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_importlib((yyvsp[0].str))); }
+#line 3304 "tools/widl/parser.tab.c"
     break;
 
-  case 34: /* statement: typedef ';'  */
+  case 27: /* imp_statements: imp_statements librarydef  */
 #line 379 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_library((yyvsp[0].typelib))); }
+#line 3310 "tools/widl/parser.tab.c"
+    break;
+
+  case 28: /* int_statements: %empty  */
+#line 382 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = NULL; }
+#line 3316 "tools/widl/parser.tab.c"
+    break;
+
+  case 29: /* int_statements: int_statements statement  */
+#line 383 "tools/widl/parser.y"
+                                                { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
+#line 3322 "tools/widl/parser.tab.c"
+    break;
+
+  case 32: /* statement: cppquote  */
+#line 391 "tools/widl/parser.y"
+                                                { (yyval.statement) = make_statement_cppquote((yyvsp[0].str)); }
+#line 3328 "tools/widl/parser.tab.c"
+    break;
+
+  case 33: /* statement: typedecl ';'  */
+#line 392 "tools/widl/parser.y"
+                                                { (yyval.statement) = make_statement_type_decl((yyvsp[-1].type)); }
+#line 3334 "tools/widl/parser.tab.c"
+    break;
+
+  case 34: /* statement: declaration ';'  */
+#line 393 "tools/widl/parser.y"
+                                                { (yyval.statement) = make_statement_declaration((yyvsp[-1].var)); }
+#line 3340 "tools/widl/parser.tab.c"
+    break;
+
+  case 35: /* statement: import  */
+#line 394 "tools/widl/parser.y"
+                                                { (yyval.statement) = make_statement_import((yyvsp[0].str)); }
+#line 3346 "tools/widl/parser.tab.c"
+    break;
+
+  case 36: /* statement: typedef ';'  */
+#line 395 "tools/widl/parser.y"
                                                 { (yyval.statement) = (yyvsp[-1].statement); }
-#line 3307 "tools/widl/parser.tab.c"
+#line 3352 "tools/widl/parser.tab.c"
     break;
 
-  case 35: /* statement: aPRAGMA  */
-#line 380 "tools/widl/parser.y"
+  case 37: /* statement: aPRAGMA  */
+#line 396 "tools/widl/parser.y"
                                                 { (yyval.statement) = make_statement_pragma((yyvsp[0].str)); }
-#line 3313 "tools/widl/parser.tab.c"
+#line 3358 "tools/widl/parser.tab.c"
     break;
 
-  case 36: /* statement: pragma_warning  */
-#line 381 "tools/widl/parser.y"
+  case 38: /* statement: pragma_warning  */
+#line 397 "tools/widl/parser.y"
                          { (yyval.statement) = NULL; }
-#line 3319 "tools/widl/parser.tab.c"
+#line 3364 "tools/widl/parser.tab.c"
     break;
 
-  case 37: /* pragma_warning: tPRAGMA_WARNING '(' aIDENTIFIER ':' warnings ')'  */
-#line 385 "tools/widl/parser.y"
+  case 39: /* pragma_warning: tPRAGMA_WARNING '(' aIDENTIFIER ':' warnings ')'  */
+#line 401 "tools/widl/parser.y"
                   {
                       int result;
                       (yyval.statement) = NULL;
@@ -3327,909 +3372,949 @@
                       if(!result)
                           error_loc("expected \"disable\" or \"enable\"\n");
                   }
-#line 3331 "tools/widl/parser.tab.c"
+#line 3376 "tools/widl/parser.tab.c"
     break;
 
-  case 38: /* warnings: aNUM  */
-#line 395 "tools/widl/parser.y"
-               { (yyval.warning_list) = append_warning(NULL, (yyvsp[0].num)); }
-#line 3337 "tools/widl/parser.tab.c"
-    break;
-
-  case 39: /* warnings: warnings aNUM  */
-#line 396 "tools/widl/parser.y"
-                        { (yyval.warning_list) = append_warning((yyvsp[-1].warning_list), (yyvsp[0].num)); }
-#line 3343 "tools/widl/parser.tab.c"
-    break;
-
-  case 41: /* typedecl: tENUM aIDENTIFIER  */
-#line 401 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_enum((yyvsp[0].str), current_namespace, FALSE, NULL); }
-#line 3349 "tools/widl/parser.tab.c"
-    break;
-
-  case 43: /* typedecl: tSTRUCT aIDENTIFIER  */
-#line 403 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_struct((yyvsp[0].str), current_namespace, FALSE, NULL); }
-#line 3355 "tools/widl/parser.tab.c"
-    break;
-
-  case 45: /* typedecl: tUNION aIDENTIFIER  */
-#line 405 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_nonencapsulated_union((yyvsp[0].str), FALSE, NULL); }
-#line 3361 "tools/widl/parser.tab.c"
-    break;
-
-  case 46: /* typedecl: attributes enumdef  */
-#line 406 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[0].type); (yyval.type)->attrs = check_enum_attrs((yyvsp[-1].attr_list)); }
-#line 3367 "tools/widl/parser.tab.c"
-    break;
-
-  case 47: /* typedecl: attributes structdef  */
-#line 407 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[0].type); (yyval.type)->attrs = check_struct_attrs((yyvsp[-1].attr_list)); }
-#line 3373 "tools/widl/parser.tab.c"
-    break;
-
-  case 48: /* typedecl: attributes uniondef  */
-#line 408 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[0].type); (yyval.type)->attrs = check_union_attrs((yyvsp[-1].attr_list)); }
-#line 3379 "tools/widl/parser.tab.c"
-    break;
-
-  case 49: /* cppquote: tCPPQUOTE '(' aSTRING ')'  */
+  case 40: /* warnings: aNUM  */
 #line 411 "tools/widl/parser.y"
-                                                { (yyval.str) = (yyvsp[-1].str); }
-#line 3385 "tools/widl/parser.tab.c"
+               { (yyval.warning_list) = append_warning(NULL, (yyvsp[0].num)); }
+#line 3382 "tools/widl/parser.tab.c"
     break;
 
-  case 50: /* import_start: tIMPORT aSTRING ';'  */
-#line 413 "tools/widl/parser.y"
+  case 41: /* warnings: warnings aNUM  */
+#line 412 "tools/widl/parser.y"
+                        { (yyval.warning_list) = append_warning((yyvsp[-1].warning_list), (yyvsp[0].num)); }
+#line 3388 "tools/widl/parser.tab.c"
+    break;
+
+  case 43: /* typedecl: tENUM aIDENTIFIER  */
+#line 417 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_enum((yyvsp[0].str), current_namespace, FALSE, NULL); }
+#line 3394 "tools/widl/parser.tab.c"
+    break;
+
+  case 45: /* typedecl: tSTRUCT aIDENTIFIER  */
+#line 419 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_struct((yyvsp[0].str), current_namespace, FALSE, NULL); }
+#line 3400 "tools/widl/parser.tab.c"
+    break;
+
+  case 47: /* typedecl: tUNION aIDENTIFIER  */
+#line 421 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_nonencapsulated_union((yyvsp[0].str), FALSE, NULL); }
+#line 3406 "tools/widl/parser.tab.c"
+    break;
+
+  case 48: /* typedecl: attributes enumdef  */
+#line 422 "tools/widl/parser.y"
+                                                { (yyval.type) = (yyvsp[0].type); (yyval.type)->attrs = check_enum_attrs((yyvsp[-1].attr_list)); }
+#line 3412 "tools/widl/parser.tab.c"
+    break;
+
+  case 49: /* typedecl: attributes structdef  */
+#line 423 "tools/widl/parser.y"
+                                                { (yyval.type) = (yyvsp[0].type); (yyval.type)->attrs = check_struct_attrs((yyvsp[-1].attr_list)); }
+#line 3418 "tools/widl/parser.tab.c"
+    break;
+
+  case 50: /* typedecl: attributes uniondef  */
+#line 424 "tools/widl/parser.y"
+                                                { (yyval.type) = (yyvsp[0].type); (yyval.type)->attrs = check_union_attrs((yyvsp[-1].attr_list)); }
+#line 3424 "tools/widl/parser.tab.c"
+    break;
+
+  case 51: /* cppquote: tCPPQUOTE '(' aSTRING ')'  */
+#line 427 "tools/widl/parser.y"
+                                                { (yyval.str) = (yyvsp[-1].str); }
+#line 3430 "tools/widl/parser.tab.c"
+    break;
+
+  case 52: /* import_start: tIMPORT aSTRING ';'  */
+#line 429 "tools/widl/parser.y"
                                                 { assert(yychar == YYEMPTY);
 						  (yyval.import) = xmalloc(sizeof(struct _import_t));
 						  (yyval.import)->name = (yyvsp[-1].str);
 						  (yyval.import)->import_performed = do_import((yyvsp[-1].str));
 						  if (!(yyval.import)->import_performed) yychar = aEOF;
 						}
-#line 3396 "tools/widl/parser.tab.c"
+#line 3441 "tools/widl/parser.tab.c"
     break;
 
-  case 51: /* import: import_start imp_statements aEOF  */
-#line 421 "tools/widl/parser.y"
+  case 53: /* import: import_start imp_statements aEOF  */
+#line 437 "tools/widl/parser.y"
                                                 { (yyval.str) = (yyvsp[-2].import)->name;
 						  if ((yyvsp[-2].import)->import_performed) pop_import();
 						  free((yyvsp[-2].import));
 						}
-#line 3405 "tools/widl/parser.tab.c"
+#line 3450 "tools/widl/parser.tab.c"
     break;
 
-  case 52: /* importlib: tIMPORTLIB '(' aSTRING ')' semicolon_opt  */
-#line 428 "tools/widl/parser.y"
+  case 54: /* importlib: tIMPORTLIB '(' aSTRING ')' semicolon_opt  */
+#line 444 "tools/widl/parser.y"
                                                 { (yyval.str) = (yyvsp[-2].str); if(!parse_only) add_importlib((yyvsp[-2].str), current_typelib); }
-#line 3411 "tools/widl/parser.tab.c"
+#line 3456 "tools/widl/parser.tab.c"
     break;
 
-  case 53: /* libraryhdr: tLIBRARY aIDENTIFIER  */
-#line 431 "tools/widl/parser.y"
+  case 55: /* libraryhdr: tLIBRARY aIDENTIFIER  */
+#line 447 "tools/widl/parser.y"
                                                 { (yyval.str) = (yyvsp[0].str); }
-#line 3417 "tools/widl/parser.tab.c"
+#line 3462 "tools/widl/parser.tab.c"
     break;
 
-  case 54: /* libraryhdr: tLIBRARY aKNOWNTYPE  */
-#line 432 "tools/widl/parser.y"
+  case 56: /* libraryhdr: tLIBRARY aKNOWNTYPE  */
+#line 448 "tools/widl/parser.y"
                                                 { (yyval.str) = (yyvsp[0].str); }
-#line 3423 "tools/widl/parser.tab.c"
+#line 3468 "tools/widl/parser.tab.c"
     break;
 
-  case 55: /* library_start: attributes libraryhdr '{'  */
-#line 434 "tools/widl/parser.y"
+  case 57: /* library_start: attributes libraryhdr '{'  */
+#line 450 "tools/widl/parser.y"
                                                 { (yyval.typelib) = make_library((yyvsp[-1].str), check_library_attrs((yyvsp[-1].str), (yyvsp[-2].attr_list)));
 						  if (!parse_only && do_typelib) current_typelib = (yyval.typelib);
 						}
-#line 3431 "tools/widl/parser.tab.c"
+#line 3476 "tools/widl/parser.tab.c"
     break;
 
-  case 56: /* librarydef: library_start imp_statements '}' semicolon_opt  */
-#line 439 "tools/widl/parser.y"
-                                                { (yyval.typelib) = (yyvsp[-3].typelib); (yyval.typelib)->stmts = (yyvsp[-2].stmt_list); }
-#line 3437 "tools/widl/parser.tab.c"
-    break;
-
-  case 57: /* m_args: %empty  */
-#line 442 "tools/widl/parser.y"
-                                                { (yyval.var_list) = NULL; }
-#line 3443 "tools/widl/parser.tab.c"
-    break;
-
-  case 59: /* arg_list: arg  */
-#line 446 "tools/widl/parser.y"
-                                                { check_arg_attrs((yyvsp[0].var)); (yyval.var_list) = append_var( NULL, (yyvsp[0].var) ); }
-#line 3449 "tools/widl/parser.tab.c"
-    break;
-
-  case 60: /* arg_list: arg_list ',' arg  */
-#line 447 "tools/widl/parser.y"
-                                                { check_arg_attrs((yyvsp[0].var)); (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[0].var) ); }
-#line 3455 "tools/widl/parser.tab.c"
-    break;
-
-  case 62: /* args: arg_list ',' ELLIPSIS  */
-#line 451 "tools/widl/parser.y"
-                                                { (yyval.var_list) = append_var( (yyvsp[-2].var_list), make_var(strdup("...")) ); }
-#line 3461 "tools/widl/parser.tab.c"
-    break;
-
-  case 63: /* arg: attributes decl_spec m_any_declarator  */
+  case 58: /* librarydef: library_start imp_statements '}' semicolon_opt  */
 #line 455 "tools/widl/parser.y"
+                                                { (yyval.typelib) = (yyvsp[-3].typelib); (yyval.typelib)->stmts = (yyvsp[-2].stmt_list); }
+#line 3482 "tools/widl/parser.tab.c"
+    break;
+
+  case 59: /* m_args: %empty  */
+#line 458 "tools/widl/parser.y"
+                                                { (yyval.var_list) = NULL; }
+#line 3488 "tools/widl/parser.tab.c"
+    break;
+
+  case 61: /* arg_list: arg  */
+#line 462 "tools/widl/parser.y"
+                                                { check_arg_attrs((yyvsp[0].var)); (yyval.var_list) = append_var( NULL, (yyvsp[0].var) ); }
+#line 3494 "tools/widl/parser.tab.c"
+    break;
+
+  case 62: /* arg_list: arg_list ',' arg  */
+#line 463 "tools/widl/parser.y"
+                                                { check_arg_attrs((yyvsp[0].var)); (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[0].var) ); }
+#line 3500 "tools/widl/parser.tab.c"
+    break;
+
+  case 64: /* args: arg_list ',' ELLIPSIS  */
+#line 467 "tools/widl/parser.y"
+                                                { (yyval.var_list) = append_var( (yyvsp[-2].var_list), make_var(strdup("...")) ); }
+#line 3506 "tools/widl/parser.tab.c"
+    break;
+
+  case 65: /* arg: attributes decl_spec m_any_declarator  */
+#line 471 "tools/widl/parser.y"
                                                 { if ((yyvsp[-1].declspec)->stgclass != STG_NONE && (yyvsp[-1].declspec)->stgclass != STG_REGISTER)
 						    error_loc("invalid storage class for function parameter\n");
 						  (yyval.var) = declare_var((yyvsp[-2].attr_list), (yyvsp[-1].declspec), (yyvsp[0].declarator), TRUE);
 						  free((yyvsp[-1].declspec)); free((yyvsp[0].declarator));
 						}
-#line 3471 "tools/widl/parser.tab.c"
+#line 3516 "tools/widl/parser.tab.c"
     break;
 
-  case 64: /* arg: decl_spec m_any_declarator  */
-#line 460 "tools/widl/parser.y"
+  case 66: /* arg: decl_spec m_any_declarator  */
+#line 476 "tools/widl/parser.y"
                                                 { if ((yyvsp[-1].declspec)->stgclass != STG_NONE && (yyvsp[-1].declspec)->stgclass != STG_REGISTER)
 						    error_loc("invalid storage class for function parameter\n");
 						  (yyval.var) = declare_var(NULL, (yyvsp[-1].declspec), (yyvsp[0].declarator), TRUE);
 						  free((yyvsp[-1].declspec)); free((yyvsp[0].declarator));
 						}
-#line 3481 "tools/widl/parser.tab.c"
+#line 3526 "tools/widl/parser.tab.c"
     break;
 
-  case 65: /* array: '[' expr ']'  */
-#line 467 "tools/widl/parser.y"
+  case 67: /* array: '[' expr ']'  */
+#line 483 "tools/widl/parser.y"
                                                 { (yyval.expr) = (yyvsp[-1].expr);
 						  if (!(yyval.expr)->is_const || (yyval.expr)->cval <= 0)
 						      error_loc("array dimension is not a positive integer constant\n");
 						}
-#line 3490 "tools/widl/parser.tab.c"
+#line 3535 "tools/widl/parser.tab.c"
     break;
 
-  case 66: /* array: '[' '*' ']'  */
-#line 471 "tools/widl/parser.y"
+  case 68: /* array: '[' '*' ']'  */
+#line 487 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr(EXPR_VOID); }
-#line 3496 "tools/widl/parser.tab.c"
+#line 3541 "tools/widl/parser.tab.c"
     break;
 
-  case 67: /* array: '[' ']'  */
-#line 472 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr(EXPR_VOID); }
-#line 3502 "tools/widl/parser.tab.c"
-    break;
-
-  case 68: /* m_attributes: %empty  */
-#line 475 "tools/widl/parser.y"
-                                                { (yyval.attr_list) = NULL; }
-#line 3508 "tools/widl/parser.tab.c"
-    break;
-
-  case 70: /* attributes: '[' attrib_list ']'  */
-#line 480 "tools/widl/parser.y"
-                                                { (yyval.attr_list) = (yyvsp[-1].attr_list); }
-#line 3514 "tools/widl/parser.tab.c"
-    break;
-
-  case 71: /* attrib_list: attribute  */
-#line 483 "tools/widl/parser.y"
-                                                { (yyval.attr_list) = append_attr( NULL, (yyvsp[0].attr) ); }
-#line 3520 "tools/widl/parser.tab.c"
-    break;
-
-  case 72: /* attrib_list: attrib_list ',' attribute  */
-#line 484 "tools/widl/parser.y"
-                                                { (yyval.attr_list) = append_attr( (yyvsp[-2].attr_list), (yyvsp[0].attr) ); }
-#line 3526 "tools/widl/parser.tab.c"
-    break;
-
-  case 73: /* attrib_list: attrib_list ']' '[' attribute  */
-#line 485 "tools/widl/parser.y"
-                                                { (yyval.attr_list) = append_attr( (yyvsp[-3].attr_list), (yyvsp[0].attr) ); }
-#line 3532 "tools/widl/parser.tab.c"
-    break;
-
-  case 74: /* str_list: aSTRING  */
+  case 69: /* array: '[' ']'  */
 #line 488 "tools/widl/parser.y"
-                                                { (yyval.str_list) = append_str( NULL, (yyvsp[0].str) ); }
-#line 3538 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr(EXPR_VOID); }
+#line 3547 "tools/widl/parser.tab.c"
     break;
 
-  case 75: /* str_list: str_list ',' aSTRING  */
-#line 489 "tools/widl/parser.y"
-                                                { (yyval.str_list) = append_str( (yyvsp[-2].str_list), (yyvsp[0].str) ); }
-#line 3544 "tools/widl/parser.tab.c"
+  case 70: /* m_attributes: %empty  */
+#line 491 "tools/widl/parser.y"
+                                                { (yyval.attr_list) = NULL; }
+#line 3553 "tools/widl/parser.tab.c"
     break;
 
-  case 76: /* attribute: %empty  */
-#line 492 "tools/widl/parser.y"
-                                                { (yyval.attr) = NULL; }
-#line 3550 "tools/widl/parser.tab.c"
-    break;
-
-  case 77: /* attribute: tAGGREGATABLE  */
-#line 493 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_AGGREGATABLE); }
-#line 3556 "tools/widl/parser.tab.c"
-    break;
-
-  case 78: /* attribute: tANNOTATION '(' aSTRING ')'  */
-#line 494 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_ANNOTATION, (yyvsp[-1].str)); }
-#line 3562 "tools/widl/parser.tab.c"
-    break;
-
-  case 79: /* attribute: tAPPOBJECT  */
-#line 495 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_APPOBJECT); }
-#line 3568 "tools/widl/parser.tab.c"
-    break;
-
-  case 80: /* attribute: tASYNC  */
+  case 72: /* attributes: '[' attrib_list ']'  */
 #line 496 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_ASYNC); }
-#line 3574 "tools/widl/parser.tab.c"
+                                                { (yyval.attr_list) = (yyvsp[-1].attr_list); }
+#line 3559 "tools/widl/parser.tab.c"
     break;
 
-  case 81: /* attribute: tAUTOHANDLE  */
-#line 497 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_AUTO_HANDLE); }
-#line 3580 "tools/widl/parser.tab.c"
-    break;
-
-  case 82: /* attribute: tBINDABLE  */
-#line 498 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_BINDABLE); }
-#line 3586 "tools/widl/parser.tab.c"
-    break;
-
-  case 83: /* attribute: tBROADCAST  */
+  case 73: /* attrib_list: attribute  */
 #line 499 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_BROADCAST); }
-#line 3592 "tools/widl/parser.tab.c"
+                                                { (yyval.attr_list) = append_attr( NULL, (yyvsp[0].attr) ); }
+#line 3565 "tools/widl/parser.tab.c"
     break;
 
-  case 84: /* attribute: tCALLAS '(' ident ')'  */
+  case 74: /* attrib_list: attrib_list ',' attribute  */
 #line 500 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_CALLAS, (yyvsp[-1].var)); }
-#line 3598 "tools/widl/parser.tab.c"
+                                                { (yyval.attr_list) = append_attr( (yyvsp[-2].attr_list), (yyvsp[0].attr) ); }
+#line 3571 "tools/widl/parser.tab.c"
     break;
 
-  case 85: /* attribute: tCASE '(' expr_list_int_const ')'  */
+  case 75: /* attrib_list: attrib_list ']' '[' attribute  */
 #line 501 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_CASE, (yyvsp[-1].expr_list)); }
-#line 3604 "tools/widl/parser.tab.c"
+                                                { (yyval.attr_list) = append_attr( (yyvsp[-3].attr_list), (yyvsp[0].attr) ); }
+#line 3577 "tools/widl/parser.tab.c"
     break;
 
-  case 86: /* attribute: tCODE  */
-#line 502 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_CODE); }
-#line 3610 "tools/widl/parser.tab.c"
-    break;
-
-  case 87: /* attribute: tCOMMSTATUS  */
-#line 503 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_COMMSTATUS); }
-#line 3616 "tools/widl/parser.tab.c"
-    break;
-
-  case 88: /* attribute: tCONTEXTHANDLE  */
+  case 76: /* str_list: aSTRING  */
 #line 504 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); }
-#line 3622 "tools/widl/parser.tab.c"
+                                                { (yyval.str_list) = append_str( NULL, (yyvsp[0].str) ); }
+#line 3583 "tools/widl/parser.tab.c"
     break;
 
-  case 89: /* attribute: tCONTEXTHANDLENOSERIALIZE  */
+  case 77: /* str_list: str_list ',' aSTRING  */
 #line 505 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_DONT_SERIALIZE */ }
-#line 3628 "tools/widl/parser.tab.c"
+                                                { (yyval.str_list) = append_str( (yyvsp[-2].str_list), (yyvsp[0].str) ); }
+#line 3589 "tools/widl/parser.tab.c"
     break;
 
-  case 90: /* attribute: tCONTEXTHANDLESERIALIZE  */
-#line 506 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_SERIALIZE */ }
-#line 3634 "tools/widl/parser.tab.c"
-    break;
-
-  case 91: /* attribute: tCONTROL  */
-#line 507 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_CONTROL); }
-#line 3640 "tools/widl/parser.tab.c"
-    break;
-
-  case 92: /* attribute: tDECODE  */
-#line 508 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_DECODE); }
-#line 3646 "tools/widl/parser.tab.c"
-    break;
-
-  case 93: /* attribute: tDEFAULT  */
+  case 78: /* contract_ver: aNUM  */
 #line 509 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_DEFAULT); }
-#line 3652 "tools/widl/parser.tab.c"
+                                                { (yyval.num) = MAKEVERSION(0, (yyvsp[0].num)); }
+#line 3595 "tools/widl/parser.tab.c"
     break;
 
-  case 94: /* attribute: tDEFAULTBIND  */
+  case 79: /* contract_ver: aNUM '.' aNUM  */
 #line 510 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_DEFAULTBIND); }
-#line 3658 "tools/widl/parser.tab.c"
+                                                { (yyval.num) = MAKEVERSION((yyvsp[0].num), (yyvsp[-2].num)); }
+#line 3601 "tools/widl/parser.tab.c"
     break;
 
-  case 95: /* attribute: tDEFAULTCOLLELEM  */
-#line 511 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_DEFAULTCOLLELEM); }
-#line 3664 "tools/widl/parser.tab.c"
-    break;
-
-  case 96: /* attribute: tDEFAULTVALUE '(' expr_const ')'  */
-#line 512 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_DEFAULTVALUE, (yyvsp[-1].expr)); }
-#line 3670 "tools/widl/parser.tab.c"
-    break;
-
-  case 97: /* attribute: tDEFAULTVTABLE  */
+  case 80: /* contract_req: decl_spec ',' contract_ver  */
 #line 513 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_DEFAULTVTABLE); }
-#line 3676 "tools/widl/parser.tab.c"
+                                                { if ((yyvsp[-2].declspec)->type->type_type != TYPE_APICONTRACT)
+						      error_loc("type %s is not an apicontract\n", (yyvsp[-2].declspec)->type->name);
+						  (yyval.expr) = make_exprl(EXPR_NUM, (yyvsp[0].num));
+						  (yyval.expr) = make_exprt(EXPR_GTREQL, declare_var(NULL, (yyvsp[-2].declspec), make_declarator(NULL), 0), (yyval.expr));
+						}
+#line 3611 "tools/widl/parser.tab.c"
     break;
 
-  case 98: /* attribute: tDISABLECONSISTENCYCHECK  */
-#line 514 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_DISABLECONSISTENCYCHECK); }
-#line 3682 "tools/widl/parser.tab.c"
-    break;
-
-  case 99: /* attribute: tDISPLAYBIND  */
-#line 515 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_DISPLAYBIND); }
-#line 3688 "tools/widl/parser.tab.c"
-    break;
-
-  case 100: /* attribute: tDLLNAME '(' aSTRING ')'  */
-#line 516 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_DLLNAME, (yyvsp[-1].str)); }
-#line 3694 "tools/widl/parser.tab.c"
-    break;
-
-  case 101: /* attribute: tDUAL  */
-#line 517 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_DUAL); }
-#line 3700 "tools/widl/parser.tab.c"
-    break;
-
-  case 102: /* attribute: tENABLEALLOCATE  */
-#line 518 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_ENABLEALLOCATE); }
-#line 3706 "tools/widl/parser.tab.c"
-    break;
-
-  case 103: /* attribute: tENCODE  */
+  case 81: /* attribute: %empty  */
 #line 519 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_ENCODE); }
-#line 3712 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = NULL; }
+#line 3617 "tools/widl/parser.tab.c"
     break;
 
-  case 104: /* attribute: tENDPOINT '(' str_list ')'  */
+  case 82: /* attribute: tAGGREGATABLE  */
 #line 520 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_ENDPOINT, (yyvsp[-1].str_list)); }
-#line 3718 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_AGGREGATABLE); }
+#line 3623 "tools/widl/parser.tab.c"
     break;
 
-  case 105: /* attribute: tENTRY '(' expr_const ')'  */
+  case 83: /* attribute: tANNOTATION '(' aSTRING ')'  */
 #line 521 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_ENTRY, (yyvsp[-1].expr)); }
-#line 3724 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_ANNOTATION, (yyvsp[-1].str)); }
+#line 3629 "tools/widl/parser.tab.c"
     break;
 
-  case 106: /* attribute: tEXPLICITHANDLE  */
+  case 84: /* attribute: tAPPOBJECT  */
 #line 522 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_EXPLICIT_HANDLE); }
-#line 3730 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_APPOBJECT); }
+#line 3635 "tools/widl/parser.tab.c"
     break;
 
-  case 107: /* attribute: tFAULTSTATUS  */
+  case 85: /* attribute: tASYNC  */
 #line 523 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_FAULTSTATUS); }
-#line 3736 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_ASYNC); }
+#line 3641 "tools/widl/parser.tab.c"
     break;
 
-  case 108: /* attribute: tFORCEALLOCATE  */
+  case 86: /* attribute: tAUTOHANDLE  */
 #line 524 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_FORCEALLOCATE); }
-#line 3742 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_AUTO_HANDLE); }
+#line 3647 "tools/widl/parser.tab.c"
     break;
 
-  case 109: /* attribute: tHANDLE  */
+  case 87: /* attribute: tBINDABLE  */
 #line 525 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_HANDLE); }
-#line 3748 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_BINDABLE); }
+#line 3653 "tools/widl/parser.tab.c"
     break;
 
-  case 110: /* attribute: tHELPCONTEXT '(' expr_int_const ')'  */
+  case 88: /* attribute: tBROADCAST  */
 #line 526 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_HELPCONTEXT, (yyvsp[-1].expr)); }
-#line 3754 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_BROADCAST); }
+#line 3659 "tools/widl/parser.tab.c"
     break;
 
-  case 111: /* attribute: tHELPFILE '(' aSTRING ')'  */
+  case 89: /* attribute: tCALLAS '(' ident ')'  */
 #line 527 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_HELPFILE, (yyvsp[-1].str)); }
-#line 3760 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_CALLAS, (yyvsp[-1].var)); }
+#line 3665 "tools/widl/parser.tab.c"
     break;
 
-  case 112: /* attribute: tHELPSTRING '(' aSTRING ')'  */
+  case 90: /* attribute: tCASE '(' expr_list_int_const ')'  */
 #line 528 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_HELPSTRING, (yyvsp[-1].str)); }
-#line 3766 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_CASE, (yyvsp[-1].expr_list)); }
+#line 3671 "tools/widl/parser.tab.c"
     break;
 
-  case 113: /* attribute: tHELPSTRINGCONTEXT '(' expr_int_const ')'  */
+  case 91: /* attribute: tCODE  */
 #line 529 "tools/widl/parser.y"
-                                                        { (yyval.attr) = make_attrp(ATTR_HELPSTRINGCONTEXT, (yyvsp[-1].expr)); }
-#line 3772 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_CODE); }
+#line 3677 "tools/widl/parser.tab.c"
     break;
 
-  case 114: /* attribute: tHELPSTRINGDLL '(' aSTRING ')'  */
+  case 92: /* attribute: tCOMMSTATUS  */
 #line 530 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_HELPSTRINGDLL, (yyvsp[-1].str)); }
-#line 3778 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_COMMSTATUS); }
+#line 3683 "tools/widl/parser.tab.c"
     break;
 
-  case 115: /* attribute: tHIDDEN  */
+  case 93: /* attribute: tCONTEXTHANDLE  */
 #line 531 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_HIDDEN); }
-#line 3784 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); }
+#line 3689 "tools/widl/parser.tab.c"
     break;
 
-  case 116: /* attribute: tID '(' expr_int_const ')'  */
+  case 94: /* attribute: tCONTEXTHANDLENOSERIALIZE  */
 #line 532 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_ID, (yyvsp[-1].expr)); }
-#line 3790 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_DONT_SERIALIZE */ }
+#line 3695 "tools/widl/parser.tab.c"
     break;
 
-  case 117: /* attribute: tIDEMPOTENT  */
+  case 95: /* attribute: tCONTEXTHANDLESERIALIZE  */
 #line 533 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_IDEMPOTENT); }
-#line 3796 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_SERIALIZE */ }
+#line 3701 "tools/widl/parser.tab.c"
     break;
 
-  case 118: /* attribute: tIGNORE  */
+  case 96: /* attribute: tCONTRACT '(' contract_req ')'  */
 #line 534 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_IGNORE); }
-#line 3802 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_CONTRACT, (yyvsp[-1].expr)); }
+#line 3707 "tools/widl/parser.tab.c"
     break;
 
-  case 119: /* attribute: tIIDIS '(' expr ')'  */
+  case 97: /* attribute: tCONTRACTVERSION '(' contract_ver ')'  */
 #line 535 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_IIDIS, (yyvsp[-1].expr)); }
-#line 3808 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrv(ATTR_CONTRACTVERSION, (yyvsp[-1].num)); }
+#line 3713 "tools/widl/parser.tab.c"
     break;
 
-  case 120: /* attribute: tIMMEDIATEBIND  */
+  case 98: /* attribute: tCONTROL  */
 #line 536 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_IMMEDIATEBIND); }
-#line 3814 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_CONTROL); }
+#line 3719 "tools/widl/parser.tab.c"
     break;
 
-  case 121: /* attribute: tIMPLICITHANDLE '(' arg ')'  */
+  case 99: /* attribute: tCUSTOM '(' uuid_string ',' expr_const ')'  */
 #line 537 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_IMPLICIT_HANDLE, (yyvsp[-1].var)); }
-#line 3820 "tools/widl/parser.tab.c"
+                                                     { (yyval.attr) = make_custom_attr((yyvsp[-3].uuid), (yyvsp[-1].expr)); }
+#line 3725 "tools/widl/parser.tab.c"
     break;
 
-  case 122: /* attribute: tIN  */
+  case 100: /* attribute: tDECODE  */
 #line 538 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_IN); }
-#line 3826 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_DECODE); }
+#line 3731 "tools/widl/parser.tab.c"
     break;
 
-  case 123: /* attribute: tINPUTSYNC  */
+  case 101: /* attribute: tDEFAULT  */
 #line 539 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_INPUTSYNC); }
-#line 3832 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_DEFAULT); }
+#line 3737 "tools/widl/parser.tab.c"
     break;
 
-  case 124: /* attribute: tLENGTHIS '(' m_exprs ')'  */
+  case 102: /* attribute: tDEFAULTBIND  */
 #line 540 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_LENGTHIS, (yyvsp[-1].expr_list)); }
-#line 3838 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_DEFAULTBIND); }
+#line 3743 "tools/widl/parser.tab.c"
     break;
 
-  case 125: /* attribute: tLCID '(' expr_int_const ')'  */
+  case 103: /* attribute: tDEFAULTCOLLELEM  */
 #line 541 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_LIBLCID, (yyvsp[-1].expr)); }
-#line 3844 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_DEFAULTCOLLELEM); }
+#line 3749 "tools/widl/parser.tab.c"
     break;
 
-  case 126: /* attribute: tLCID  */
+  case 104: /* attribute: tDEFAULTVALUE '(' expr_const ')'  */
 #line 542 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_PARAMLCID); }
-#line 3850 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_DEFAULTVALUE, (yyvsp[-1].expr)); }
+#line 3755 "tools/widl/parser.tab.c"
     break;
 
-  case 127: /* attribute: tLICENSED  */
+  case 105: /* attribute: tDEFAULTVTABLE  */
 #line 543 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_LICENSED); }
-#line 3856 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_DEFAULTVTABLE); }
+#line 3761 "tools/widl/parser.tab.c"
     break;
 
-  case 128: /* attribute: tLOCAL  */
+  case 106: /* attribute: tDISABLECONSISTENCYCHECK  */
 #line 544 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_LOCAL); }
-#line 3862 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_DISABLECONSISTENCYCHECK); }
+#line 3767 "tools/widl/parser.tab.c"
     break;
 
-  case 129: /* attribute: tMAYBE  */
+  case 107: /* attribute: tDISPLAYBIND  */
 #line 545 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_MAYBE); }
-#line 3868 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_DISPLAYBIND); }
+#line 3773 "tools/widl/parser.tab.c"
     break;
 
-  case 130: /* attribute: tMESSAGE  */
+  case 108: /* attribute: tDLLNAME '(' aSTRING ')'  */
 #line 546 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_MESSAGE); }
-#line 3874 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_DLLNAME, (yyvsp[-1].str)); }
+#line 3779 "tools/widl/parser.tab.c"
     break;
 
-  case 131: /* attribute: tNOCODE  */
+  case 109: /* attribute: tDUAL  */
 #line 547 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_NOCODE); }
-#line 3880 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_DUAL); }
+#line 3785 "tools/widl/parser.tab.c"
     break;
 
-  case 132: /* attribute: tNONBROWSABLE  */
+  case 110: /* attribute: tENABLEALLOCATE  */
 #line 548 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_NONBROWSABLE); }
-#line 3886 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_ENABLEALLOCATE); }
+#line 3791 "tools/widl/parser.tab.c"
     break;
 
-  case 133: /* attribute: tNONCREATABLE  */
+  case 111: /* attribute: tENCODE  */
 #line 549 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_NONCREATABLE); }
-#line 3892 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_ENCODE); }
+#line 3797 "tools/widl/parser.tab.c"
     break;
 
-  case 134: /* attribute: tNONEXTENSIBLE  */
+  case 112: /* attribute: tENDPOINT '(' str_list ')'  */
 #line 550 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_NONEXTENSIBLE); }
-#line 3898 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_ENDPOINT, (yyvsp[-1].str_list)); }
+#line 3803 "tools/widl/parser.tab.c"
     break;
 
-  case 135: /* attribute: tNOTIFY  */
+  case 113: /* attribute: tENTRY '(' expr_const ')'  */
 #line 551 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_NOTIFY); }
-#line 3904 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_ENTRY, (yyvsp[-1].expr)); }
+#line 3809 "tools/widl/parser.tab.c"
     break;
 
-  case 136: /* attribute: tNOTIFYFLAG  */
+  case 114: /* attribute: tEXPLICITHANDLE  */
 #line 552 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_NOTIFYFLAG); }
-#line 3910 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_EXPLICIT_HANDLE); }
+#line 3815 "tools/widl/parser.tab.c"
     break;
 
-  case 137: /* attribute: tOBJECT  */
+  case 115: /* attribute: tFAULTSTATUS  */
 #line 553 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_OBJECT); }
-#line 3916 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_FAULTSTATUS); }
+#line 3821 "tools/widl/parser.tab.c"
     break;
 
-  case 138: /* attribute: tODL  */
+  case 116: /* attribute: tFORCEALLOCATE  */
 #line 554 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_ODL); }
-#line 3922 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_FORCEALLOCATE); }
+#line 3827 "tools/widl/parser.tab.c"
     break;
 
-  case 139: /* attribute: tOLEAUTOMATION  */
+  case 117: /* attribute: tHANDLE  */
 #line 555 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_OLEAUTOMATION); }
-#line 3928 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_HANDLE); }
+#line 3833 "tools/widl/parser.tab.c"
     break;
 
-  case 140: /* attribute: tOPTIMIZE '(' aSTRING ')'  */
+  case 118: /* attribute: tHELPCONTEXT '(' expr_int_const ')'  */
 #line 556 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_OPTIMIZE, (yyvsp[-1].str)); }
-#line 3934 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_HELPCONTEXT, (yyvsp[-1].expr)); }
+#line 3839 "tools/widl/parser.tab.c"
     break;
 
-  case 141: /* attribute: tOPTIONAL  */
+  case 119: /* attribute: tHELPFILE '(' aSTRING ')'  */
 #line 557 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_OPTIONAL); }
-#line 3940 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_HELPFILE, (yyvsp[-1].str)); }
+#line 3845 "tools/widl/parser.tab.c"
     break;
 
-  case 142: /* attribute: tOUT  */
+  case 120: /* attribute: tHELPSTRING '(' aSTRING ')'  */
 #line 558 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_OUT); }
-#line 3946 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_HELPSTRING, (yyvsp[-1].str)); }
+#line 3851 "tools/widl/parser.tab.c"
     break;
 
-  case 143: /* attribute: tPARTIALIGNORE  */
+  case 121: /* attribute: tHELPSTRINGCONTEXT '(' expr_int_const ')'  */
 #line 559 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_PARTIALIGNORE); }
-#line 3952 "tools/widl/parser.tab.c"
+                                                        { (yyval.attr) = make_attrp(ATTR_HELPSTRINGCONTEXT, (yyvsp[-1].expr)); }
+#line 3857 "tools/widl/parser.tab.c"
     break;
 
-  case 144: /* attribute: tPOINTERDEFAULT '(' pointer_type ')'  */
+  case 122: /* attribute: tHELPSTRINGDLL '(' aSTRING ')'  */
 #line 560 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrv(ATTR_POINTERDEFAULT, (yyvsp[-1].num)); }
-#line 3958 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_HELPSTRINGDLL, (yyvsp[-1].str)); }
+#line 3863 "tools/widl/parser.tab.c"
     break;
 
-  case 145: /* attribute: tPROGID '(' aSTRING ')'  */
+  case 123: /* attribute: tHIDDEN  */
 #line 561 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attrp(ATTR_PROGID, (yyvsp[-1].str)); }
-#line 3964 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_HIDDEN); }
+#line 3869 "tools/widl/parser.tab.c"
     break;
 
-  case 146: /* attribute: tPROPGET  */
+  case 124: /* attribute: tID '(' expr_int_const ')'  */
 #line 562 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_PROPGET); }
-#line 3970 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_ID, (yyvsp[-1].expr)); }
+#line 3875 "tools/widl/parser.tab.c"
     break;
 
-  case 147: /* attribute: tPROPPUT  */
+  case 125: /* attribute: tIDEMPOTENT  */
 #line 563 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_PROPPUT); }
-#line 3976 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_IDEMPOTENT); }
+#line 3881 "tools/widl/parser.tab.c"
     break;
 
-  case 148: /* attribute: tPROPPUTREF  */
+  case 126: /* attribute: tIGNORE  */
 #line 564 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_PROPPUTREF); }
-#line 3982 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_IGNORE); }
+#line 3887 "tools/widl/parser.tab.c"
     break;
 
-  case 149: /* attribute: tPROXY  */
+  case 127: /* attribute: tIIDIS '(' expr ')'  */
 #line 565 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_PROXY); }
-#line 3988 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attrp(ATTR_IIDIS, (yyvsp[-1].expr)); }
+#line 3893 "tools/widl/parser.tab.c"
     break;
 
-  case 150: /* attribute: tPUBLIC  */
+  case 128: /* attribute: tIMMEDIATEBIND  */
 #line 566 "tools/widl/parser.y"
-                                                { (yyval.attr) = make_attr(ATTR_PUBLIC); }
-#line 3994 "tools/widl/parser.tab.c"
+                                                { (yyval.attr) = make_attr(ATTR_IMMEDIATEBIND); }
+#line 3899 "tools/widl/parser.tab.c"
     break;
 
-  case 151: /* attribute: tRANGE '(' expr_int_const ',' expr_int_const ')'  */
+  case 129: /* attribute: tIMPLICITHANDLE '(' arg ')'  */
+#line 567 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attrp(ATTR_IMPLICIT_HANDLE, (yyvsp[-1].var)); }
+#line 3905 "tools/widl/parser.tab.c"
+    break;
+
+  case 130: /* attribute: tIN  */
 #line 568 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_IN); }
+#line 3911 "tools/widl/parser.tab.c"
+    break;
+
+  case 131: /* attribute: tINPUTSYNC  */
+#line 569 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_INPUTSYNC); }
+#line 3917 "tools/widl/parser.tab.c"
+    break;
+
+  case 132: /* attribute: tLENGTHIS '(' m_exprs ')'  */
+#line 570 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attrp(ATTR_LENGTHIS, (yyvsp[-1].expr_list)); }
+#line 3923 "tools/widl/parser.tab.c"
+    break;
+
+  case 133: /* attribute: tLCID '(' expr_int_const ')'  */
+#line 571 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attrp(ATTR_LIBLCID, (yyvsp[-1].expr)); }
+#line 3929 "tools/widl/parser.tab.c"
+    break;
+
+  case 134: /* attribute: tLCID  */
+#line 572 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_PARAMLCID); }
+#line 3935 "tools/widl/parser.tab.c"
+    break;
+
+  case 135: /* attribute: tLICENSED  */
+#line 573 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_LICENSED); }
+#line 3941 "tools/widl/parser.tab.c"
+    break;
+
+  case 136: /* attribute: tLOCAL  */
+#line 574 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_LOCAL); }
+#line 3947 "tools/widl/parser.tab.c"
+    break;
+
+  case 137: /* attribute: tMAYBE  */
+#line 575 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_MAYBE); }
+#line 3953 "tools/widl/parser.tab.c"
+    break;
+
+  case 138: /* attribute: tMESSAGE  */
+#line 576 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_MESSAGE); }
+#line 3959 "tools/widl/parser.tab.c"
+    break;
+
+  case 139: /* attribute: tNOCODE  */
+#line 577 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_NOCODE); }
+#line 3965 "tools/widl/parser.tab.c"
+    break;
+
+  case 140: /* attribute: tNONBROWSABLE  */
+#line 578 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_NONBROWSABLE); }
+#line 3971 "tools/widl/parser.tab.c"
+    break;
+
+  case 141: /* attribute: tNONCREATABLE  */
+#line 579 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_NONCREATABLE); }
+#line 3977 "tools/widl/parser.tab.c"
+    break;
+
+  case 142: /* attribute: tNONEXTENSIBLE  */
+#line 580 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_NONEXTENSIBLE); }
+#line 3983 "tools/widl/parser.tab.c"
+    break;
+
+  case 143: /* attribute: tNOTIFY  */
+#line 581 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_NOTIFY); }
+#line 3989 "tools/widl/parser.tab.c"
+    break;
+
+  case 144: /* attribute: tNOTIFYFLAG  */
+#line 582 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_NOTIFYFLAG); }
+#line 3995 "tools/widl/parser.tab.c"
+    break;
+
+  case 145: /* attribute: tOBJECT  */
+#line 583 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_OBJECT); }
+#line 4001 "tools/widl/parser.tab.c"
+    break;
+
+  case 146: /* attribute: tODL  */
+#line 584 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_ODL); }
+#line 4007 "tools/widl/parser.tab.c"
+    break;
+
+  case 147: /* attribute: tOLEAUTOMATION  */
+#line 585 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_OLEAUTOMATION); }
+#line 4013 "tools/widl/parser.tab.c"
+    break;
+
+  case 148: /* attribute: tOPTIMIZE '(' aSTRING ')'  */
+#line 586 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attrp(ATTR_OPTIMIZE, (yyvsp[-1].str)); }
+#line 4019 "tools/widl/parser.tab.c"
+    break;
+
+  case 149: /* attribute: tOPTIONAL  */
+#line 587 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_OPTIONAL); }
+#line 4025 "tools/widl/parser.tab.c"
+    break;
+
+  case 150: /* attribute: tOUT  */
+#line 588 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_OUT); }
+#line 4031 "tools/widl/parser.tab.c"
+    break;
+
+  case 151: /* attribute: tPARTIALIGNORE  */
+#line 589 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_PARTIALIGNORE); }
+#line 4037 "tools/widl/parser.tab.c"
+    break;
+
+  case 152: /* attribute: tPOINTERDEFAULT '(' pointer_type ')'  */
+#line 590 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attrv(ATTR_POINTERDEFAULT, (yyvsp[-1].num)); }
+#line 4043 "tools/widl/parser.tab.c"
+    break;
+
+  case 153: /* attribute: tPROGID '(' aSTRING ')'  */
+#line 591 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attrp(ATTR_PROGID, (yyvsp[-1].str)); }
+#line 4049 "tools/widl/parser.tab.c"
+    break;
+
+  case 154: /* attribute: tPROPGET  */
+#line 592 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_PROPGET); }
+#line 4055 "tools/widl/parser.tab.c"
+    break;
+
+  case 155: /* attribute: tPROPPUT  */
+#line 593 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_PROPPUT); }
+#line 4061 "tools/widl/parser.tab.c"
+    break;
+
+  case 156: /* attribute: tPROPPUTREF  */
+#line 594 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_PROPPUTREF); }
+#line 4067 "tools/widl/parser.tab.c"
+    break;
+
+  case 157: /* attribute: tPROXY  */
+#line 595 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_PROXY); }
+#line 4073 "tools/widl/parser.tab.c"
+    break;
+
+  case 158: /* attribute: tPUBLIC  */
+#line 596 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attr(ATTR_PUBLIC); }
+#line 4079 "tools/widl/parser.tab.c"
+    break;
+
+  case 159: /* attribute: tRANGE '(' expr_int_const ',' expr_int_const ')'  */
+#line 598 "tools/widl/parser.y"
                                                 { expr_list_t *list = append_expr( NULL, (yyvsp[-3].expr) );
 						  list = append_expr( list, (yyvsp[-1].expr) );
 						  (yyval.attr) = make_attrp(ATTR_RANGE, list); }
-#line 4002 "tools/widl/parser.tab.c"
+#line 4087 "tools/widl/parser.tab.c"
     break;
 
-  case 152: /* attribute: tREADONLY  */
-#line 571 "tools/widl/parser.y"
+  case 160: /* attribute: tREADONLY  */
+#line 601 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_READONLY); }
-#line 4008 "tools/widl/parser.tab.c"
+#line 4093 "tools/widl/parser.tab.c"
     break;
 
-  case 153: /* attribute: tREPRESENTAS '(' type ')'  */
-#line 572 "tools/widl/parser.y"
+  case 161: /* attribute: tREPRESENTAS '(' type ')'  */
+#line 602 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrp(ATTR_REPRESENTAS, (yyvsp[-1].type)); }
-#line 4014 "tools/widl/parser.tab.c"
+#line 4099 "tools/widl/parser.tab.c"
     break;
 
-  case 154: /* attribute: tREQUESTEDIT  */
-#line 573 "tools/widl/parser.y"
+  case 162: /* attribute: tREQUESTEDIT  */
+#line 603 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_REQUESTEDIT); }
-#line 4020 "tools/widl/parser.tab.c"
+#line 4105 "tools/widl/parser.tab.c"
     break;
 
-  case 155: /* attribute: tRESTRICTED  */
-#line 574 "tools/widl/parser.y"
+  case 163: /* attribute: tRESTRICTED  */
+#line 604 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_RESTRICTED); }
-#line 4026 "tools/widl/parser.tab.c"
+#line 4111 "tools/widl/parser.tab.c"
     break;
 
-  case 156: /* attribute: tRETVAL  */
-#line 575 "tools/widl/parser.y"
+  case 164: /* attribute: tRETVAL  */
+#line 605 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_RETVAL); }
-#line 4032 "tools/widl/parser.tab.c"
+#line 4117 "tools/widl/parser.tab.c"
     break;
 
-  case 157: /* attribute: tSIZEIS '(' m_exprs ')'  */
-#line 576 "tools/widl/parser.y"
+  case 165: /* attribute: tSIZEIS '(' m_exprs ')'  */
+#line 606 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrp(ATTR_SIZEIS, (yyvsp[-1].expr_list)); }
-#line 4038 "tools/widl/parser.tab.c"
+#line 4123 "tools/widl/parser.tab.c"
     break;
 
-  case 158: /* attribute: tSOURCE  */
-#line 577 "tools/widl/parser.y"
+  case 166: /* attribute: tSOURCE  */
+#line 607 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_SOURCE); }
-#line 4044 "tools/widl/parser.tab.c"
+#line 4129 "tools/widl/parser.tab.c"
     break;
 
-  case 159: /* attribute: tSTRICTCONTEXTHANDLE  */
-#line 578 "tools/widl/parser.y"
+  case 167: /* attribute: tSTRICTCONTEXTHANDLE  */
+#line 608 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_STRICTCONTEXTHANDLE); }
-#line 4050 "tools/widl/parser.tab.c"
+#line 4135 "tools/widl/parser.tab.c"
     break;
 
-  case 160: /* attribute: tSTRING  */
-#line 579 "tools/widl/parser.y"
+  case 168: /* attribute: tSTRING  */
+#line 609 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_STRING); }
-#line 4056 "tools/widl/parser.tab.c"
+#line 4141 "tools/widl/parser.tab.c"
     break;
 
-  case 161: /* attribute: tSWITCHIS '(' expr ')'  */
-#line 580 "tools/widl/parser.y"
+  case 169: /* attribute: tSWITCHIS '(' expr ')'  */
+#line 610 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrp(ATTR_SWITCHIS, (yyvsp[-1].expr)); }
-#line 4062 "tools/widl/parser.tab.c"
+#line 4147 "tools/widl/parser.tab.c"
     break;
 
-  case 162: /* attribute: tSWITCHTYPE '(' type ')'  */
-#line 581 "tools/widl/parser.y"
+  case 170: /* attribute: tSWITCHTYPE '(' type ')'  */
+#line 611 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrp(ATTR_SWITCHTYPE, (yyvsp[-1].type)); }
-#line 4068 "tools/widl/parser.tab.c"
+#line 4153 "tools/widl/parser.tab.c"
     break;
 
-  case 163: /* attribute: tTRANSMITAS '(' type ')'  */
-#line 582 "tools/widl/parser.y"
+  case 171: /* attribute: tTRANSMITAS '(' type ')'  */
+#line 612 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrp(ATTR_TRANSMITAS, (yyvsp[-1].type)); }
-#line 4074 "tools/widl/parser.tab.c"
+#line 4159 "tools/widl/parser.tab.c"
     break;
 
-  case 164: /* attribute: tTHREADING '(' threading_type ')'  */
-#line 583 "tools/widl/parser.y"
+  case 172: /* attribute: tTHREADING '(' threading_type ')'  */
+#line 613 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrv(ATTR_THREADING, (yyvsp[-1].num)); }
-#line 4080 "tools/widl/parser.tab.c"
+#line 4165 "tools/widl/parser.tab.c"
     break;
 
-  case 165: /* attribute: tUIDEFAULT  */
-#line 584 "tools/widl/parser.y"
+  case 173: /* attribute: tUIDEFAULT  */
+#line 614 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_UIDEFAULT); }
-#line 4086 "tools/widl/parser.tab.c"
+#line 4171 "tools/widl/parser.tab.c"
     break;
 
-  case 166: /* attribute: tUSESGETLASTERROR  */
-#line 585 "tools/widl/parser.y"
+  case 174: /* attribute: tUSESGETLASTERROR  */
+#line 615 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_USESGETLASTERROR); }
-#line 4092 "tools/widl/parser.tab.c"
+#line 4177 "tools/widl/parser.tab.c"
     break;
 
-  case 167: /* attribute: tUSERMARSHAL '(' type ')'  */
-#line 586 "tools/widl/parser.y"
+  case 175: /* attribute: tUSERMARSHAL '(' type ')'  */
+#line 616 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrp(ATTR_USERMARSHAL, (yyvsp[-1].type)); }
-#line 4098 "tools/widl/parser.tab.c"
+#line 4183 "tools/widl/parser.tab.c"
     break;
 
-  case 168: /* attribute: tUUID '(' uuid_string ')'  */
-#line 587 "tools/widl/parser.y"
+  case 176: /* attribute: tUUID '(' uuid_string ')'  */
+#line 617 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrp(ATTR_UUID, (yyvsp[-1].uuid)); }
-#line 4104 "tools/widl/parser.tab.c"
+#line 4189 "tools/widl/parser.tab.c"
     break;
 
-  case 169: /* attribute: tASYNCUUID '(' uuid_string ')'  */
-#line 588 "tools/widl/parser.y"
+  case 177: /* attribute: tASYNCUUID '(' uuid_string ')'  */
+#line 618 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrp(ATTR_ASYNCUUID, (yyvsp[-1].uuid)); }
-#line 4110 "tools/widl/parser.tab.c"
+#line 4195 "tools/widl/parser.tab.c"
     break;
 
-  case 170: /* attribute: tV1ENUM  */
-#line 589 "tools/widl/parser.y"
+  case 178: /* attribute: tV1ENUM  */
+#line 619 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_V1ENUM); }
-#line 4116 "tools/widl/parser.tab.c"
+#line 4201 "tools/widl/parser.tab.c"
     break;
 
-  case 171: /* attribute: tVARARG  */
-#line 590 "tools/widl/parser.y"
+  case 179: /* attribute: tVARARG  */
+#line 620 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_VARARG); }
-#line 4122 "tools/widl/parser.tab.c"
+#line 4207 "tools/widl/parser.tab.c"
     break;
 
-  case 172: /* attribute: tVERSION '(' version ')'  */
-#line 591 "tools/widl/parser.y"
+  case 180: /* attribute: tVERSION '(' version ')'  */
+#line 621 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrv(ATTR_VERSION, (yyvsp[-1].num)); }
-#line 4128 "tools/widl/parser.tab.c"
+#line 4213 "tools/widl/parser.tab.c"
     break;
 
-  case 173: /* attribute: tVIPROGID '(' aSTRING ')'  */
-#line 592 "tools/widl/parser.y"
+  case 181: /* attribute: tVIPROGID '(' aSTRING ')'  */
+#line 622 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrp(ATTR_VIPROGID, (yyvsp[-1].str)); }
-#line 4134 "tools/widl/parser.tab.c"
+#line 4219 "tools/widl/parser.tab.c"
     break;
 
-  case 174: /* attribute: tWIREMARSHAL '(' type ')'  */
-#line 593 "tools/widl/parser.y"
+  case 182: /* attribute: tWIREMARSHAL '(' type ')'  */
+#line 623 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrp(ATTR_WIREMARSHAL, (yyvsp[-1].type)); }
-#line 4140 "tools/widl/parser.tab.c"
+#line 4225 "tools/widl/parser.tab.c"
     break;
 
-  case 175: /* attribute: pointer_type  */
-#line 594 "tools/widl/parser.y"
+  case 183: /* attribute: pointer_type  */
+#line 624 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attrv(ATTR_POINTERTYPE, (yyvsp[0].num)); }
-#line 4146 "tools/widl/parser.tab.c"
+#line 4231 "tools/widl/parser.tab.c"
     break;
 
-  case 177: /* uuid_string: aSTRING  */
-#line 599 "tools/widl/parser.y"
+  case 185: /* uuid_string: aSTRING  */
+#line 629 "tools/widl/parser.y"
                                                 { if (!is_valid_uuid((yyvsp[0].str)))
 						    error_loc("invalid UUID: %s\n", (yyvsp[0].str));
 						  (yyval.uuid) = parse_uuid((yyvsp[0].str)); }
-#line 4154 "tools/widl/parser.tab.c"
+#line 4239 "tools/widl/parser.tab.c"
     break;
 
-  case 178: /* callconv: tCDECL  */
-#line 604 "tools/widl/parser.y"
+  case 186: /* callconv: tCDECL  */
+#line 634 "tools/widl/parser.y"
                                                 { (yyval.str) = xstrdup("__cdecl"); }
-#line 4160 "tools/widl/parser.tab.c"
+#line 4245 "tools/widl/parser.tab.c"
     break;
 
-  case 179: /* callconv: tFASTCALL  */
-#line 605 "tools/widl/parser.y"
+  case 187: /* callconv: tFASTCALL  */
+#line 635 "tools/widl/parser.y"
                                                 { (yyval.str) = xstrdup("__fastcall"); }
-#line 4166 "tools/widl/parser.tab.c"
+#line 4251 "tools/widl/parser.tab.c"
     break;
 
-  case 180: /* callconv: tPASCAL  */
-#line 606 "tools/widl/parser.y"
+  case 188: /* callconv: tPASCAL  */
+#line 636 "tools/widl/parser.y"
                                                 { (yyval.str) = xstrdup("__pascal"); }
-#line 4172 "tools/widl/parser.tab.c"
+#line 4257 "tools/widl/parser.tab.c"
     break;
 
-  case 181: /* callconv: tSTDCALL  */
-#line 607 "tools/widl/parser.y"
+  case 189: /* callconv: tSTDCALL  */
+#line 637 "tools/widl/parser.y"
                                                 { (yyval.str) = xstrdup("__stdcall"); }
-#line 4178 "tools/widl/parser.tab.c"
+#line 4263 "tools/widl/parser.tab.c"
     break;
 
-  case 182: /* cases: %empty  */
-#line 610 "tools/widl/parser.y"
+  case 190: /* cases: %empty  */
+#line 640 "tools/widl/parser.y"
                                                 { (yyval.var_list) = NULL; }
-#line 4184 "tools/widl/parser.tab.c"
+#line 4269 "tools/widl/parser.tab.c"
     break;
 
-  case 183: /* cases: cases case  */
-#line 611 "tools/widl/parser.y"
+  case 191: /* cases: cases case  */
+#line 641 "tools/widl/parser.y"
                                                 { (yyval.var_list) = append_var( (yyvsp[-1].var_list), (yyvsp[0].var) ); }
-#line 4190 "tools/widl/parser.tab.c"
+#line 4275 "tools/widl/parser.tab.c"
     break;
 
-  case 184: /* case: tCASE expr_int_const ':' union_field  */
-#line 614 "tools/widl/parser.y"
+  case 192: /* case: tCASE expr_int_const ':' union_field  */
+#line 644 "tools/widl/parser.y"
                                                 { attr_t *a = make_attrp(ATTR_CASE, append_expr( NULL, (yyvsp[-2].expr) ));
 						  (yyval.var) = (yyvsp[0].var); if (!(yyval.var)) (yyval.var) = make_var(NULL);
 						  (yyval.var)->attrs = append_attr( (yyval.var)->attrs, a );
 						}
-#line 4199 "tools/widl/parser.tab.c"
+#line 4284 "tools/widl/parser.tab.c"
     break;
 
-  case 185: /* case: tDEFAULT ':' union_field  */
-#line 618 "tools/widl/parser.y"
+  case 193: /* case: tDEFAULT ':' union_field  */
+#line 648 "tools/widl/parser.y"
                                                 { attr_t *a = make_attr(ATTR_DEFAULT);
 						  (yyval.var) = (yyvsp[0].var); if (!(yyval.var)) (yyval.var) = make_var(NULL);
 						  (yyval.var)->attrs = append_attr( (yyval.var)->attrs, a );
 						}
-#line 4208 "tools/widl/parser.tab.c"
+#line 4293 "tools/widl/parser.tab.c"
     break;
 
-  case 186: /* enums: %empty  */
-#line 624 "tools/widl/parser.y"
+  case 194: /* enums: %empty  */
+#line 654 "tools/widl/parser.y"
                                                 { (yyval.var_list) = NULL; }
-#line 4214 "tools/widl/parser.tab.c"
+#line 4299 "tools/widl/parser.tab.c"
     break;
 
-  case 187: /* enums: enum_list ','  */
-#line 625 "tools/widl/parser.y"
+  case 195: /* enums: enum_list ','  */
+#line 655 "tools/widl/parser.y"
                                                 { (yyval.var_list) = (yyvsp[-1].var_list); }
-#line 4220 "tools/widl/parser.tab.c"
+#line 4305 "tools/widl/parser.tab.c"
     break;
 
-  case 189: /* enum_list: enum  */
-#line 629 "tools/widl/parser.y"
+  case 197: /* enum_list: enum  */
+#line 659 "tools/widl/parser.y"
                                                 { if (!(yyvsp[0].var)->eval)
 						    (yyvsp[0].var)->eval = make_exprl(EXPR_NUM, 0 /* default for first enum entry */);
                                                   (yyval.var_list) = append_var( NULL, (yyvsp[0].var) );
 						}
-#line 4229 "tools/widl/parser.tab.c"
+#line 4314 "tools/widl/parser.tab.c"
     break;
 
-  case 190: /* enum_list: enum_list ',' enum  */
-#line 633 "tools/widl/parser.y"
+  case 198: /* enum_list: enum_list ',' enum  */
+#line 663 "tools/widl/parser.y"
                                                 { if (!(yyvsp[0].var)->eval)
                                                   {
                                                     var_t *last = LIST_ENTRY( list_tail((yyval.var_list)), var_t, entry );
@@ -4240,706 +4325,715 @@
                                                   }
                                                   (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[0].var) );
 						}
-#line 4244 "tools/widl/parser.tab.c"
+#line 4329 "tools/widl/parser.tab.c"
     break;
 
-  case 191: /* enum_member: m_attributes ident  */
-#line 645 "tools/widl/parser.y"
+  case 199: /* enum_member: m_attributes ident  */
+#line 675 "tools/widl/parser.y"
                                                 { (yyval.var) = (yyvsp[0].var);
 						  (yyval.var)->attrs = check_enum_member_attrs((yyvsp[-1].attr_list));
 						}
-#line 4252 "tools/widl/parser.tab.c"
+#line 4337 "tools/widl/parser.tab.c"
     break;
 
-  case 192: /* enum: enum_member '=' expr_int_const  */
-#line 650 "tools/widl/parser.y"
+  case 200: /* enum: enum_member '=' expr_int_const  */
+#line 680 "tools/widl/parser.y"
                                                 { (yyval.var) = reg_const((yyvsp[-2].var));
 						  (yyval.var)->eval = (yyvsp[0].expr);
                                                   (yyval.var)->declspec.type = type_new_int(TYPE_BASIC_INT, 0);
 						}
-#line 4261 "tools/widl/parser.tab.c"
+#line 4346 "tools/widl/parser.tab.c"
     break;
 
-  case 193: /* enum: enum_member  */
-#line 654 "tools/widl/parser.y"
+  case 201: /* enum: enum_member  */
+#line 684 "tools/widl/parser.y"
                                                 { (yyval.var) = reg_const((yyvsp[0].var));
                                                   (yyval.var)->declspec.type = type_new_int(TYPE_BASIC_INT, 0);
 						}
-#line 4269 "tools/widl/parser.tab.c"
+#line 4354 "tools/widl/parser.tab.c"
     break;
 
-  case 194: /* enumdef: tENUM t_ident '{' enums '}'  */
-#line 659 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_enum((yyvsp[-3].str), current_namespace, TRUE, (yyvsp[-1].var_list)); }
-#line 4275 "tools/widl/parser.tab.c"
-    break;
-
-  case 195: /* m_exprs: m_expr  */
-#line 662 "tools/widl/parser.y"
-                                                { (yyval.expr_list) = append_expr( NULL, (yyvsp[0].expr) ); }
-#line 4281 "tools/widl/parser.tab.c"
-    break;
-
-  case 196: /* m_exprs: m_exprs ',' m_expr  */
-#line 663 "tools/widl/parser.y"
-                                                { (yyval.expr_list) = append_expr( (yyvsp[-2].expr_list), (yyvsp[0].expr) ); }
-#line 4287 "tools/widl/parser.tab.c"
-    break;
-
-  case 197: /* m_expr: %empty  */
-#line 666 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr(EXPR_VOID); }
-#line 4293 "tools/widl/parser.tab.c"
-    break;
-
-  case 199: /* expr: aNUM  */
-#line 670 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprl(EXPR_NUM, (yyvsp[0].num)); }
-#line 4299 "tools/widl/parser.tab.c"
-    break;
-
-  case 200: /* expr: aHEXNUM  */
-#line 671 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprl(EXPR_HEXNUM, (yyvsp[0].num)); }
-#line 4305 "tools/widl/parser.tab.c"
-    break;
-
-  case 201: /* expr: aDOUBLE  */
-#line 672 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprd(EXPR_DOUBLE, (yyvsp[0].dbl)); }
-#line 4311 "tools/widl/parser.tab.c"
-    break;
-
-  case 202: /* expr: tFALSE  */
-#line 673 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 0); }
-#line 4317 "tools/widl/parser.tab.c"
-    break;
-
-  case 203: /* expr: tNULL  */
-#line 674 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprl(EXPR_NUM, 0); }
-#line 4323 "tools/widl/parser.tab.c"
-    break;
-
-  case 204: /* expr: tTRUE  */
-#line 675 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 1); }
-#line 4329 "tools/widl/parser.tab.c"
-    break;
-
-  case 205: /* expr: aSTRING  */
-#line 676 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprs(EXPR_STRLIT, (yyvsp[0].str)); }
-#line 4335 "tools/widl/parser.tab.c"
-    break;
-
-  case 206: /* expr: aWSTRING  */
-#line 677 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprs(EXPR_WSTRLIT, (yyvsp[0].str)); }
-#line 4341 "tools/widl/parser.tab.c"
-    break;
-
-  case 207: /* expr: aSQSTRING  */
-#line 678 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprs(EXPR_CHARCONST, (yyvsp[0].str)); }
-#line 4347 "tools/widl/parser.tab.c"
-    break;
-
-  case 208: /* expr: aIDENTIFIER  */
-#line 679 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str)); }
-#line 4353 "tools/widl/parser.tab.c"
-    break;
-
-  case 209: /* expr: expr '?' expr ':' expr  */
-#line 680 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr3(EXPR_COND, (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4359 "tools/widl/parser.tab.c"
-    break;
-
-  case 210: /* expr: expr LOGICALOR expr  */
-#line 681 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_LOGOR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4365 "tools/widl/parser.tab.c"
-    break;
-
-  case 211: /* expr: expr LOGICALAND expr  */
-#line 682 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_LOGAND, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4371 "tools/widl/parser.tab.c"
-    break;
-
-  case 212: /* expr: expr '|' expr  */
-#line 683 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_OR , (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4377 "tools/widl/parser.tab.c"
-    break;
-
-  case 213: /* expr: expr '^' expr  */
-#line 684 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_XOR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4383 "tools/widl/parser.tab.c"
-    break;
-
-  case 214: /* expr: expr '&' expr  */
-#line 685 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4389 "tools/widl/parser.tab.c"
-    break;
-
-  case 215: /* expr: expr EQUALITY expr  */
-#line 686 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_EQUALITY, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4395 "tools/widl/parser.tab.c"
-    break;
-
-  case 216: /* expr: expr INEQUALITY expr  */
-#line 687 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_INEQUALITY, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4401 "tools/widl/parser.tab.c"
-    break;
-
-  case 217: /* expr: expr '>' expr  */
-#line 688 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_GTR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4407 "tools/widl/parser.tab.c"
-    break;
-
-  case 218: /* expr: expr '<' expr  */
+  case 202: /* enumdef: tENUM t_ident '{' enums '}'  */
 #line 689 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_LESS, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4413 "tools/widl/parser.tab.c"
+                                                { (yyval.type) = type_new_enum((yyvsp[-3].str), current_namespace, TRUE, (yyvsp[-1].var_list)); }
+#line 4360 "tools/widl/parser.tab.c"
     break;
 
-  case 219: /* expr: expr GREATEREQUAL expr  */
-#line 690 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_GTREQL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4419 "tools/widl/parser.tab.c"
-    break;
-
-  case 220: /* expr: expr LESSEQUAL expr  */
-#line 691 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_LESSEQL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4425 "tools/widl/parser.tab.c"
-    break;
-
-  case 221: /* expr: expr SHL expr  */
+  case 203: /* m_exprs: m_expr  */
 #line 692 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_SHL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4431 "tools/widl/parser.tab.c"
-    break;
-
-  case 222: /* expr: expr SHR expr  */
-#line 693 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_SHR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4437 "tools/widl/parser.tab.c"
-    break;
-
-  case 223: /* expr: expr '+' expr  */
-#line 694 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_ADD, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4443 "tools/widl/parser.tab.c"
-    break;
-
-  case 224: /* expr: expr '-' expr  */
-#line 695 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_SUB, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4449 "tools/widl/parser.tab.c"
-    break;
-
-  case 225: /* expr: expr '%' expr  */
-#line 696 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_MOD, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4455 "tools/widl/parser.tab.c"
-    break;
-
-  case 226: /* expr: expr '*' expr  */
-#line 697 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_MUL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4461 "tools/widl/parser.tab.c"
-    break;
-
-  case 227: /* expr: expr '/' expr  */
-#line 698 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_DIV, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4467 "tools/widl/parser.tab.c"
-    break;
-
-  case 228: /* expr: '!' expr  */
-#line 699 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr1(EXPR_LOGNOT, (yyvsp[0].expr)); }
-#line 4473 "tools/widl/parser.tab.c"
-    break;
-
-  case 229: /* expr: '~' expr  */
-#line 700 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr1(EXPR_NOT, (yyvsp[0].expr)); }
-#line 4479 "tools/widl/parser.tab.c"
-    break;
-
-  case 230: /* expr: '+' expr  */
-#line 701 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr1(EXPR_POS, (yyvsp[0].expr)); }
-#line 4485 "tools/widl/parser.tab.c"
-    break;
-
-  case 231: /* expr: '-' expr  */
-#line 702 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr1(EXPR_NEG, (yyvsp[0].expr)); }
-#line 4491 "tools/widl/parser.tab.c"
-    break;
-
-  case 232: /* expr: '&' expr  */
-#line 703 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr1(EXPR_ADDRESSOF, (yyvsp[0].expr)); }
-#line 4497 "tools/widl/parser.tab.c"
-    break;
-
-  case 233: /* expr: '*' expr  */
-#line 704 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr1(EXPR_PPTR, (yyvsp[0].expr)); }
-#line 4503 "tools/widl/parser.tab.c"
-    break;
-
-  case 234: /* expr: expr MEMBERPTR aIDENTIFIER  */
-#line 705 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_MEMBER, make_expr1(EXPR_PPTR, (yyvsp[-2].expr)), make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str))); }
-#line 4509 "tools/widl/parser.tab.c"
-    break;
-
-  case 235: /* expr: expr '.' aIDENTIFIER  */
-#line 706 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_MEMBER, (yyvsp[-2].expr), make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str))); }
-#line 4515 "tools/widl/parser.tab.c"
-    break;
-
-  case 236: /* expr: '(' decl_spec m_abstract_declarator ')' expr  */
-#line 708 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprt(EXPR_CAST, declare_var(NULL, (yyvsp[-3].declspec), (yyvsp[-2].declarator), 0), (yyvsp[0].expr)); free((yyvsp[-3].declspec)); free((yyvsp[-2].declarator)); }
-#line 4521 "tools/widl/parser.tab.c"
-    break;
-
-  case 237: /* expr: tSIZEOF '(' decl_spec m_abstract_declarator ')'  */
-#line 710 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_exprt(EXPR_SIZEOF, declare_var(NULL, (yyvsp[-2].declspec), (yyvsp[-1].declarator), 0), NULL); free((yyvsp[-2].declspec)); free((yyvsp[-1].declarator)); }
-#line 4527 "tools/widl/parser.tab.c"
-    break;
-
-  case 238: /* expr: expr '[' expr ']'  */
-#line 711 "tools/widl/parser.y"
-                                                { (yyval.expr) = make_expr2(EXPR_ARRAY, (yyvsp[-3].expr), (yyvsp[-1].expr)); }
-#line 4533 "tools/widl/parser.tab.c"
-    break;
-
-  case 239: /* expr: '(' expr ')'  */
-#line 712 "tools/widl/parser.y"
-                                                { (yyval.expr) = (yyvsp[-1].expr); }
-#line 4539 "tools/widl/parser.tab.c"
-    break;
-
-  case 240: /* expr_list_int_const: expr_int_const  */
-#line 715 "tools/widl/parser.y"
                                                 { (yyval.expr_list) = append_expr( NULL, (yyvsp[0].expr) ); }
-#line 4545 "tools/widl/parser.tab.c"
+#line 4366 "tools/widl/parser.tab.c"
     break;
 
-  case 241: /* expr_list_int_const: expr_list_int_const ',' expr_int_const  */
+  case 204: /* m_exprs: m_exprs ',' m_expr  */
+#line 693 "tools/widl/parser.y"
+                                                { (yyval.expr_list) = append_expr( (yyvsp[-2].expr_list), (yyvsp[0].expr) ); }
+#line 4372 "tools/widl/parser.tab.c"
+    break;
+
+  case 205: /* m_expr: %empty  */
+#line 696 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr(EXPR_VOID); }
+#line 4378 "tools/widl/parser.tab.c"
+    break;
+
+  case 207: /* expr: aNUM  */
+#line 700 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_exprl(EXPR_NUM, (yyvsp[0].num)); }
+#line 4384 "tools/widl/parser.tab.c"
+    break;
+
+  case 208: /* expr: aHEXNUM  */
+#line 701 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_exprl(EXPR_HEXNUM, (yyvsp[0].num)); }
+#line 4390 "tools/widl/parser.tab.c"
+    break;
+
+  case 209: /* expr: aDOUBLE  */
+#line 702 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_exprd(EXPR_DOUBLE, (yyvsp[0].dbl)); }
+#line 4396 "tools/widl/parser.tab.c"
+    break;
+
+  case 210: /* expr: tFALSE  */
+#line 703 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 0); }
+#line 4402 "tools/widl/parser.tab.c"
+    break;
+
+  case 211: /* expr: tNULL  */
+#line 704 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_exprl(EXPR_NUM, 0); }
+#line 4408 "tools/widl/parser.tab.c"
+    break;
+
+  case 212: /* expr: tTRUE  */
+#line 705 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 1); }
+#line 4414 "tools/widl/parser.tab.c"
+    break;
+
+  case 213: /* expr: aSTRING  */
+#line 706 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_exprs(EXPR_STRLIT, (yyvsp[0].str)); }
+#line 4420 "tools/widl/parser.tab.c"
+    break;
+
+  case 214: /* expr: aWSTRING  */
+#line 707 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_exprs(EXPR_WSTRLIT, (yyvsp[0].str)); }
+#line 4426 "tools/widl/parser.tab.c"
+    break;
+
+  case 215: /* expr: aSQSTRING  */
+#line 708 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_exprs(EXPR_CHARCONST, (yyvsp[0].str)); }
+#line 4432 "tools/widl/parser.tab.c"
+    break;
+
+  case 216: /* expr: aIDENTIFIER  */
+#line 709 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str)); }
+#line 4438 "tools/widl/parser.tab.c"
+    break;
+
+  case 217: /* expr: expr '?' expr ':' expr  */
+#line 710 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr3(EXPR_COND, (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4444 "tools/widl/parser.tab.c"
+    break;
+
+  case 218: /* expr: expr LOGICALOR expr  */
+#line 711 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_LOGOR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4450 "tools/widl/parser.tab.c"
+    break;
+
+  case 219: /* expr: expr LOGICALAND expr  */
+#line 712 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_LOGAND, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4456 "tools/widl/parser.tab.c"
+    break;
+
+  case 220: /* expr: expr '|' expr  */
+#line 713 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_OR , (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4462 "tools/widl/parser.tab.c"
+    break;
+
+  case 221: /* expr: expr '^' expr  */
+#line 714 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_XOR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4468 "tools/widl/parser.tab.c"
+    break;
+
+  case 222: /* expr: expr '&' expr  */
+#line 715 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4474 "tools/widl/parser.tab.c"
+    break;
+
+  case 223: /* expr: expr EQUALITY expr  */
 #line 716 "tools/widl/parser.y"
-                                                        { (yyval.expr_list) = append_expr( (yyvsp[-2].expr_list), (yyvsp[0].expr) ); }
-#line 4551 "tools/widl/parser.tab.c"
+                                                { (yyval.expr) = make_expr2(EXPR_EQUALITY, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4480 "tools/widl/parser.tab.c"
     break;
 
-  case 242: /* expr_int_const: expr  */
+  case 224: /* expr: expr INEQUALITY expr  */
+#line 717 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_INEQUALITY, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4486 "tools/widl/parser.tab.c"
+    break;
+
+  case 225: /* expr: expr '>' expr  */
+#line 718 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_GTR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4492 "tools/widl/parser.tab.c"
+    break;
+
+  case 226: /* expr: expr '<' expr  */
 #line 719 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_LESS, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4498 "tools/widl/parser.tab.c"
+    break;
+
+  case 227: /* expr: expr GREATEREQUAL expr  */
+#line 720 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_GTREQL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4504 "tools/widl/parser.tab.c"
+    break;
+
+  case 228: /* expr: expr LESSEQUAL expr  */
+#line 721 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_LESSEQL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4510 "tools/widl/parser.tab.c"
+    break;
+
+  case 229: /* expr: expr SHL expr  */
+#line 722 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_SHL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4516 "tools/widl/parser.tab.c"
+    break;
+
+  case 230: /* expr: expr SHR expr  */
+#line 723 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_SHR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4522 "tools/widl/parser.tab.c"
+    break;
+
+  case 231: /* expr: expr '+' expr  */
+#line 724 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_ADD, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4528 "tools/widl/parser.tab.c"
+    break;
+
+  case 232: /* expr: expr '-' expr  */
+#line 725 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_SUB, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4534 "tools/widl/parser.tab.c"
+    break;
+
+  case 233: /* expr: expr '%' expr  */
+#line 726 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_MOD, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4540 "tools/widl/parser.tab.c"
+    break;
+
+  case 234: /* expr: expr '*' expr  */
+#line 727 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_MUL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4546 "tools/widl/parser.tab.c"
+    break;
+
+  case 235: /* expr: expr '/' expr  */
+#line 728 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_DIV, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 4552 "tools/widl/parser.tab.c"
+    break;
+
+  case 236: /* expr: '!' expr  */
+#line 729 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr1(EXPR_LOGNOT, (yyvsp[0].expr)); }
+#line 4558 "tools/widl/parser.tab.c"
+    break;
+
+  case 237: /* expr: '~' expr  */
+#line 730 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr1(EXPR_NOT, (yyvsp[0].expr)); }
+#line 4564 "tools/widl/parser.tab.c"
+    break;
+
+  case 238: /* expr: '+' expr  */
+#line 731 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr1(EXPR_POS, (yyvsp[0].expr)); }
+#line 4570 "tools/widl/parser.tab.c"
+    break;
+
+  case 239: /* expr: '-' expr  */
+#line 732 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr1(EXPR_NEG, (yyvsp[0].expr)); }
+#line 4576 "tools/widl/parser.tab.c"
+    break;
+
+  case 240: /* expr: '&' expr  */
+#line 733 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr1(EXPR_ADDRESSOF, (yyvsp[0].expr)); }
+#line 4582 "tools/widl/parser.tab.c"
+    break;
+
+  case 241: /* expr: '*' expr  */
+#line 734 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr1(EXPR_PPTR, (yyvsp[0].expr)); }
+#line 4588 "tools/widl/parser.tab.c"
+    break;
+
+  case 242: /* expr: expr MEMBERPTR aIDENTIFIER  */
+#line 735 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_MEMBER, make_expr1(EXPR_PPTR, (yyvsp[-2].expr)), make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str))); }
+#line 4594 "tools/widl/parser.tab.c"
+    break;
+
+  case 243: /* expr: expr '.' aIDENTIFIER  */
+#line 736 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_MEMBER, (yyvsp[-2].expr), make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str))); }
+#line 4600 "tools/widl/parser.tab.c"
+    break;
+
+  case 244: /* expr: '(' decl_spec m_abstract_declarator ')' expr  */
+#line 738 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_exprt(EXPR_CAST, declare_var(NULL, (yyvsp[-3].declspec), (yyvsp[-2].declarator), 0), (yyvsp[0].expr)); free((yyvsp[-3].declspec)); free((yyvsp[-2].declarator)); }
+#line 4606 "tools/widl/parser.tab.c"
+    break;
+
+  case 245: /* expr: tSIZEOF '(' decl_spec m_abstract_declarator ')'  */
+#line 740 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_exprt(EXPR_SIZEOF, declare_var(NULL, (yyvsp[-2].declspec), (yyvsp[-1].declarator), 0), NULL); free((yyvsp[-2].declspec)); free((yyvsp[-1].declarator)); }
+#line 4612 "tools/widl/parser.tab.c"
+    break;
+
+  case 246: /* expr: expr '[' expr ']'  */
+#line 741 "tools/widl/parser.y"
+                                                { (yyval.expr) = make_expr2(EXPR_ARRAY, (yyvsp[-3].expr), (yyvsp[-1].expr)); }
+#line 4618 "tools/widl/parser.tab.c"
+    break;
+
+  case 247: /* expr: '(' expr ')'  */
+#line 742 "tools/widl/parser.y"
+                                                { (yyval.expr) = (yyvsp[-1].expr); }
+#line 4624 "tools/widl/parser.tab.c"
+    break;
+
+  case 248: /* expr_list_int_const: expr_int_const  */
+#line 745 "tools/widl/parser.y"
+                                                { (yyval.expr_list) = append_expr( NULL, (yyvsp[0].expr) ); }
+#line 4630 "tools/widl/parser.tab.c"
+    break;
+
+  case 249: /* expr_list_int_const: expr_list_int_const ',' expr_int_const  */
+#line 746 "tools/widl/parser.y"
+                                                        { (yyval.expr_list) = append_expr( (yyvsp[-2].expr_list), (yyvsp[0].expr) ); }
+#line 4636 "tools/widl/parser.tab.c"
+    break;
+
+  case 250: /* expr_int_const: expr  */
+#line 749 "tools/widl/parser.y"
                                                 { (yyval.expr) = (yyvsp[0].expr);
 						  if (!(yyval.expr)->is_const)
 						      error_loc("expression is not an integer constant\n");
 						}
-#line 4560 "tools/widl/parser.tab.c"
+#line 4645 "tools/widl/parser.tab.c"
     break;
 
-  case 243: /* expr_const: expr  */
-#line 725 "tools/widl/parser.y"
+  case 251: /* expr_const: expr  */
+#line 755 "tools/widl/parser.y"
                                                 { (yyval.expr) = (yyvsp[0].expr);
 						  if (!(yyval.expr)->is_const && (yyval.expr)->type != EXPR_STRLIT && (yyval.expr)->type != EXPR_WSTRLIT)
 						      error_loc("expression is not constant\n");
 						}
-#line 4569 "tools/widl/parser.tab.c"
+#line 4654 "tools/widl/parser.tab.c"
     break;
 
-  case 244: /* fields: %empty  */
-#line 731 "tools/widl/parser.y"
+  case 252: /* fields: %empty  */
+#line 761 "tools/widl/parser.y"
                                                 { (yyval.var_list) = NULL; }
-#line 4575 "tools/widl/parser.tab.c"
+#line 4660 "tools/widl/parser.tab.c"
     break;
 
-  case 245: /* fields: fields field  */
-#line 732 "tools/widl/parser.y"
+  case 253: /* fields: fields field  */
+#line 762 "tools/widl/parser.y"
                                                 { (yyval.var_list) = append_var_list((yyvsp[-1].var_list), (yyvsp[0].var_list)); }
-#line 4581 "tools/widl/parser.tab.c"
+#line 4666 "tools/widl/parser.tab.c"
     break;
 
-  case 246: /* field: m_attributes decl_spec struct_declarator_list ';'  */
-#line 736 "tools/widl/parser.y"
+  case 254: /* field: m_attributes decl_spec struct_declarator_list ';'  */
+#line 766 "tools/widl/parser.y"
                                                 { const char *first = LIST_ENTRY(list_head((yyvsp[-1].declarator_list)), declarator_t, entry)->var->name;
 						  check_field_attrs(first, (yyvsp[-3].attr_list));
 						  (yyval.var_list) = set_var_types((yyvsp[-3].attr_list), (yyvsp[-2].declspec), (yyvsp[-1].declarator_list));
 						}
-#line 4590 "tools/widl/parser.tab.c"
+#line 4675 "tools/widl/parser.tab.c"
     break;
 
-  case 247: /* field: m_attributes uniondef ';'  */
-#line 740 "tools/widl/parser.y"
+  case 255: /* field: m_attributes uniondef ';'  */
+#line 770 "tools/widl/parser.y"
                                                 { var_t *v = make_var(NULL);
 						  v->declspec.type = (yyvsp[-1].type); v->attrs = (yyvsp[-2].attr_list);
 						  (yyval.var_list) = append_var(NULL, v);
 						}
-#line 4599 "tools/widl/parser.tab.c"
+#line 4684 "tools/widl/parser.tab.c"
     break;
 
-  case 248: /* ne_union_field: s_field ';'  */
-#line 747 "tools/widl/parser.y"
+  case 256: /* ne_union_field: s_field ';'  */
+#line 777 "tools/widl/parser.y"
                                                 { (yyval.var) = (yyvsp[-1].var); }
-#line 4605 "tools/widl/parser.tab.c"
+#line 4690 "tools/widl/parser.tab.c"
     break;
 
-  case 249: /* ne_union_field: attributes ';'  */
-#line 748 "tools/widl/parser.y"
+  case 257: /* ne_union_field: attributes ';'  */
+#line 778 "tools/widl/parser.y"
                                                 { (yyval.var) = make_var(NULL); (yyval.var)->attrs = (yyvsp[-1].attr_list); }
-#line 4611 "tools/widl/parser.tab.c"
+#line 4696 "tools/widl/parser.tab.c"
     break;
 
-  case 250: /* ne_union_fields: %empty  */
-#line 751 "tools/widl/parser.y"
+  case 258: /* ne_union_fields: %empty  */
+#line 781 "tools/widl/parser.y"
                                                 { (yyval.var_list) = NULL; }
-#line 4617 "tools/widl/parser.tab.c"
+#line 4702 "tools/widl/parser.tab.c"
     break;
 
-  case 251: /* ne_union_fields: ne_union_fields ne_union_field  */
-#line 752 "tools/widl/parser.y"
+  case 259: /* ne_union_fields: ne_union_fields ne_union_field  */
+#line 782 "tools/widl/parser.y"
                                                 { (yyval.var_list) = append_var( (yyvsp[-1].var_list), (yyvsp[0].var) ); }
-#line 4623 "tools/widl/parser.tab.c"
+#line 4708 "tools/widl/parser.tab.c"
     break;
 
-  case 252: /* union_field: s_field ';'  */
-#line 756 "tools/widl/parser.y"
+  case 260: /* union_field: s_field ';'  */
+#line 786 "tools/widl/parser.y"
                                                 { (yyval.var) = (yyvsp[-1].var); }
-#line 4629 "tools/widl/parser.tab.c"
+#line 4714 "tools/widl/parser.tab.c"
     break;
 
-  case 253: /* union_field: ';'  */
-#line 757 "tools/widl/parser.y"
+  case 261: /* union_field: ';'  */
+#line 787 "tools/widl/parser.y"
                                                 { (yyval.var) = NULL; }
-#line 4635 "tools/widl/parser.tab.c"
+#line 4720 "tools/widl/parser.tab.c"
     break;
 
-  case 254: /* s_field: m_attributes decl_spec declarator  */
-#line 760 "tools/widl/parser.y"
+  case 262: /* s_field: m_attributes decl_spec declarator  */
+#line 790 "tools/widl/parser.y"
                                                 { (yyval.var) = declare_var(check_field_attrs((yyvsp[0].declarator)->var->name, (yyvsp[-2].attr_list)),
 						                (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
 						  free((yyvsp[0].declarator));
 						}
-#line 4644 "tools/widl/parser.tab.c"
+#line 4729 "tools/widl/parser.tab.c"
     break;
 
-  case 255: /* s_field: m_attributes structdef  */
-#line 764 "tools/widl/parser.y"
+  case 263: /* s_field: m_attributes structdef  */
+#line 794 "tools/widl/parser.y"
                                                 { var_t *v = make_var(NULL);
 						  v->declspec.type = (yyvsp[0].type); v->attrs = (yyvsp[-1].attr_list);
 						  (yyval.var) = v;
 						}
-#line 4653 "tools/widl/parser.tab.c"
+#line 4738 "tools/widl/parser.tab.c"
     break;
 
-  case 256: /* funcdef: declaration  */
-#line 770 "tools/widl/parser.y"
+  case 264: /* funcdef: declaration  */
+#line 800 "tools/widl/parser.y"
                                                 { (yyval.var) = (yyvsp[0].var);
 						  if (type_get_type((yyval.var)->declspec.type) != TYPE_FUNCTION)
 						    error_loc("only methods may be declared inside the methods section of a dispinterface\n");
 						  check_function_attrs((yyval.var)->name, (yyval.var)->attrs);
 						}
-#line 4663 "tools/widl/parser.tab.c"
+#line 4748 "tools/widl/parser.tab.c"
     break;
 
-  case 257: /* declaration: attributes decl_spec init_declarator  */
-#line 779 "tools/widl/parser.y"
+  case 265: /* declaration: attributes decl_spec init_declarator  */
+#line 809 "tools/widl/parser.y"
                                                 { (yyval.var) = declare_var((yyvsp[-2].attr_list), (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
 						  free((yyvsp[0].declarator));
 						}
-#line 4671 "tools/widl/parser.tab.c"
+#line 4756 "tools/widl/parser.tab.c"
     break;
 
-  case 258: /* declaration: decl_spec init_declarator  */
-#line 782 "tools/widl/parser.y"
+  case 266: /* declaration: decl_spec init_declarator  */
+#line 812 "tools/widl/parser.y"
                                                 { (yyval.var) = declare_var(NULL, (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
 						  free((yyvsp[0].declarator));
 						}
-#line 4679 "tools/widl/parser.tab.c"
+#line 4764 "tools/widl/parser.tab.c"
     break;
 
-  case 259: /* m_ident: %empty  */
-#line 787 "tools/widl/parser.y"
+  case 267: /* m_ident: %empty  */
+#line 817 "tools/widl/parser.y"
                                                 { (yyval.var) = NULL; }
-#line 4685 "tools/widl/parser.tab.c"
+#line 4770 "tools/widl/parser.tab.c"
     break;
 
-  case 261: /* t_ident: %empty  */
-#line 791 "tools/widl/parser.y"
-                                                { (yyval.str) = NULL; }
-#line 4691 "tools/widl/parser.tab.c"
-    break;
-
-  case 262: /* t_ident: aIDENTIFIER  */
-#line 792 "tools/widl/parser.y"
-                                                { (yyval.str) = (yyvsp[0].str); }
-#line 4697 "tools/widl/parser.tab.c"
-    break;
-
-  case 263: /* t_ident: aKNOWNTYPE  */
-#line 793 "tools/widl/parser.y"
-                                                { (yyval.str) = (yyvsp[0].str); }
-#line 4703 "tools/widl/parser.tab.c"
-    break;
-
-  case 264: /* ident: aIDENTIFIER  */
-#line 796 "tools/widl/parser.y"
-                                                { (yyval.var) = make_var((yyvsp[0].str)); }
-#line 4709 "tools/widl/parser.tab.c"
-    break;
-
-  case 265: /* ident: aKNOWNTYPE  */
-#line 798 "tools/widl/parser.y"
-                                                { (yyval.var) = make_var((yyvsp[0].str)); }
-#line 4715 "tools/widl/parser.tab.c"
-    break;
-
-  case 266: /* base_type: tBYTE  */
-#line 801 "tools/widl/parser.y"
-                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
-#line 4721 "tools/widl/parser.tab.c"
-    break;
-
-  case 267: /* base_type: tWCHAR  */
-#line 802 "tools/widl/parser.y"
-                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
-#line 4727 "tools/widl/parser.tab.c"
-    break;
-
-  case 269: /* base_type: tSIGNED int_std  */
-#line 804 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[0].type)), -1); }
-#line 4733 "tools/widl/parser.tab.c"
-    break;
-
-  case 270: /* base_type: tUNSIGNED int_std  */
-#line 805 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[0].type)), 1); }
-#line 4739 "tools/widl/parser.tab.c"
-    break;
-
-  case 271: /* base_type: tUNSIGNED  */
-#line 806 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT, 1); }
-#line 4745 "tools/widl/parser.tab.c"
-    break;
-
-  case 272: /* base_type: tFLOAT  */
-#line 807 "tools/widl/parser.y"
-                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
-#line 4751 "tools/widl/parser.tab.c"
-    break;
-
-  case 273: /* base_type: tDOUBLE  */
-#line 808 "tools/widl/parser.y"
-                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
-#line 4757 "tools/widl/parser.tab.c"
-    break;
-
-  case 274: /* base_type: tBOOLEAN  */
-#line 809 "tools/widl/parser.y"
-                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
-#line 4763 "tools/widl/parser.tab.c"
-    break;
-
-  case 275: /* base_type: tERRORSTATUST  */
-#line 810 "tools/widl/parser.y"
-                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
-#line 4769 "tools/widl/parser.tab.c"
-    break;
-
-  case 276: /* base_type: tHANDLET  */
-#line 811 "tools/widl/parser.y"
-                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
-#line 4775 "tools/widl/parser.tab.c"
-    break;
-
-  case 279: /* int_std: tINT  */
-#line 818 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT, 0); }
-#line 4781 "tools/widl/parser.tab.c"
-    break;
-
-  case 280: /* int_std: tSHORT m_int  */
-#line 819 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT16, 0); }
-#line 4787 "tools/widl/parser.tab.c"
-    break;
-
-  case 281: /* int_std: tSMALL  */
-#line 820 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT8, 0); }
-#line 4793 "tools/widl/parser.tab.c"
-    break;
-
-  case 282: /* int_std: tLONG m_int  */
+  case 269: /* t_ident: %empty  */
 #line 821 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_LONG, 0); }
-#line 4799 "tools/widl/parser.tab.c"
+                                                { (yyval.str) = NULL; }
+#line 4776 "tools/widl/parser.tab.c"
     break;
 
-  case 283: /* int_std: tHYPER m_int  */
+  case 270: /* t_ident: aIDENTIFIER  */
 #line 822 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_HYPER, 0); }
-#line 4805 "tools/widl/parser.tab.c"
+                                                { (yyval.str) = (yyvsp[0].str); }
+#line 4782 "tools/widl/parser.tab.c"
     break;
 
-  case 284: /* int_std: tINT64  */
+  case 271: /* t_ident: aKNOWNTYPE  */
 #line 823 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT64, 0); }
-#line 4811 "tools/widl/parser.tab.c"
+                                                { (yyval.str) = (yyvsp[0].str); }
+#line 4788 "tools/widl/parser.tab.c"
     break;
 
-  case 285: /* int_std: tCHAR  */
-#line 824 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_CHAR, 0); }
-#line 4817 "tools/widl/parser.tab.c"
-    break;
-
-  case 286: /* int_std: tINT32  */
-#line 825 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT32, 0); }
-#line 4823 "tools/widl/parser.tab.c"
-    break;
-
-  case 287: /* int_std: tINT3264  */
+  case 272: /* ident: aIDENTIFIER  */
 #line 826 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT3264, 0); }
-#line 4829 "tools/widl/parser.tab.c"
+                                                { (yyval.var) = make_var((yyvsp[0].str)); }
+#line 4794 "tools/widl/parser.tab.c"
     break;
 
-  case 288: /* qualified_seq: aKNOWNTYPE  */
-#line 830 "tools/widl/parser.y"
-                      { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
-#line 4835 "tools/widl/parser.tab.c"
+  case 273: /* ident: aKNOWNTYPE  */
+#line 828 "tools/widl/parser.y"
+                                                { (yyval.var) = make_var((yyvsp[0].str)); }
+#line 4800 "tools/widl/parser.tab.c"
     break;
 
-  case 289: /* $@3: %empty  */
+  case 274: /* base_type: tBYTE  */
 #line 831 "tools/widl/parser.y"
-                      { push_lookup_namespace((yyvsp[-1].str)); }
-#line 4841 "tools/widl/parser.tab.c"
+                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
+#line 4806 "tools/widl/parser.tab.c"
     break;
 
-  case 290: /* qualified_seq: aIDENTIFIER '.' $@3 qualified_seq  */
-#line 831 "tools/widl/parser.y"
-                                                                   { (yyval.type) = (yyvsp[0].type); }
-#line 4847 "tools/widl/parser.tab.c"
+  case 275: /* base_type: tWCHAR  */
+#line 832 "tools/widl/parser.y"
+                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
+#line 4812 "tools/widl/parser.tab.c"
     break;
 
-  case 291: /* qualified_type: aKNOWNTYPE  */
+  case 277: /* base_type: tSIGNED int_std  */
+#line 834 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[0].type)), -1); }
+#line 4818 "tools/widl/parser.tab.c"
+    break;
+
+  case 278: /* base_type: tUNSIGNED int_std  */
 #line 835 "tools/widl/parser.y"
-                     { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
-#line 4853 "tools/widl/parser.tab.c"
+                                                { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[0].type)), 1); }
+#line 4824 "tools/widl/parser.tab.c"
     break;
 
-  case 292: /* $@4: %empty  */
+  case 279: /* base_type: tUNSIGNED  */
 #line 836 "tools/widl/parser.y"
-                     { init_lookup_namespace((yyvsp[-1].str)); }
-#line 4859 "tools/widl/parser.tab.c"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT, 1); }
+#line 4830 "tools/widl/parser.tab.c"
     break;
 
-  case 293: /* qualified_type: aNAMESPACE '.' $@4 qualified_seq  */
-#line 836 "tools/widl/parser.y"
-                                                                  { (yyval.type) = (yyvsp[0].type); }
-#line 4865 "tools/widl/parser.tab.c"
+  case 280: /* base_type: tFLOAT  */
+#line 837 "tools/widl/parser.y"
+                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
+#line 4836 "tools/widl/parser.tab.c"
     break;
 
-  case 294: /* coclass: tCOCLASS aIDENTIFIER  */
+  case 281: /* base_type: tDOUBLE  */
+#line 838 "tools/widl/parser.y"
+                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
+#line 4842 "tools/widl/parser.tab.c"
+    break;
+
+  case 282: /* base_type: tBOOLEAN  */
 #line 839 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_coclass((yyvsp[0].str)); }
-#line 4871 "tools/widl/parser.tab.c"
+                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
+#line 4848 "tools/widl/parser.tab.c"
     break;
 
-  case 295: /* coclass: tCOCLASS aKNOWNTYPE  */
+  case 283: /* base_type: tERRORSTATUST  */
 #line 840 "tools/widl/parser.y"
+                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
+#line 4854 "tools/widl/parser.tab.c"
+    break;
+
+  case 284: /* base_type: tHANDLET  */
+#line 841 "tools/widl/parser.y"
+                                                { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
+#line 4860 "tools/widl/parser.tab.c"
+    break;
+
+  case 287: /* int_std: tINT  */
+#line 848 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT, 0); }
+#line 4866 "tools/widl/parser.tab.c"
+    break;
+
+  case 288: /* int_std: tSHORT m_int  */
+#line 849 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT16, 0); }
+#line 4872 "tools/widl/parser.tab.c"
+    break;
+
+  case 289: /* int_std: tSMALL  */
+#line 850 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT8, 0); }
+#line 4878 "tools/widl/parser.tab.c"
+    break;
+
+  case 290: /* int_std: tLONG m_int  */
+#line 851 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_LONG, 0); }
+#line 4884 "tools/widl/parser.tab.c"
+    break;
+
+  case 291: /* int_std: tHYPER m_int  */
+#line 852 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_HYPER, 0); }
+#line 4890 "tools/widl/parser.tab.c"
+    break;
+
+  case 292: /* int_std: tINT64  */
+#line 853 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT64, 0); }
+#line 4896 "tools/widl/parser.tab.c"
+    break;
+
+  case 293: /* int_std: tCHAR  */
+#line 854 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_CHAR, 0); }
+#line 4902 "tools/widl/parser.tab.c"
+    break;
+
+  case 294: /* int_std: tINT32  */
+#line 855 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT32, 0); }
+#line 4908 "tools/widl/parser.tab.c"
+    break;
+
+  case 295: /* int_std: tINT3264  */
+#line 856 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_int(TYPE_BASIC_INT3264, 0); }
+#line 4914 "tools/widl/parser.tab.c"
+    break;
+
+  case 296: /* qualified_seq: aKNOWNTYPE  */
+#line 860 "tools/widl/parser.y"
+                      { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
+#line 4920 "tools/widl/parser.tab.c"
+    break;
+
+  case 297: /* $@3: %empty  */
+#line 861 "tools/widl/parser.y"
+                      { push_lookup_namespace((yyvsp[-1].str)); }
+#line 4926 "tools/widl/parser.tab.c"
+    break;
+
+  case 298: /* qualified_seq: aIDENTIFIER '.' $@3 qualified_seq  */
+#line 861 "tools/widl/parser.y"
+                                                                   { (yyval.type) = (yyvsp[0].type); }
+#line 4932 "tools/widl/parser.tab.c"
+    break;
+
+  case 299: /* qualified_type: aKNOWNTYPE  */
+#line 865 "tools/widl/parser.y"
+                     { (yyval.type) = find_type_or_error((yyvsp[0].str), 0); }
+#line 4938 "tools/widl/parser.tab.c"
+    break;
+
+  case 300: /* $@4: %empty  */
+#line 866 "tools/widl/parser.y"
+                     { init_lookup_namespace((yyvsp[-1].str)); }
+#line 4944 "tools/widl/parser.tab.c"
+    break;
+
+  case 301: /* qualified_type: aNAMESPACE '.' $@4 qualified_seq  */
+#line 866 "tools/widl/parser.y"
+                                                                  { (yyval.type) = (yyvsp[0].type); }
+#line 4950 "tools/widl/parser.tab.c"
+    break;
+
+  case 302: /* coclass: tCOCLASS aIDENTIFIER  */
+#line 869 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_coclass((yyvsp[0].str)); }
+#line 4956 "tools/widl/parser.tab.c"
+    break;
+
+  case 303: /* coclass: tCOCLASS aKNOWNTYPE  */
+#line 870 "tools/widl/parser.y"
                                                 { (yyval.type) = find_type((yyvsp[0].str), NULL, 0);
 						  if (type_get_type_detect_alias((yyval.type)) != TYPE_COCLASS)
 						    error_loc("%s was not declared a coclass at %s:%d\n",
 							      (yyvsp[0].str), (yyval.type)->loc_info.input_name,
 							      (yyval.type)->loc_info.line_number);
 						}
-#line 4882 "tools/widl/parser.tab.c"
+#line 4967 "tools/widl/parser.tab.c"
     break;
 
-  case 296: /* coclasshdr: attributes coclass  */
-#line 848 "tools/widl/parser.y"
+  case 304: /* coclasshdr: attributes coclass  */
+#line 878 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type);
 						  check_def((yyval.type));
 						  (yyval.type)->attrs = check_coclass_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list));
 						}
-#line 4891 "tools/widl/parser.tab.c"
+#line 4976 "tools/widl/parser.tab.c"
     break;
 
-  case 297: /* coclassdef: coclasshdr '{' coclass_ints '}' semicolon_opt  */
-#line 855 "tools/widl/parser.y"
+  case 305: /* coclassdef: coclasshdr '{' coclass_ints '}' semicolon_opt  */
+#line 885 "tools/widl/parser.y"
                                                 { (yyval.type) = type_coclass_define((yyvsp[-4].type), (yyvsp[-2].ifref_list)); }
-#line 4897 "tools/widl/parser.tab.c"
+#line 4982 "tools/widl/parser.tab.c"
     break;
 
-  case 298: /* namespacedef: tNAMESPACE aIDENTIFIER  */
-#line 858 "tools/widl/parser.y"
+  case 306: /* apicontract: attributes tAPICONTRACT aIDENTIFIER '{' '}'  */
+#line 889 "tools/widl/parser.y"
+                                                { (yyval.type) = get_type(TYPE_APICONTRACT, (yyvsp[-2].str), current_namespace, 0);
+						  check_def((yyval.type));
+						  (yyval.type)->attrs = check_apicontract_attrs((yyval.type)->name, (yyvsp[-4].attr_list));
+						}
+#line 4991 "tools/widl/parser.tab.c"
+    break;
+
+  case 307: /* namespacedef: tNAMESPACE aIDENTIFIER  */
+#line 895 "tools/widl/parser.y"
                                                 { (yyval.str) = (yyvsp[0].str); }
-#line 4903 "tools/widl/parser.tab.c"
+#line 4997 "tools/widl/parser.tab.c"
     break;
 
-  case 299: /* namespacedef: tNAMESPACE aNAMESPACE  */
-#line 859 "tools/widl/parser.y"
+  case 308: /* namespacedef: tNAMESPACE aNAMESPACE  */
+#line 896 "tools/widl/parser.y"
                                                 { (yyval.str) = (yyvsp[0].str); }
-#line 4909 "tools/widl/parser.tab.c"
+#line 5003 "tools/widl/parser.tab.c"
     break;
 
-  case 300: /* coclass_ints: %empty  */
-#line 862 "tools/widl/parser.y"
+  case 309: /* coclass_ints: %empty  */
+#line 899 "tools/widl/parser.y"
                                                 { (yyval.ifref_list) = NULL; }
-#line 4915 "tools/widl/parser.tab.c"
+#line 5009 "tools/widl/parser.tab.c"
     break;
 
-  case 301: /* coclass_ints: coclass_ints coclass_int  */
-#line 863 "tools/widl/parser.y"
+  case 310: /* coclass_ints: coclass_ints coclass_int  */
+#line 900 "tools/widl/parser.y"
                                                 { (yyval.ifref_list) = append_ifref( (yyvsp[-1].ifref_list), (yyvsp[0].ifref) ); }
-#line 4921 "tools/widl/parser.tab.c"
+#line 5015 "tools/widl/parser.tab.c"
     break;
 
-  case 302: /* coclass_int: m_attributes interfacedec  */
-#line 867 "tools/widl/parser.y"
+  case 311: /* coclass_int: m_attributes interfacedec  */
+#line 904 "tools/widl/parser.y"
                                                 { (yyval.ifref) = make_ifref((yyvsp[0].type)); (yyval.ifref)->attrs = (yyvsp[-1].attr_list); }
-#line 4927 "tools/widl/parser.tab.c"
+#line 5021 "tools/widl/parser.tab.c"
     break;
 
-  case 303: /* dispinterface: tDISPINTERFACE aIDENTIFIER  */
-#line 870 "tools/widl/parser.y"
+  case 312: /* dispinterface: tDISPINTERFACE aIDENTIFIER  */
+#line 907 "tools/widl/parser.y"
                                                 { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
-#line 4933 "tools/widl/parser.tab.c"
+#line 5027 "tools/widl/parser.tab.c"
     break;
 
-  case 304: /* dispinterface: tDISPINTERFACE aKNOWNTYPE  */
-#line 871 "tools/widl/parser.y"
+  case 313: /* dispinterface: tDISPINTERFACE aKNOWNTYPE  */
+#line 908 "tools/widl/parser.y"
                                                 { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
-#line 4939 "tools/widl/parser.tab.c"
+#line 5033 "tools/widl/parser.tab.c"
     break;
 
-  case 305: /* dispinterfacehdr: attributes dispinterface  */
-#line 874 "tools/widl/parser.y"
+  case 314: /* dispinterfacehdr: attributes dispinterface  */
+#line 911 "tools/widl/parser.y"
                                                 { attr_t *attrs;
 						  (yyval.type) = (yyvsp[0].type);
 						  check_def((yyval.type));
@@ -4947,668 +5041,710 @@
 						  (yyval.type)->attrs = append_attr( check_dispiface_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list)), attrs );
 						  (yyval.type)->defined = TRUE;
 						}
-#line 4951 "tools/widl/parser.tab.c"
+#line 5045 "tools/widl/parser.tab.c"
     break;
 
-  case 306: /* dispint_props: tPROPERTIES ':'  */
-#line 883 "tools/widl/parser.y"
+  case 315: /* dispint_props: tPROPERTIES ':'  */
+#line 920 "tools/widl/parser.y"
                                                 { (yyval.var_list) = NULL; }
-#line 4957 "tools/widl/parser.tab.c"
+#line 5051 "tools/widl/parser.tab.c"
     break;
 
-  case 307: /* dispint_props: dispint_props s_field ';'  */
-#line 884 "tools/widl/parser.y"
+  case 316: /* dispint_props: dispint_props s_field ';'  */
+#line 921 "tools/widl/parser.y"
                                                 { (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[-1].var) ); }
-#line 4963 "tools/widl/parser.tab.c"
+#line 5057 "tools/widl/parser.tab.c"
     break;
 
-  case 308: /* dispint_meths: tMETHODS ':'  */
-#line 887 "tools/widl/parser.y"
+  case 317: /* dispint_meths: tMETHODS ':'  */
+#line 924 "tools/widl/parser.y"
                                                 { (yyval.var_list) = NULL; }
-#line 4969 "tools/widl/parser.tab.c"
+#line 5063 "tools/widl/parser.tab.c"
     break;
 
-  case 309: /* dispint_meths: dispint_meths funcdef ';'  */
-#line 888 "tools/widl/parser.y"
+  case 318: /* dispint_meths: dispint_meths funcdef ';'  */
+#line 925 "tools/widl/parser.y"
                                                 { (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[-1].var) ); }
-#line 4975 "tools/widl/parser.tab.c"
+#line 5069 "tools/widl/parser.tab.c"
     break;
 
-  case 310: /* dispinterfacedef: dispinterfacehdr '{' dispint_props dispint_meths '}'  */
-#line 894 "tools/widl/parser.y"
+  case 319: /* dispinterfacedef: dispinterfacehdr '{' dispint_props dispint_meths '}'  */
+#line 931 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[-4].type);
 						  type_dispinterface_define((yyval.type), (yyvsp[-2].var_list), (yyvsp[-1].var_list));
 						}
-#line 4983 "tools/widl/parser.tab.c"
+#line 5077 "tools/widl/parser.tab.c"
     break;
 
-  case 311: /* dispinterfacedef: dispinterfacehdr '{' interface ';' '}'  */
-#line 898 "tools/widl/parser.y"
+  case 320: /* dispinterfacedef: dispinterfacehdr '{' interface ';' '}'  */
+#line 935 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[-4].type);
 						  type_dispinterface_define_from_iface((yyval.type), (yyvsp[-2].type));
 						}
-#line 4991 "tools/widl/parser.tab.c"
+#line 5085 "tools/widl/parser.tab.c"
     break;
 
-  case 312: /* inherit: %empty  */
-#line 903 "tools/widl/parser.y"
+  case 321: /* inherit: %empty  */
+#line 940 "tools/widl/parser.y"
                                                 { (yyval.type) = NULL; }
-#line 4997 "tools/widl/parser.tab.c"
+#line 5091 "tools/widl/parser.tab.c"
     break;
 
-  case 313: /* inherit: ':' qualified_type  */
-#line 904 "tools/widl/parser.y"
+  case 322: /* inherit: ':' qualified_type  */
+#line 941 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5003 "tools/widl/parser.tab.c"
+#line 5097 "tools/widl/parser.tab.c"
     break;
 
-  case 314: /* interface: tINTERFACE aIDENTIFIER  */
-#line 907 "tools/widl/parser.y"
+  case 323: /* interface: tINTERFACE aIDENTIFIER  */
+#line 944 "tools/widl/parser.y"
                                                 { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
-#line 5009 "tools/widl/parser.tab.c"
+#line 5103 "tools/widl/parser.tab.c"
     break;
 
-  case 315: /* interface: tINTERFACE aKNOWNTYPE  */
-#line 908 "tools/widl/parser.y"
+  case 324: /* interface: tINTERFACE aKNOWNTYPE  */
+#line 945 "tools/widl/parser.y"
                                                 { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
-#line 5015 "tools/widl/parser.tab.c"
+#line 5109 "tools/widl/parser.tab.c"
     break;
 
-  case 316: /* interfacehdr: attributes interface  */
-#line 911 "tools/widl/parser.y"
+  case 325: /* interfacehdr: attributes interface  */
+#line 948 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type);
 						  check_def((yyvsp[0].type));
 						  (yyvsp[0].type)->attrs = check_iface_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list));
 						  (yyvsp[0].type)->defined = TRUE;
 						}
-#line 5025 "tools/widl/parser.tab.c"
+#line 5119 "tools/widl/parser.tab.c"
     break;
 
-  case 317: /* interfacedef: interfacehdr inherit '{' int_statements '}' semicolon_opt  */
-#line 919 "tools/widl/parser.y"
+  case 326: /* interfacedef: interfacehdr inherit '{' int_statements '}' semicolon_opt  */
+#line 956 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[-5].type);
 						  if((yyval.type) == (yyvsp[-4].type))
 						    error_loc("Interface can't inherit from itself\n");
 						  type_interface_define((yyval.type), (yyvsp[-4].type), (yyvsp[-2].stmt_list));
 						  check_async_uuid((yyval.type));
 						}
-#line 5036 "tools/widl/parser.tab.c"
+#line 5130 "tools/widl/parser.tab.c"
     break;
 
-  case 318: /* interfacedef: interfacehdr ':' aIDENTIFIER '{' import int_statements '}' semicolon_opt  */
-#line 929 "tools/widl/parser.y"
+  case 327: /* interfacedef: interfacehdr ':' aIDENTIFIER '{' import int_statements '}' semicolon_opt  */
+#line 966 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[-7].type);
 						  type_interface_define((yyval.type), find_type_or_error2((yyvsp[-5].str), 0), (yyvsp[-2].stmt_list));
 						}
-#line 5044 "tools/widl/parser.tab.c"
-    break;
-
-  case 319: /* interfacedef: dispinterfacedef semicolon_opt  */
-#line 932 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[-1].type); }
-#line 5050 "tools/widl/parser.tab.c"
-    break;
-
-  case 320: /* interfacedec: interface ';'  */
-#line 936 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[-1].type); }
-#line 5056 "tools/widl/parser.tab.c"
-    break;
-
-  case 321: /* interfacedec: dispinterface ';'  */
-#line 937 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[-1].type); }
-#line 5062 "tools/widl/parser.tab.c"
-    break;
-
-  case 322: /* module: tMODULE aIDENTIFIER  */
-#line 940 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_module((yyvsp[0].str)); }
-#line 5068 "tools/widl/parser.tab.c"
-    break;
-
-  case 323: /* module: tMODULE aKNOWNTYPE  */
-#line 941 "tools/widl/parser.y"
-                                                { (yyval.type) = type_new_module((yyvsp[0].str)); }
-#line 5074 "tools/widl/parser.tab.c"
-    break;
-
-  case 324: /* modulehdr: attributes module  */
-#line 944 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[0].type);
-						  (yyval.type)->attrs = check_module_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list));
-						}
-#line 5082 "tools/widl/parser.tab.c"
-    break;
-
-  case 325: /* moduledef: modulehdr '{' int_statements '}' semicolon_opt  */
-#line 950 "tools/widl/parser.y"
-                                                { (yyval.type) = (yyvsp[-4].type);
-                                                  type_module_define((yyval.type), (yyvsp[-2].stmt_list));
-						}
-#line 5090 "tools/widl/parser.tab.c"
-    break;
-
-  case 326: /* storage_cls_spec: tEXTERN  */
-#line 956 "tools/widl/parser.y"
-                                                { (yyval.stgclass) = STG_EXTERN; }
-#line 5096 "tools/widl/parser.tab.c"
-    break;
-
-  case 327: /* storage_cls_spec: tSTATIC  */
-#line 957 "tools/widl/parser.y"
-                                                { (yyval.stgclass) = STG_STATIC; }
-#line 5102 "tools/widl/parser.tab.c"
-    break;
-
-  case 328: /* storage_cls_spec: tREGISTER  */
-#line 958 "tools/widl/parser.y"
-                                                { (yyval.stgclass) = STG_REGISTER; }
-#line 5108 "tools/widl/parser.tab.c"
-    break;
-
-  case 329: /* function_specifier: tINLINE  */
-#line 962 "tools/widl/parser.y"
-                                                { (yyval.function_specifier) = FUNCTION_SPECIFIER_INLINE; }
-#line 5114 "tools/widl/parser.tab.c"
-    break;
-
-  case 330: /* type_qualifier: tCONST  */
-#line 966 "tools/widl/parser.y"
-                                                { (yyval.type_qualifier) = TYPE_QUALIFIER_CONST; }
-#line 5120 "tools/widl/parser.tab.c"
-    break;
-
-  case 331: /* m_type_qual_list: %empty  */
-#line 969 "tools/widl/parser.y"
-                                                { (yyval.type_qualifier) = 0; }
-#line 5126 "tools/widl/parser.tab.c"
-    break;
-
-  case 332: /* m_type_qual_list: m_type_qual_list type_qualifier  */
-#line 970 "tools/widl/parser.y"
-                                                { (yyval.type_qualifier) = (yyvsp[-1].type_qualifier) | (yyvsp[0].type_qualifier); }
-#line 5132 "tools/widl/parser.tab.c"
-    break;
-
-  case 333: /* decl_spec: type m_decl_spec_no_type  */
-#line 973 "tools/widl/parser.y"
-                                                { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[0].declspec), NULL, STG_NONE, 0, 0); }
 #line 5138 "tools/widl/parser.tab.c"
     break;
 
-  case 334: /* decl_spec: decl_spec_no_type type m_decl_spec_no_type  */
-#line 975 "tools/widl/parser.y"
-                                                { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[-2].declspec), (yyvsp[0].declspec), STG_NONE, 0, 0); }
+  case 328: /* interfacedef: dispinterfacedef semicolon_opt  */
+#line 969 "tools/widl/parser.y"
+                                                { (yyval.type) = (yyvsp[-1].type); }
 #line 5144 "tools/widl/parser.tab.c"
     break;
 
-  case 335: /* m_decl_spec_no_type: %empty  */
-#line 978 "tools/widl/parser.y"
-                                                { (yyval.declspec) = NULL; }
+  case 329: /* interfacedec: interface ';'  */
+#line 973 "tools/widl/parser.y"
+                                                { (yyval.type) = (yyvsp[-1].type); }
 #line 5150 "tools/widl/parser.tab.c"
     break;
 
-  case 337: /* decl_spec_no_type: type_qualifier m_decl_spec_no_type  */
-#line 983 "tools/widl/parser.y"
-                                                { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, STG_NONE, (yyvsp[-1].type_qualifier), 0); }
+  case 330: /* interfacedec: dispinterface ';'  */
+#line 974 "tools/widl/parser.y"
+                                                { (yyval.type) = (yyvsp[-1].type); }
 #line 5156 "tools/widl/parser.tab.c"
     break;
 
-  case 338: /* decl_spec_no_type: function_specifier m_decl_spec_no_type  */
-#line 984 "tools/widl/parser.y"
-                                                  { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, STG_NONE, 0, (yyvsp[-1].function_specifier)); }
+  case 331: /* module: tMODULE aIDENTIFIER  */
+#line 977 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_module((yyvsp[0].str)); }
 #line 5162 "tools/widl/parser.tab.c"
     break;
 
-  case 339: /* decl_spec_no_type: storage_cls_spec m_decl_spec_no_type  */
-#line 985 "tools/widl/parser.y"
-                                                { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, (yyvsp[-1].stgclass), 0, 0); }
+  case 332: /* module: tMODULE aKNOWNTYPE  */
+#line 978 "tools/widl/parser.y"
+                                                { (yyval.type) = type_new_module((yyvsp[0].str)); }
 #line 5168 "tools/widl/parser.tab.c"
     break;
 
-  case 340: /* declarator: '*' m_type_qual_list declarator  */
-#line 990 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
-#line 5174 "tools/widl/parser.tab.c"
+  case 333: /* modulehdr: attributes module  */
+#line 981 "tools/widl/parser.y"
+                                                { (yyval.type) = (yyvsp[0].type);
+						  (yyval.type)->attrs = check_module_attrs((yyvsp[0].type)->name, (yyvsp[-1].attr_list));
+						}
+#line 5176 "tools/widl/parser.tab.c"
     break;
 
-  case 341: /* declarator: callconv declarator  */
-#line 991 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv((yyval.declarator)->type, (yyvsp[-1].str)); }
-#line 5180 "tools/widl/parser.tab.c"
+  case 334: /* moduledef: modulehdr '{' int_statements '}' semicolon_opt  */
+#line 987 "tools/widl/parser.y"
+                                                { (yyval.type) = (yyvsp[-4].type);
+                                                  type_module_define((yyval.type), (yyvsp[-2].stmt_list));
+						}
+#line 5184 "tools/widl/parser.tab.c"
     break;
 
-  case 343: /* direct_declarator: ident  */
-#line 996 "tools/widl/parser.y"
-                                                { (yyval.declarator) = make_declarator((yyvsp[0].var)); }
-#line 5186 "tools/widl/parser.tab.c"
+  case 335: /* storage_cls_spec: tEXTERN  */
+#line 993 "tools/widl/parser.y"
+                                                { (yyval.stgclass) = STG_EXTERN; }
+#line 5190 "tools/widl/parser.tab.c"
     break;
 
-  case 344: /* direct_declarator: '(' declarator ')'  */
-#line 997 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[-1].declarator); }
-#line 5192 "tools/widl/parser.tab.c"
+  case 336: /* storage_cls_spec: tSTATIC  */
+#line 994 "tools/widl/parser.y"
+                                                { (yyval.stgclass) = STG_STATIC; }
+#line 5196 "tools/widl/parser.tab.c"
     break;
 
-  case 345: /* direct_declarator: direct_declarator array  */
-#line 998 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[-1].declarator); append_array((yyval.declarator), (yyvsp[0].expr)); }
-#line 5198 "tools/widl/parser.tab.c"
+  case 337: /* storage_cls_spec: tREGISTER  */
+#line 995 "tools/widl/parser.y"
+                                                { (yyval.stgclass) = STG_REGISTER; }
+#line 5202 "tools/widl/parser.tab.c"
     break;
 
-  case 346: /* direct_declarator: direct_declarator '(' m_args ')'  */
+  case 338: /* function_specifier: tINLINE  */
 #line 999 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[-3].declarator); append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0); }
-#line 5204 "tools/widl/parser.tab.c"
+                                                { (yyval.function_specifier) = FUNCTION_SPECIFIER_INLINE; }
+#line 5208 "tools/widl/parser.tab.c"
     break;
 
-  case 347: /* abstract_declarator: '*' m_type_qual_list m_abstract_declarator  */
-#line 1005 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
-#line 5210 "tools/widl/parser.tab.c"
+  case 339: /* type_qualifier: tCONST  */
+#line 1003 "tools/widl/parser.y"
+                                                { (yyval.type_qualifier) = TYPE_QUALIFIER_CONST; }
+#line 5214 "tools/widl/parser.tab.c"
     break;
 
-  case 348: /* abstract_declarator: callconv m_abstract_declarator  */
+  case 340: /* m_type_qual_list: %empty  */
 #line 1006 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv((yyval.declarator)->type, (yyvsp[-1].str)); }
-#line 5216 "tools/widl/parser.tab.c"
+                                                { (yyval.type_qualifier) = 0; }
+#line 5220 "tools/widl/parser.tab.c"
     break;
 
-  case 350: /* abstract_declarator_no_direct: '*' m_type_qual_list m_any_declarator  */
-#line 1013 "tools/widl/parser.y"
+  case 341: /* m_type_qual_list: m_type_qual_list type_qualifier  */
+#line 1007 "tools/widl/parser.y"
+                                                { (yyval.type_qualifier) = (yyvsp[-1].type_qualifier) | (yyvsp[0].type_qualifier); }
+#line 5226 "tools/widl/parser.tab.c"
+    break;
+
+  case 342: /* decl_spec: type m_decl_spec_no_type  */
+#line 1010 "tools/widl/parser.y"
+                                                { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[0].declspec), NULL, STG_NONE, 0, 0); }
+#line 5232 "tools/widl/parser.tab.c"
+    break;
+
+  case 343: /* decl_spec: decl_spec_no_type type m_decl_spec_no_type  */
+#line 1012 "tools/widl/parser.y"
+                                                { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[-2].declspec), (yyvsp[0].declspec), STG_NONE, 0, 0); }
+#line 5238 "tools/widl/parser.tab.c"
+    break;
+
+  case 344: /* m_decl_spec_no_type: %empty  */
+#line 1015 "tools/widl/parser.y"
+                                                { (yyval.declspec) = NULL; }
+#line 5244 "tools/widl/parser.tab.c"
+    break;
+
+  case 346: /* decl_spec_no_type: type_qualifier m_decl_spec_no_type  */
+#line 1020 "tools/widl/parser.y"
+                                                { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, STG_NONE, (yyvsp[-1].type_qualifier), 0); }
+#line 5250 "tools/widl/parser.tab.c"
+    break;
+
+  case 347: /* decl_spec_no_type: function_specifier m_decl_spec_no_type  */
+#line 1021 "tools/widl/parser.y"
+                                                  { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, STG_NONE, 0, (yyvsp[-1].function_specifier)); }
+#line 5256 "tools/widl/parser.tab.c"
+    break;
+
+  case 348: /* decl_spec_no_type: storage_cls_spec m_decl_spec_no_type  */
+#line 1022 "tools/widl/parser.y"
+                                                { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, (yyvsp[-1].stgclass), 0, 0); }
+#line 5262 "tools/widl/parser.tab.c"
+    break;
+
+  case 349: /* declarator: '*' m_type_qual_list declarator  */
+#line 1027 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
-#line 5222 "tools/widl/parser.tab.c"
-    break;
-
-  case 351: /* abstract_declarator_no_direct: callconv m_any_declarator  */
-#line 1014 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv((yyval.declarator)->type, (yyvsp[-1].str)); }
-#line 5228 "tools/widl/parser.tab.c"
-    break;
-
-  case 352: /* m_abstract_declarator: %empty  */
-#line 1018 "tools/widl/parser.y"
-                                                { (yyval.declarator) = make_declarator(NULL); }
-#line 5234 "tools/widl/parser.tab.c"
-    break;
-
-  case 354: /* abstract_direct_declarator: '(' abstract_declarator_no_direct ')'  */
-#line 1024 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[-1].declarator); }
-#line 5240 "tools/widl/parser.tab.c"
-    break;
-
-  case 355: /* abstract_direct_declarator: abstract_direct_declarator array  */
-#line 1025 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[-1].declarator); append_array((yyval.declarator), (yyvsp[0].expr)); }
-#line 5246 "tools/widl/parser.tab.c"
-    break;
-
-  case 356: /* abstract_direct_declarator: array  */
-#line 1026 "tools/widl/parser.y"
-                                                { (yyval.declarator) = make_declarator(NULL); append_array((yyval.declarator), (yyvsp[0].expr)); }
-#line 5252 "tools/widl/parser.tab.c"
-    break;
-
-  case 357: /* abstract_direct_declarator: '(' m_args ')'  */
-#line 1028 "tools/widl/parser.y"
-                                                { (yyval.declarator) = make_declarator(NULL);
-						  append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0);
-						}
-#line 5260 "tools/widl/parser.tab.c"
-    break;
-
-  case 358: /* abstract_direct_declarator: abstract_direct_declarator '(' m_args ')'  */
-#line 1032 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[-3].declarator);
-						  append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0);
-						}
 #line 5268 "tools/widl/parser.tab.c"
     break;
 
-  case 359: /* any_declarator: '*' m_type_qual_list m_any_declarator  */
-#line 1040 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
+  case 350: /* declarator: callconv declarator  */
+#line 1028 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv((yyval.declarator)->type, (yyvsp[-1].str)); }
 #line 5274 "tools/widl/parser.tab.c"
     break;
 
-  case 360: /* any_declarator: callconv m_any_declarator  */
-#line 1041 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv((yyval.declarator)->type, (yyvsp[-1].str)); }
+  case 352: /* direct_declarator: ident  */
+#line 1033 "tools/widl/parser.y"
+                                                { (yyval.declarator) = make_declarator((yyvsp[0].var)); }
 #line 5280 "tools/widl/parser.tab.c"
     break;
 
-  case 362: /* any_declarator_no_direct: '*' m_type_qual_list m_any_declarator  */
-#line 1048 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
+  case 353: /* direct_declarator: '(' declarator ')'  */
+#line 1034 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[-1].declarator); }
 #line 5286 "tools/widl/parser.tab.c"
     break;
 
-  case 363: /* any_declarator_no_direct: callconv m_any_declarator  */
-#line 1049 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv((yyval.declarator)->type, (yyvsp[-1].str)); }
+  case 354: /* direct_declarator: direct_declarator array  */
+#line 1035 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[-1].declarator); append_array((yyval.declarator), (yyvsp[0].expr)); }
 #line 5292 "tools/widl/parser.tab.c"
     break;
 
-  case 364: /* m_any_declarator: %empty  */
-#line 1053 "tools/widl/parser.y"
-                                                { (yyval.declarator) = make_declarator(NULL); }
+  case 355: /* direct_declarator: direct_declarator '(' m_args ')'  */
+#line 1036 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[-3].declarator); append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0); }
 #line 5298 "tools/widl/parser.tab.c"
     break;
 
-  case 366: /* any_direct_declarator: ident  */
-#line 1061 "tools/widl/parser.y"
-                                                { (yyval.declarator) = make_declarator((yyvsp[0].var)); }
+  case 356: /* abstract_declarator: '*' m_type_qual_list m_abstract_declarator  */
+#line 1042 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
 #line 5304 "tools/widl/parser.tab.c"
     break;
 
-  case 367: /* any_direct_declarator: '(' any_declarator_no_direct ')'  */
-#line 1062 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[-1].declarator); }
+  case 357: /* abstract_declarator: callconv m_abstract_declarator  */
+#line 1043 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv((yyval.declarator)->type, (yyvsp[-1].str)); }
 #line 5310 "tools/widl/parser.tab.c"
     break;
 
-  case 368: /* any_direct_declarator: any_direct_declarator array  */
-#line 1063 "tools/widl/parser.y"
-                                                { (yyval.declarator) = (yyvsp[-1].declarator); append_array((yyval.declarator), (yyvsp[0].expr)); }
+  case 359: /* abstract_declarator_no_direct: '*' m_type_qual_list m_any_declarator  */
+#line 1050 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
 #line 5316 "tools/widl/parser.tab.c"
     break;
 
-  case 369: /* any_direct_declarator: array  */
-#line 1064 "tools/widl/parser.y"
-                                                { (yyval.declarator) = make_declarator(NULL); append_array((yyval.declarator), (yyvsp[0].expr)); }
+  case 360: /* abstract_declarator_no_direct: callconv m_any_declarator  */
+#line 1051 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv((yyval.declarator)->type, (yyvsp[-1].str)); }
 #line 5322 "tools/widl/parser.tab.c"
     break;
 
-  case 370: /* any_direct_declarator: '(' m_args ')'  */
-#line 1066 "tools/widl/parser.y"
+  case 361: /* m_abstract_declarator: %empty  */
+#line 1055 "tools/widl/parser.y"
+                                                { (yyval.declarator) = make_declarator(NULL); }
+#line 5328 "tools/widl/parser.tab.c"
+    break;
+
+  case 363: /* abstract_direct_declarator: '(' abstract_declarator_no_direct ')'  */
+#line 1061 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[-1].declarator); }
+#line 5334 "tools/widl/parser.tab.c"
+    break;
+
+  case 364: /* abstract_direct_declarator: abstract_direct_declarator array  */
+#line 1062 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[-1].declarator); append_array((yyval.declarator), (yyvsp[0].expr)); }
+#line 5340 "tools/widl/parser.tab.c"
+    break;
+
+  case 365: /* abstract_direct_declarator: array  */
+#line 1063 "tools/widl/parser.y"
+                                                { (yyval.declarator) = make_declarator(NULL); append_array((yyval.declarator), (yyvsp[0].expr)); }
+#line 5346 "tools/widl/parser.tab.c"
+    break;
+
+  case 366: /* abstract_direct_declarator: '(' m_args ')'  */
+#line 1065 "tools/widl/parser.y"
                                                 { (yyval.declarator) = make_declarator(NULL);
 						  append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0);
 						}
-#line 5330 "tools/widl/parser.tab.c"
+#line 5354 "tools/widl/parser.tab.c"
     break;
 
-  case 371: /* any_direct_declarator: any_direct_declarator '(' m_args ')'  */
-#line 1070 "tools/widl/parser.y"
+  case 367: /* abstract_direct_declarator: abstract_direct_declarator '(' m_args ')'  */
+#line 1069 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-3].declarator);
 						  append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0);
 						}
-#line 5338 "tools/widl/parser.tab.c"
-    break;
-
-  case 372: /* declarator_list: declarator  */
-#line 1076 "tools/widl/parser.y"
-                                                { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[0].declarator) ); }
-#line 5344 "tools/widl/parser.tab.c"
-    break;
-
-  case 373: /* declarator_list: declarator_list ',' declarator  */
-#line 1077 "tools/widl/parser.y"
-                                                { (yyval.declarator_list) = append_declarator( (yyvsp[-2].declarator_list), (yyvsp[0].declarator) ); }
-#line 5350 "tools/widl/parser.tab.c"
-    break;
-
-  case 374: /* m_bitfield: %empty  */
-#line 1080 "tools/widl/parser.y"
-                                                { (yyval.expr) = NULL; }
-#line 5356 "tools/widl/parser.tab.c"
-    break;
-
-  case 375: /* m_bitfield: ':' expr_const  */
-#line 1081 "tools/widl/parser.y"
-                                                { (yyval.expr) = (yyvsp[0].expr); }
 #line 5362 "tools/widl/parser.tab.c"
     break;
 
-  case 376: /* struct_declarator: any_declarator m_bitfield  */
-#line 1084 "tools/widl/parser.y"
+  case 368: /* any_declarator: '*' m_type_qual_list m_any_declarator  */
+#line 1077 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
+#line 5368 "tools/widl/parser.tab.c"
+    break;
+
+  case 369: /* any_declarator: callconv m_any_declarator  */
+#line 1078 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv((yyval.declarator)->type, (yyvsp[-1].str)); }
+#line 5374 "tools/widl/parser.tab.c"
+    break;
+
+  case 371: /* any_declarator_no_direct: '*' m_type_qual_list m_any_declarator  */
+#line 1085 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
+#line 5380 "tools/widl/parser.tab.c"
+    break;
+
+  case 372: /* any_declarator_no_direct: callconv m_any_declarator  */
+#line 1086 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv((yyval.declarator)->type, (yyvsp[-1].str)); }
+#line 5386 "tools/widl/parser.tab.c"
+    break;
+
+  case 373: /* m_any_declarator: %empty  */
+#line 1090 "tools/widl/parser.y"
+                                                { (yyval.declarator) = make_declarator(NULL); }
+#line 5392 "tools/widl/parser.tab.c"
+    break;
+
+  case 375: /* any_direct_declarator: ident  */
+#line 1098 "tools/widl/parser.y"
+                                                { (yyval.declarator) = make_declarator((yyvsp[0].var)); }
+#line 5398 "tools/widl/parser.tab.c"
+    break;
+
+  case 376: /* any_direct_declarator: '(' any_declarator_no_direct ')'  */
+#line 1099 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[-1].declarator); }
+#line 5404 "tools/widl/parser.tab.c"
+    break;
+
+  case 377: /* any_direct_declarator: any_direct_declarator array  */
+#line 1100 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[-1].declarator); append_array((yyval.declarator), (yyvsp[0].expr)); }
+#line 5410 "tools/widl/parser.tab.c"
+    break;
+
+  case 378: /* any_direct_declarator: array  */
+#line 1101 "tools/widl/parser.y"
+                                                { (yyval.declarator) = make_declarator(NULL); append_array((yyval.declarator), (yyvsp[0].expr)); }
+#line 5416 "tools/widl/parser.tab.c"
+    break;
+
+  case 379: /* any_direct_declarator: '(' m_args ')'  */
+#line 1103 "tools/widl/parser.y"
+                                                { (yyval.declarator) = make_declarator(NULL);
+						  append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0);
+						}
+#line 5424 "tools/widl/parser.tab.c"
+    break;
+
+  case 380: /* any_direct_declarator: any_direct_declarator '(' m_args ')'  */
+#line 1107 "tools/widl/parser.y"
+                                                { (yyval.declarator) = (yyvsp[-3].declarator);
+						  append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0);
+						}
+#line 5432 "tools/widl/parser.tab.c"
+    break;
+
+  case 381: /* declarator_list: declarator  */
+#line 1113 "tools/widl/parser.y"
+                                                { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[0].declarator) ); }
+#line 5438 "tools/widl/parser.tab.c"
+    break;
+
+  case 382: /* declarator_list: declarator_list ',' declarator  */
+#line 1114 "tools/widl/parser.y"
+                                                { (yyval.declarator_list) = append_declarator( (yyvsp[-2].declarator_list), (yyvsp[0].declarator) ); }
+#line 5444 "tools/widl/parser.tab.c"
+    break;
+
+  case 383: /* m_bitfield: %empty  */
+#line 1117 "tools/widl/parser.y"
+                                                { (yyval.expr) = NULL; }
+#line 5450 "tools/widl/parser.tab.c"
+    break;
+
+  case 384: /* m_bitfield: ':' expr_const  */
+#line 1118 "tools/widl/parser.y"
+                                                { (yyval.expr) = (yyvsp[0].expr); }
+#line 5456 "tools/widl/parser.tab.c"
+    break;
+
+  case 385: /* struct_declarator: any_declarator m_bitfield  */
+#line 1121 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-1].declarator); (yyval.declarator)->bits = (yyvsp[0].expr);
 						  if (!(yyval.declarator)->bits && !(yyval.declarator)->var->name)
 						    error_loc("unnamed fields are not allowed\n");
 						}
-#line 5371 "tools/widl/parser.tab.c"
+#line 5465 "tools/widl/parser.tab.c"
     break;
 
-  case 377: /* struct_declarator_list: struct_declarator  */
-#line 1091 "tools/widl/parser.y"
+  case 386: /* struct_declarator_list: struct_declarator  */
+#line 1128 "tools/widl/parser.y"
                                                 { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[0].declarator) ); }
-#line 5377 "tools/widl/parser.tab.c"
+#line 5471 "tools/widl/parser.tab.c"
     break;
 
-  case 378: /* struct_declarator_list: struct_declarator_list ',' struct_declarator  */
-#line 1093 "tools/widl/parser.y"
+  case 387: /* struct_declarator_list: struct_declarator_list ',' struct_declarator  */
+#line 1130 "tools/widl/parser.y"
                                                 { (yyval.declarator_list) = append_declarator( (yyvsp[-2].declarator_list), (yyvsp[0].declarator) ); }
-#line 5383 "tools/widl/parser.tab.c"
+#line 5477 "tools/widl/parser.tab.c"
     break;
 
-  case 379: /* init_declarator: declarator  */
-#line 1097 "tools/widl/parser.y"
+  case 388: /* init_declarator: declarator  */
+#line 1134 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); }
-#line 5389 "tools/widl/parser.tab.c"
+#line 5483 "tools/widl/parser.tab.c"
     break;
 
-  case 380: /* init_declarator: declarator '=' expr_const  */
-#line 1098 "tools/widl/parser.y"
+  case 389: /* init_declarator: declarator '=' expr_const  */
+#line 1135 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-2].declarator); (yyvsp[-2].declarator)->var->eval = (yyvsp[0].expr); }
-#line 5395 "tools/widl/parser.tab.c"
+#line 5489 "tools/widl/parser.tab.c"
     break;
 
-  case 381: /* threading_type: tAPARTMENT  */
-#line 1102 "tools/widl/parser.y"
+  case 390: /* threading_type: tAPARTMENT  */
+#line 1139 "tools/widl/parser.y"
                                                 { (yyval.num) = THREADING_APARTMENT; }
-#line 5401 "tools/widl/parser.tab.c"
+#line 5495 "tools/widl/parser.tab.c"
     break;
 
-  case 382: /* threading_type: tNEUTRAL  */
-#line 1103 "tools/widl/parser.y"
+  case 391: /* threading_type: tNEUTRAL  */
+#line 1140 "tools/widl/parser.y"
                                                 { (yyval.num) = THREADING_NEUTRAL; }
-#line 5407 "tools/widl/parser.tab.c"
+#line 5501 "tools/widl/parser.tab.c"
     break;
 
-  case 383: /* threading_type: tSINGLE  */
-#line 1104 "tools/widl/parser.y"
+  case 392: /* threading_type: tSINGLE  */
+#line 1141 "tools/widl/parser.y"
                                                 { (yyval.num) = THREADING_SINGLE; }
-#line 5413 "tools/widl/parser.tab.c"
+#line 5507 "tools/widl/parser.tab.c"
     break;
 
-  case 384: /* threading_type: tFREE  */
-#line 1105 "tools/widl/parser.y"
+  case 393: /* threading_type: tFREE  */
+#line 1142 "tools/widl/parser.y"
                                                 { (yyval.num) = THREADING_FREE; }
-#line 5419 "tools/widl/parser.tab.c"
+#line 5513 "tools/widl/parser.tab.c"
     break;
 
-  case 385: /* threading_type: tBOTH  */
-#line 1106 "tools/widl/parser.y"
+  case 394: /* threading_type: tBOTH  */
+#line 1143 "tools/widl/parser.y"
                                                 { (yyval.num) = THREADING_BOTH; }
-#line 5425 "tools/widl/parser.tab.c"
+#line 5519 "tools/widl/parser.tab.c"
     break;
 
-  case 386: /* pointer_type: tREF  */
-#line 1110 "tools/widl/parser.y"
+  case 395: /* pointer_type: tREF  */
+#line 1147 "tools/widl/parser.y"
                                                 { (yyval.num) = FC_RP; }
-#line 5431 "tools/widl/parser.tab.c"
+#line 5525 "tools/widl/parser.tab.c"
     break;
 
-  case 387: /* pointer_type: tUNIQUE  */
-#line 1111 "tools/widl/parser.y"
+  case 396: /* pointer_type: tUNIQUE  */
+#line 1148 "tools/widl/parser.y"
                                                 { (yyval.num) = FC_UP; }
-#line 5437 "tools/widl/parser.tab.c"
+#line 5531 "tools/widl/parser.tab.c"
     break;
 
-  case 388: /* pointer_type: tPTR  */
-#line 1112 "tools/widl/parser.y"
+  case 397: /* pointer_type: tPTR  */
+#line 1149 "tools/widl/parser.y"
                                                 { (yyval.num) = FC_FP; }
-#line 5443 "tools/widl/parser.tab.c"
+#line 5537 "tools/widl/parser.tab.c"
     break;
 
-  case 389: /* structdef: tSTRUCT t_ident '{' fields '}'  */
-#line 1115 "tools/widl/parser.y"
+  case 398: /* structdef: tSTRUCT t_ident '{' fields '}'  */
+#line 1152 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_struct((yyvsp[-3].str), current_namespace, TRUE, (yyvsp[-1].var_list)); }
-#line 5449 "tools/widl/parser.tab.c"
+#line 5543 "tools/widl/parser.tab.c"
     break;
 
-  case 390: /* type: tVOID  */
-#line 1118 "tools/widl/parser.y"
+  case 399: /* type: tVOID  */
+#line 1155 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_void(); }
-#line 5455 "tools/widl/parser.tab.c"
+#line 5549 "tools/widl/parser.tab.c"
     break;
 
-  case 391: /* type: qualified_type  */
-#line 1119 "tools/widl/parser.y"
+  case 400: /* type: qualified_type  */
+#line 1156 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5461 "tools/widl/parser.tab.c"
+#line 5555 "tools/widl/parser.tab.c"
     break;
 
-  case 392: /* type: base_type  */
-#line 1120 "tools/widl/parser.y"
+  case 401: /* type: base_type  */
+#line 1157 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5467 "tools/widl/parser.tab.c"
+#line 5561 "tools/widl/parser.tab.c"
     break;
 
-  case 393: /* type: enumdef  */
-#line 1121 "tools/widl/parser.y"
+  case 402: /* type: enumdef  */
+#line 1158 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5473 "tools/widl/parser.tab.c"
+#line 5567 "tools/widl/parser.tab.c"
     break;
 
-  case 394: /* type: tENUM aIDENTIFIER  */
-#line 1122 "tools/widl/parser.y"
+  case 403: /* type: tENUM aIDENTIFIER  */
+#line 1159 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_enum((yyvsp[0].str), current_namespace, FALSE, NULL); }
-#line 5479 "tools/widl/parser.tab.c"
+#line 5573 "tools/widl/parser.tab.c"
     break;
 
-  case 395: /* type: structdef  */
-#line 1123 "tools/widl/parser.y"
+  case 404: /* type: structdef  */
+#line 1160 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5485 "tools/widl/parser.tab.c"
+#line 5579 "tools/widl/parser.tab.c"
     break;
 
-  case 396: /* type: tSTRUCT aIDENTIFIER  */
-#line 1124 "tools/widl/parser.y"
+  case 405: /* type: tSTRUCT aIDENTIFIER  */
+#line 1161 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_struct((yyvsp[0].str), current_namespace, FALSE, NULL); }
-#line 5491 "tools/widl/parser.tab.c"
+#line 5585 "tools/widl/parser.tab.c"
     break;
 
-  case 397: /* type: uniondef  */
-#line 1125 "tools/widl/parser.y"
+  case 406: /* type: uniondef  */
+#line 1162 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5497 "tools/widl/parser.tab.c"
+#line 5591 "tools/widl/parser.tab.c"
     break;
 
-  case 398: /* type: tUNION aIDENTIFIER  */
-#line 1126 "tools/widl/parser.y"
+  case 407: /* type: tUNION aIDENTIFIER  */
+#line 1163 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_nonencapsulated_union((yyvsp[0].str), FALSE, NULL); }
-#line 5503 "tools/widl/parser.tab.c"
+#line 5597 "tools/widl/parser.tab.c"
     break;
 
-  case 399: /* type: tSAFEARRAY '(' type ')'  */
-#line 1127 "tools/widl/parser.y"
+  case 408: /* type: tSAFEARRAY '(' type ')'  */
+#line 1164 "tools/widl/parser.y"
                                                 { (yyval.type) = make_safearray((yyvsp[-1].type)); }
-#line 5509 "tools/widl/parser.tab.c"
+#line 5603 "tools/widl/parser.tab.c"
     break;
 
-  case 400: /* typedef: m_attributes tTYPEDEF m_attributes decl_spec declarator_list  */
-#line 1131 "tools/widl/parser.y"
+  case 409: /* typedef: m_attributes tTYPEDEF m_attributes decl_spec declarator_list  */
+#line 1168 "tools/widl/parser.y"
                                                 { (yyvsp[-4].attr_list) = append_attribs((yyvsp[-4].attr_list), (yyvsp[-2].attr_list));
 						  reg_typedefs((yyvsp[-1].declspec), (yyvsp[0].declarator_list), check_typedef_attrs((yyvsp[-4].attr_list)));
 						  (yyval.statement) = make_statement_typedef((yyvsp[0].declarator_list), !(yyvsp[-1].declspec)->type->defined);
 						}
-#line 5518 "tools/widl/parser.tab.c"
+#line 5612 "tools/widl/parser.tab.c"
     break;
 
-  case 401: /* uniondef: tUNION t_ident '{' ne_union_fields '}'  */
-#line 1138 "tools/widl/parser.y"
+  case 410: /* uniondef: tUNION t_ident '{' ne_union_fields '}'  */
+#line 1175 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_nonencapsulated_union((yyvsp[-3].str), TRUE, (yyvsp[-1].var_list)); }
-#line 5524 "tools/widl/parser.tab.c"
+#line 5618 "tools/widl/parser.tab.c"
     break;
 
-  case 402: /* uniondef: tUNION t_ident tSWITCH '(' s_field ')' m_ident '{' cases '}'  */
-#line 1141 "tools/widl/parser.y"
+  case 411: /* uniondef: tUNION t_ident tSWITCH '(' s_field ')' m_ident '{' cases '}'  */
+#line 1178 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_encapsulated_union((yyvsp[-8].str), (yyvsp[-5].var), (yyvsp[-3].var), (yyvsp[-1].var_list)); }
-#line 5530 "tools/widl/parser.tab.c"
+#line 5624 "tools/widl/parser.tab.c"
     break;
 
-  case 403: /* version: aNUM  */
-#line 1145 "tools/widl/parser.y"
+  case 412: /* version: aNUM  */
+#line 1182 "tools/widl/parser.y"
                                                 { (yyval.num) = MAKEVERSION((yyvsp[0].num), 0); }
-#line 5536 "tools/widl/parser.tab.c"
+#line 5630 "tools/widl/parser.tab.c"
     break;
 
-  case 404: /* version: aNUM '.' aNUM  */
-#line 1146 "tools/widl/parser.y"
+  case 413: /* version: aNUM '.' aNUM  */
+#line 1183 "tools/widl/parser.y"
                                                 { (yyval.num) = MAKEVERSION((yyvsp[-2].num), (yyvsp[0].num)); }
-#line 5542 "tools/widl/parser.tab.c"
+#line 5636 "tools/widl/parser.tab.c"
     break;
 
-  case 405: /* version: aHEXNUM  */
-#line 1147 "tools/widl/parser.y"
+  case 414: /* version: aHEXNUM  */
+#line 1184 "tools/widl/parser.y"
                                                 { (yyval.num) = (yyvsp[0].num); }
-#line 5548 "tools/widl/parser.tab.c"
+#line 5642 "tools/widl/parser.tab.c"
     break;
 
-  case 410: /* acf_int_statement: tTYPEDEF acf_attributes aKNOWNTYPE ';'  */
-#line 1160 "tools/widl/parser.y"
+  case 419: /* acf_int_statement: tTYPEDEF acf_attributes aKNOWNTYPE ';'  */
+#line 1199 "tools/widl/parser.y"
                                                 { type_t *type = find_type_or_error((yyvsp[-1].str), 0);
                                                   type->attrs = append_attr_list(type->attrs, (yyvsp[-2].attr_list));
                                                 }
-#line 5556 "tools/widl/parser.tab.c"
+#line 5650 "tools/widl/parser.tab.c"
     break;
 
-  case 411: /* acf_interface: acf_attributes tINTERFACE aKNOWNTYPE '{' acf_int_statements '}'  */
-#line 1165 "tools/widl/parser.y"
+  case 420: /* acf_interface: acf_attributes tINTERFACE aKNOWNTYPE '{' acf_int_statements '}'  */
+#line 1206 "tools/widl/parser.y"
                                                 {  type_t *iface = find_type_or_error2((yyvsp[-3].str), 0);
                                                    if (type_get_type(iface) != TYPE_INTERFACE)
                                                        error_loc("%s is not an interface\n", iface->name);
                                                    iface->attrs = append_attr_list(iface->attrs, (yyvsp[-5].attr_list));
                                                 }
-#line 5566 "tools/widl/parser.tab.c"
+#line 5660 "tools/widl/parser.tab.c"
     break;
 
-  case 412: /* acf_attributes: %empty  */
-#line 1172 "tools/widl/parser.y"
+  case 421: /* acf_attributes: %empty  */
+#line 1214 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = NULL; }
-#line 5572 "tools/widl/parser.tab.c"
+#line 5666 "tools/widl/parser.tab.c"
     break;
 
-  case 413: /* acf_attributes: '[' acf_attribute_list ']'  */
-#line 1173 "tools/widl/parser.y"
+  case 422: /* acf_attributes: '[' acf_attribute_list ']'  */
+#line 1215 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = (yyvsp[-1].attr_list); }
-#line 5578 "tools/widl/parser.tab.c"
+#line 5672 "tools/widl/parser.tab.c"
     break;
 
-  case 414: /* acf_attribute_list: acf_attribute  */
-#line 1176 "tools/widl/parser.y"
+  case 423: /* acf_attribute_list: acf_attribute  */
+#line 1219 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = append_attr(NULL, (yyvsp[0].attr)); }
-#line 5584 "tools/widl/parser.tab.c"
+#line 5678 "tools/widl/parser.tab.c"
     break;
 
-  case 415: /* acf_attribute_list: acf_attribute_list ',' acf_attribute  */
-#line 1177 "tools/widl/parser.y"
+  case 424: /* acf_attribute_list: acf_attribute_list ',' acf_attribute  */
+#line 1220 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = append_attr((yyvsp[-2].attr_list), (yyvsp[0].attr)); }
-#line 5590 "tools/widl/parser.tab.c"
+#line 5684 "tools/widl/parser.tab.c"
     break;
 
-  case 416: /* acf_attribute: tENCODE  */
-#line 1180 "tools/widl/parser.y"
+  case 425: /* acf_attribute: tALLOCATE '(' allocate_option_list ')'  */
+#line 1225 "tools/widl/parser.y"
+                                                { (yyval.attr) = make_attrv(ATTR_ALLOCATE, (yyvsp[-1].num)); }
+#line 5690 "tools/widl/parser.tab.c"
+    break;
+
+  case 426: /* acf_attribute: tENCODE  */
+#line 1226 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_ENCODE); }
-#line 5596 "tools/widl/parser.tab.c"
+#line 5696 "tools/widl/parser.tab.c"
     break;
 
-  case 417: /* acf_attribute: tDECODE  */
-#line 1181 "tools/widl/parser.y"
+  case 427: /* acf_attribute: tDECODE  */
+#line 1227 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_DECODE); }
-#line 5602 "tools/widl/parser.tab.c"
+#line 5702 "tools/widl/parser.tab.c"
     break;
 
-  case 418: /* acf_attribute: tEXPLICITHANDLE  */
-#line 1182 "tools/widl/parser.y"
+  case 428: /* acf_attribute: tEXPLICITHANDLE  */
+#line 1228 "tools/widl/parser.y"
                                                 { (yyval.attr) = make_attr(ATTR_EXPLICIT_HANDLE); }
-#line 5608 "tools/widl/parser.tab.c"
+#line 5708 "tools/widl/parser.tab.c"
+    break;
+
+  case 429: /* allocate_option_list: allocate_option  */
+#line 1232 "tools/widl/parser.y"
+                                                { (yyval.num) = (yyvsp[0].num); }
+#line 5714 "tools/widl/parser.tab.c"
+    break;
+
+  case 430: /* allocate_option_list: allocate_option_list ',' allocate_option  */
+#line 1234 "tools/widl/parser.y"
+                                                { (yyval.num) = (yyvsp[-2].num) | (yyvsp[0].num); }
+#line 5720 "tools/widl/parser.tab.c"
+    break;
+
+  case 431: /* allocate_option: tDONTFREE  */
+#line 1238 "tools/widl/parser.y"
+                                                { (yyval.num) = FC_DONT_FREE; }
+#line 5726 "tools/widl/parser.tab.c"
+    break;
+
+  case 432: /* allocate_option: tFREE  */
+#line 1239 "tools/widl/parser.y"
+                                                { (yyval.num) = 0; }
+#line 5732 "tools/widl/parser.tab.c"
+    break;
+
+  case 433: /* allocate_option: tALLNODES  */
+#line 1240 "tools/widl/parser.y"
+                                                { (yyval.num) = FC_ALLOCATE_ALL_NODES; }
+#line 5738 "tools/widl/parser.tab.c"
+    break;
+
+  case 434: /* allocate_option: tSINGLENODE  */
+#line 1241 "tools/widl/parser.y"
+                                                { (yyval.num) = 0; }
+#line 5744 "tools/widl/parser.tab.c"
     break;
 
 
-#line 5612 "tools/widl/parser.tab.c"
+#line 5748 "tools/widl/parser.tab.c"
 
       default: break;
     }
@@ -5833,7 +5969,7 @@
   return yyresult;
 }
 
-#line 1184 "tools/widl/parser.y"
+#line 1244 "tools/widl/parser.y"
 
 
 static void decl_builtin_basic(const char *name, enum type_basic_type type)
@@ -5875,27 +6011,6 @@
     return list;
 }
 
-static attr_list_t *append_attr(attr_list_t *list, attr_t *attr)
-{
-    attr_t *attr_existing;
-    if (!attr) return list;
-    if (!list)
-    {
-        list = xmalloc( sizeof(*list) );
-        list_init( list );
-    }
-    LIST_FOR_EACH_ENTRY(attr_existing, list, attr_t, entry)
-        if (attr_existing->type == attr->type)
-        {
-            parser_warning("duplicate attribute %s\n", get_attr_display_name(attr->type));
-            /* use the last attribute, like MIDL does */
-            list_remove(&attr_existing->entry);
-            break;
-        }
-    list_add_tail( list, &attr->entry );
-    return list;
-}
-
 static attr_list_t *move_attr(attr_list_t *dst, attr_list_t *src, enum attr_type type)
 {
   attr_t *attr;
@@ -6016,6 +6131,17 @@
   return a;
 }
 
+static attr_t *make_custom_attr(UUID *id, expr_t *pval)
+{
+  attr_t *a = xmalloc(sizeof(attr_t));
+  attr_custdata_t *cstdata = xmalloc(sizeof(attr_custdata_t));
+  a->type = ATTR_CUSTOM;
+  cstdata->id = *id;
+  cstdata->pval = pval;
+  a->u.pval = cstdata;
+  return a;
+}
+
 static expr_list_t *append_expr(expr_list_t *list, expr_t *expr)
 {
     if (!expr) return list;
@@ -6558,7 +6684,7 @@
   if (is_global_namespace(namespace))
     type->c_name = name;
   else
-    type->c_name = format_namespace(namespace, "__x_", "_C", name);
+    type->c_name = format_namespace(namespace, "__x_", "_C", name, use_abi_namespace ? "ABI" : NULL);
   nt->type = type;
   nt->t = t;
   nt->next = namespace->type_hash[hash];
@@ -6755,6 +6881,8 @@
 {
     unsigned int dce_compatible : 1;
     unsigned int acf : 1;
+    unsigned int multiple : 1;
+
     unsigned int on_interface : 1;
     unsigned int on_function : 1;
     unsigned int on_arg : 1;
@@ -6768,113 +6896,142 @@
     unsigned int on_dispinterface : 1;
     unsigned int on_module : 1;
     unsigned int on_coclass : 1;
+    unsigned int on_apicontract : 1;
     const char *display_name;
 };
 
 struct allowed_attr allowed_attr[] =
 {
-    /* attr                        { D ACF I Fn ARG T En Enm St Un Fi L  DI M  C  <display name> } */
-    /* ATTR_AGGREGATABLE */        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "aggregatable" },
-    /* ATTR_ANNOTATION */          { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "annotation" },
-    /* ATTR_APPOBJECT */           { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "appobject" },
-    /* ATTR_ASYNC */               { 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "async" },
-    /* ATTR_ASYNCUUID */           { 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, "async_uuid" },
-    /* ATTR_AUTO_HANDLE */         { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "auto_handle" },
-    /* ATTR_BINDABLE */            { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "bindable" },
-    /* ATTR_BROADCAST */           { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "broadcast" },
-    /* ATTR_CALLAS */              { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "call_as" },
-    /* ATTR_CALLCONV */            { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL },
-    /* ATTR_CASE */                { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "case" },
-    /* ATTR_CODE */                { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "code" },
-    /* ATTR_COMMSTATUS */          { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "comm_status" },
-    /* ATTR_CONTEXTHANDLE */       { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "context_handle" },
-    /* ATTR_CONTROL */             { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, "control" },
-    /* ATTR_DECODE */              { 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "decode" },
-    /* ATTR_DEFAULT */             { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, "default" },
-    /* ATTR_DEFAULTBIND */         { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "defaultbind" },
-    /* ATTR_DEFAULTCOLLELEM */     { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "defaultcollelem" },
-    /* ATTR_DEFAULTVALUE */        { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "defaultvalue" },
-    /* ATTR_DEFAULTVTABLE */       { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "defaultvtable" },
- /* ATTR_DISABLECONSISTENCYCHECK */{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "disable_consistency_check" },
-    /* ATTR_DISPINTERFACE */       { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL },
-    /* ATTR_DISPLAYBIND */         { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "displaybind" },
-    /* ATTR_DLLNAME */             { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "dllname" },
-    /* ATTR_DUAL */                { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "dual" },
-    /* ATTR_ENABLEALLOCATE */      { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "enable_allocate" },
-    /* ATTR_ENCODE */              { 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "encode" },
-    /* ATTR_ENDPOINT */            { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "endpoint" },
-    /* ATTR_ENTRY */               { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "entry" },
-    /* ATTR_EXPLICIT_HANDLE */     { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "explicit_handle" },
-    /* ATTR_FAULTSTATUS */         { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "fault_status" },
-    /* ATTR_FORCEALLOCATE */       { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "force_allocate" },
-    /* ATTR_HANDLE */              { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "handle" },
-    /* ATTR_HELPCONTEXT */         { 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, "helpcontext" },
-    /* ATTR_HELPFILE */            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "helpfile" },
-    /* ATTR_HELPSTRING */          { 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, "helpstring" },
-    /* ATTR_HELPSTRINGCONTEXT */   { 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, "helpstringcontext" },
-    /* ATTR_HELPSTRINGDLL */       { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "helpstringdll" },
-    /* ATTR_HIDDEN */              { 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, "hidden" },
-    /* ATTR_ID */                  { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, "id" },
-    /* ATTR_IDEMPOTENT */          { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "idempotent" },
-    /* ATTR_IGNORE */              { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "ignore" },
-    /* ATTR_IIDIS */               { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "iid_is" },
-    /* ATTR_IMMEDIATEBIND */       { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "immediatebind" },
-    /* ATTR_IMPLICIT_HANDLE */     { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "implicit_handle" },
-    /* ATTR_IN */                  { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "in" },
-    /* ATTR_INPUTSYNC */           { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inputsync" },
-    /* ATTR_LENGTHIS */            { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "length_is" },
-    /* ATTR_LIBLCID */             { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "lcid" },
-    /* ATTR_LICENSED */            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "licensed" },
-    /* ATTR_LOCAL */               { 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "local" },
-    /* ATTR_MAYBE */               { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "maybe" },
-    /* ATTR_MESSAGE */             { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "message" },
-    /* ATTR_NOCODE */              { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "nocode" },
-    /* ATTR_NONBROWSABLE */        { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "nonbrowsable" },
-    /* ATTR_NONCREATABLE */        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "noncreatable" },
-    /* ATTR_NONEXTENSIBLE */       { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "nonextensible" },
-    /* ATTR_NOTIFY */              { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "notify" },
-    /* ATTR_NOTIFYFLAG */          { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "notify_flag" },
-    /* ATTR_OBJECT */              { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "object" },
-    /* ATTR_ODL */                 { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, "odl" },
-    /* ATTR_OLEAUTOMATION */       { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "oleautomation" },
-    /* ATTR_OPTIMIZE */            { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "optimize" },
-    /* ATTR_OPTIONAL */            { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "optional" },
-    /* ATTR_OUT */                 { 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "out" },
-    /* ATTR_PARAMLCID */           { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "lcid" },
-    /* ATTR_PARTIALIGNORE */       { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "partial_ignore" },
-    /* ATTR_POINTERDEFAULT */      { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "pointer_default" },
-    /* ATTR_POINTERTYPE */         { 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, "ref, unique or ptr" },
-    /* ATTR_PROGID */              { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "progid" },
-    /* ATTR_PROPGET */             { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propget" },
-    /* ATTR_PROPPUT */             { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propput" },
-    /* ATTR_PROPPUTREF */          { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propputref" },
-    /* ATTR_PROXY */               { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "proxy" },
-    /* ATTR_PUBLIC */              { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "public" },
-    /* ATTR_RANGE */               { 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, "range" },
-    /* ATTR_READONLY */            { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "readonly" },
-    /* ATTR_REPRESENTAS */         { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "represent_as" },
-    /* ATTR_REQUESTEDIT */         { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "requestedit" },
-    /* ATTR_RESTRICTED */          { 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, "restricted" },
-    /* ATTR_RETVAL */              { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "retval" },
-    /* ATTR_SIZEIS */              { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "size_is" },
-    /* ATTR_SOURCE */              { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, "source" },
-    /* ATTR_STRICTCONTEXTHANDLE */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "strict_context_handle" },
-    /* ATTR_STRING */              { 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, "string" },
-    /* ATTR_SWITCHIS */            { 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "switch_is" },
-    /* ATTR_SWITCHTYPE */          { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, "switch_type" },
-    /* ATTR_THREADING */           { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "threading" },
-    /* ATTR_TRANSMITAS */          { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "transmit_as" },
-    /* ATTR_UIDEFAULT */           { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "uidefault" },
-    /* ATTR_USESGETLASTERROR */    { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "usesgetlasterror" },
-    /* ATTR_USERMARSHAL */         { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "user_marshal" },
-    /* ATTR_UUID */                { 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, "uuid" },
-    /* ATTR_V1ENUM */              { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, "v1_enum" },
-    /* ATTR_VARARG */              { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "vararg" },
-    /* ATTR_VERSION */             { 1, 0, 1, 0, 0, 1, 1, 0, 2, 0, 0, 1, 0, 0, 1, "version" },
-    /* ATTR_VIPROGID */            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "vi_progid" },
-    /* ATTR_WIREMARSHAL */         { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "wire_marshal" },
+    /* attr                        { D ACF M   I Fn ARG T En Enm St Un Fi L  DI M  C AC  <display name> } */
+    /* ATTR_AGGREGATABLE */        { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "aggregatable" },
+    /* ATTR_ALLOCATE */            { 0, 1, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "allocate" },
+    /* ATTR_ANNOTATION */          { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "annotation" },
+    /* ATTR_APPOBJECT */           { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "appobject" },
+    /* ATTR_ASYNC */               { 0, 1, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "async" },
+    /* ATTR_ASYNCUUID */           { 1, 0, 0,  1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, "async_uuid" },
+    /* ATTR_AUTO_HANDLE */         { 1, 1, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "auto_handle" },
+    /* ATTR_BINDABLE */            { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "bindable" },
+    /* ATTR_BROADCAST */           { 1, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "broadcast" },
+    /* ATTR_CALLAS */              { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "call_as" },
+    /* ATTR_CALLCONV */            { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL },
+    /* ATTR_CASE */                { 1, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "case" },
+    /* ATTR_CODE */                { 0, 1, 0,  1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "code" },
+    /* ATTR_COMMSTATUS */          { 0, 0, 0,  0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "comm_status" },
+    /* ATTR_CONTEXTHANDLE */       { 1, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "context_handle" },
+    /* ATTR_CONTRACT */            { 0, 0, 0,  1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, "contract" },
+    /* ATTR_CONTRACTVERSION */     { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "contractversion" },
+    /* ATTR_CONTROL */             { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, "control" },
+    /* ATTR_CUSTOM */              { 0, 0, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, "custom" },
+    /* ATTR_DECODE */              { 0, 0, 0,  1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "decode" },
+    /* ATTR_DEFAULT */             { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, "default" },
+    /* ATTR_DEFAULTBIND */         { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "defaultbind" },
+    /* ATTR_DEFAULTCOLLELEM */     { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "defaultcollelem" },
+    /* ATTR_DEFAULTVALUE */        { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "defaultvalue" },
+    /* ATTR_DEFAULTVTABLE */       { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "defaultvtable" },
+ /* ATTR_DISABLECONSISTENCYCHECK */{ 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "disable_consistency_check" },
+    /* ATTR_DISPINTERFACE */       { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL },
+    /* ATTR_DISPLAYBIND */         { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "displaybind" },
+    /* ATTR_DLLNAME */             { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, "dllname" },
+    /* ATTR_DUAL */                { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "dual" },
+    /* ATTR_ENABLEALLOCATE */      { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "enable_allocate" },
+    /* ATTR_ENCODE */              { 0, 0, 0,  1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "encode" },
+    /* ATTR_ENDPOINT */            { 1, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "endpoint" },
+    /* ATTR_ENTRY */               { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "entry" },
+    /* ATTR_EXPLICIT_HANDLE */     { 1, 1, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "explicit_handle" },
+    /* ATTR_FAULTSTATUS */         { 0, 0, 0,  0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "fault_status" },
+    /* ATTR_FORCEALLOCATE */       { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "force_allocate" },
+    /* ATTR_HANDLE */              { 1, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "handle" },
+    /* ATTR_HELPCONTEXT */         { 0, 0, 0,  1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, "helpcontext" },
+    /* ATTR_HELPFILE */            { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "helpfile" },
+    /* ATTR_HELPSTRING */          { 0, 0, 0,  1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, "helpstring" },
+    /* ATTR_HELPSTRINGCONTEXT */   { 0, 0, 0,  1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, "helpstringcontext" },
+    /* ATTR_HELPSTRINGDLL */       { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "helpstringdll" },
+    /* ATTR_HIDDEN */              { 0, 0, 0,  1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, "hidden" },
+    /* ATTR_ID */                  { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, "id" },
+    /* ATTR_IDEMPOTENT */          { 1, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "idempotent" },
+    /* ATTR_IGNORE */              { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "ignore" },
+    /* ATTR_IIDIS */               { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "iid_is" },
+    /* ATTR_IMMEDIATEBIND */       { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "immediatebind" },
+    /* ATTR_IMPLICIT_HANDLE */     { 1, 1, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "implicit_handle" },
+    /* ATTR_IN */                  { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "in" },
+    /* ATTR_INPUTSYNC */           { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inputsync" },
+    /* ATTR_LENGTHIS */            { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "length_is" },
+    /* ATTR_LIBLCID */             { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "lcid" },
+    /* ATTR_LICENSED */            { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "licensed" },
+    /* ATTR_LOCAL */               { 1, 0, 0,  1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "local" },
+    /* ATTR_MAYBE */               { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "maybe" },
+    /* ATTR_MESSAGE */             { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "message" },
+    /* ATTR_NOCODE */              { 0, 1, 0,  1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "nocode" },
+    /* ATTR_NONBROWSABLE */        { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "nonbrowsable" },
+    /* ATTR_NONCREATABLE */        { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "noncreatable" },
+    /* ATTR_NONEXTENSIBLE */       { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "nonextensible" },
+    /* ATTR_NOTIFY */              { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "notify" },
+    /* ATTR_NOTIFYFLAG */          { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "notify_flag" },
+    /* ATTR_OBJECT */              { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "object" },
+    /* ATTR_ODL */                 { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "odl" },
+    /* ATTR_OLEAUTOMATION */       { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "oleautomation" },
+    /* ATTR_OPTIMIZE */            { 0, 0, 0,  1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "optimize" },
+    /* ATTR_OPTIONAL */            { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "optional" },
+    /* ATTR_OUT */                 { 1, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "out" },
+    /* ATTR_PARAMLCID */           { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "lcid" },
+    /* ATTR_PARTIALIGNORE */       { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "partial_ignore" },
+    /* ATTR_POINTERDEFAULT */      { 1, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "pointer_default" },
+    /* ATTR_POINTERTYPE */         { 1, 0, 0,  0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "ref, unique or ptr" },
+    /* ATTR_PROGID */              { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "progid" },
+    /* ATTR_PROPGET */             { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propget" },
+    /* ATTR_PROPPUT */             { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propput" },
+    /* ATTR_PROPPUTREF */          { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propputref" },
+    /* ATTR_PROXY */               { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "proxy" },
+    /* ATTR_PUBLIC */              { 0, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "public" },
+    /* ATTR_RANGE */               { 0, 0, 0,  0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, "range" },
+    /* ATTR_READONLY */            { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "readonly" },
+    /* ATTR_REPRESENTAS */         { 1, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "represent_as" },
+    /* ATTR_REQUESTEDIT */         { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "requestedit" },
+    /* ATTR_RESTRICTED */          { 0, 0, 0,  1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, "restricted" },
+    /* ATTR_RETVAL */              { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "retval" },
+    /* ATTR_SIZEIS */              { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "size_is" },
+    /* ATTR_SOURCE */              { 0, 0, 0,  1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "source" },
+    /* ATTR_STRICTCONTEXTHANDLE */ { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "strict_context_handle" },
+    /* ATTR_STRING */              { 1, 0, 0,  0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "string" },
+    /* ATTR_SWITCHIS */            { 1, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "switch_is" },
+    /* ATTR_SWITCHTYPE */          { 1, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "switch_type" },
+    /* ATTR_THREADING */           { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "threading" },
+    /* ATTR_TRANSMITAS */          { 1, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "transmit_as" },
+    /* ATTR_UIDEFAULT */           { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "uidefault" },
+    /* ATTR_USESGETLASTERROR */    { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "usesgetlasterror" },
+    /* ATTR_USERMARSHAL */         { 0, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "user_marshal" },
+    /* ATTR_UUID */                { 1, 0, 0,  1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, "uuid" },
+    /* ATTR_V1ENUM */              { 0, 0, 0,  0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "v1_enum" },
+    /* ATTR_VARARG */              { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "vararg" },
+    /* ATTR_VERSION */             { 1, 0, 0,  1, 0, 0, 1, 1, 0, 2, 0, 0, 1, 0, 0, 1, 0, "version" },
+    /* ATTR_VIPROGID */            { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "vi_progid" },
+    /* ATTR_WIREMARSHAL */         { 1, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "wire_marshal" },
 };
 
+static attr_list_t *append_attr(attr_list_t *list, attr_t *attr)
+{
+    attr_t *attr_existing;
+    if (!attr) return list;
+    if (!list)
+    {
+        list = xmalloc( sizeof(*list) );
+        list_init( list );
+    }
+    if (!allowed_attr[attr->type].multiple)
+    {
+        LIST_FOR_EACH_ENTRY(attr_existing, list, attr_t, entry)
+            if (attr_existing->type == attr->type)
+            {
+                parser_warning("duplicate attribute %s\n", get_attr_display_name(attr->type));
+                /* use the last attribute, like MIDL does */
+                list_remove(&attr_existing->entry);
+                break;
+            }
+    }
+    list_add_tail( list, &attr->entry );
+    return list;
+}
+
 const char *get_attr_display_name(enum attr_type type)
 {
     return allowed_attr[type].display_name;
@@ -7063,6 +7220,17 @@
   return attrs;
 }
 
+static attr_list_t *check_apicontract_attrs(const char *name, attr_list_t *attrs)
+{
+    const attr_t *attr;
+    if (!attrs) return attrs;
+    LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry)
+        if (!allowed_attr[attr->type].on_apicontract)
+            error_loc("inapplicable attribute %s for apicontract %s\n",
+                      allowed_attr[attr->type].display_name, name);
+    return attrs;
+}
+
 static int is_allowed_conf_type(const type_t *type)
 {
     switch (type_get_type(type))
@@ -7102,6 +7270,10 @@
     case TYPE_INTERFACE:
     case TYPE_BITFIELD:
         return FALSE;
+    case TYPE_APICONTRACT:
+        /* not supposed to be here */
+        assert(0);
+        break;
     }
     return FALSE;
 }
diff --git a/mingw-w64-tools/widl/src/parser.tab.h b/mingw-w64-tools/widl/src/parser.tab.h
index c6162ff..bff5000 100644
--- a/mingw-w64-tools/widl/src/parser.tab.h
+++ b/mingw-w64-tools/widl/src/parser.tab.h
@@ -1,4 +1,4 @@
-/* A Bison parser, made by GNU Bison 3.7.2.  */
+/* A Bison parser, made by GNU Bison 3.7.4.  */
 
 /* Bison interface for Yacc-like parsers in C
 
@@ -78,169 +78,176 @@
     LOGICALAND = 279,              /* LOGICALAND  */
     ELLIPSIS = 280,                /* ELLIPSIS  */
     tAGGREGATABLE = 281,           /* tAGGREGATABLE  */
-    tALLOCATE = 282,               /* tALLOCATE  */
-    tANNOTATION = 283,             /* tANNOTATION  */
-    tAPPOBJECT = 284,              /* tAPPOBJECT  */
-    tASYNC = 285,                  /* tASYNC  */
-    tASYNCUUID = 286,              /* tASYNCUUID  */
-    tAUTOHANDLE = 287,             /* tAUTOHANDLE  */
-    tBINDABLE = 288,               /* tBINDABLE  */
-    tBOOLEAN = 289,                /* tBOOLEAN  */
-    tBROADCAST = 290,              /* tBROADCAST  */
-    tBYTE = 291,                   /* tBYTE  */
-    tBYTECOUNT = 292,              /* tBYTECOUNT  */
-    tCALLAS = 293,                 /* tCALLAS  */
-    tCALLBACK = 294,               /* tCALLBACK  */
-    tCASE = 295,                   /* tCASE  */
-    tCDECL = 296,                  /* tCDECL  */
-    tCHAR = 297,                   /* tCHAR  */
-    tCOCLASS = 298,                /* tCOCLASS  */
-    tCODE = 299,                   /* tCODE  */
-    tCOMMSTATUS = 300,             /* tCOMMSTATUS  */
-    tCONST = 301,                  /* tCONST  */
-    tCONTEXTHANDLE = 302,          /* tCONTEXTHANDLE  */
-    tCONTEXTHANDLENOSERIALIZE = 303, /* tCONTEXTHANDLENOSERIALIZE  */
-    tCONTEXTHANDLESERIALIZE = 304, /* tCONTEXTHANDLESERIALIZE  */
-    tCONTROL = 305,                /* tCONTROL  */
-    tCPPQUOTE = 306,               /* tCPPQUOTE  */
-    tDECODE = 307,                 /* tDECODE  */
-    tDEFAULT = 308,                /* tDEFAULT  */
-    tDEFAULTBIND = 309,            /* tDEFAULTBIND  */
-    tDEFAULTCOLLELEM = 310,        /* tDEFAULTCOLLELEM  */
-    tDEFAULTVALUE = 311,           /* tDEFAULTVALUE  */
-    tDEFAULTVTABLE = 312,          /* tDEFAULTVTABLE  */
-    tDISABLECONSISTENCYCHECK = 313, /* tDISABLECONSISTENCYCHECK  */
-    tDISPLAYBIND = 314,            /* tDISPLAYBIND  */
-    tDISPINTERFACE = 315,          /* tDISPINTERFACE  */
-    tDLLNAME = 316,                /* tDLLNAME  */
-    tDOUBLE = 317,                 /* tDOUBLE  */
-    tDUAL = 318,                   /* tDUAL  */
-    tENABLEALLOCATE = 319,         /* tENABLEALLOCATE  */
-    tENCODE = 320,                 /* tENCODE  */
-    tENDPOINT = 321,               /* tENDPOINT  */
-    tENTRY = 322,                  /* tENTRY  */
-    tENUM = 323,                   /* tENUM  */
-    tERRORSTATUST = 324,           /* tERRORSTATUST  */
-    tEXPLICITHANDLE = 325,         /* tEXPLICITHANDLE  */
-    tEXTERN = 326,                 /* tEXTERN  */
-    tFALSE = 327,                  /* tFALSE  */
-    tFASTCALL = 328,               /* tFASTCALL  */
-    tFAULTSTATUS = 329,            /* tFAULTSTATUS  */
-    tFLOAT = 330,                  /* tFLOAT  */
-    tFORCEALLOCATE = 331,          /* tFORCEALLOCATE  */
-    tHANDLE = 332,                 /* tHANDLE  */
-    tHANDLET = 333,                /* tHANDLET  */
-    tHELPCONTEXT = 334,            /* tHELPCONTEXT  */
-    tHELPFILE = 335,               /* tHELPFILE  */
-    tHELPSTRING = 336,             /* tHELPSTRING  */
-    tHELPSTRINGCONTEXT = 337,      /* tHELPSTRINGCONTEXT  */
-    tHELPSTRINGDLL = 338,          /* tHELPSTRINGDLL  */
-    tHIDDEN = 339,                 /* tHIDDEN  */
-    tHYPER = 340,                  /* tHYPER  */
-    tID = 341,                     /* tID  */
-    tIDEMPOTENT = 342,             /* tIDEMPOTENT  */
-    tIGNORE = 343,                 /* tIGNORE  */
-    tIIDIS = 344,                  /* tIIDIS  */
-    tIMMEDIATEBIND = 345,          /* tIMMEDIATEBIND  */
-    tIMPLICITHANDLE = 346,         /* tIMPLICITHANDLE  */
-    tIMPORT = 347,                 /* tIMPORT  */
-    tIMPORTLIB = 348,              /* tIMPORTLIB  */
-    tIN = 349,                     /* tIN  */
-    tIN_LINE = 350,                /* tIN_LINE  */
-    tINLINE = 351,                 /* tINLINE  */
-    tINPUTSYNC = 352,              /* tINPUTSYNC  */
-    tINT = 353,                    /* tINT  */
-    tINT32 = 354,                  /* tINT32  */
-    tINT3264 = 355,                /* tINT3264  */
-    tINT64 = 356,                  /* tINT64  */
-    tINTERFACE = 357,              /* tINTERFACE  */
-    tLCID = 358,                   /* tLCID  */
-    tLENGTHIS = 359,               /* tLENGTHIS  */
-    tLIBRARY = 360,                /* tLIBRARY  */
-    tLICENSED = 361,               /* tLICENSED  */
-    tLOCAL = 362,                  /* tLOCAL  */
-    tLONG = 363,                   /* tLONG  */
-    tMAYBE = 364,                  /* tMAYBE  */
-    tMESSAGE = 365,                /* tMESSAGE  */
-    tMETHODS = 366,                /* tMETHODS  */
-    tMODULE = 367,                 /* tMODULE  */
-    tNAMESPACE = 368,              /* tNAMESPACE  */
-    tNOCODE = 369,                 /* tNOCODE  */
-    tNONBROWSABLE = 370,           /* tNONBROWSABLE  */
-    tNONCREATABLE = 371,           /* tNONCREATABLE  */
-    tNONEXTENSIBLE = 372,          /* tNONEXTENSIBLE  */
-    tNOTIFY = 373,                 /* tNOTIFY  */
-    tNOTIFYFLAG = 374,             /* tNOTIFYFLAG  */
-    tNULL = 375,                   /* tNULL  */
-    tOBJECT = 376,                 /* tOBJECT  */
-    tODL = 377,                    /* tODL  */
-    tOLEAUTOMATION = 378,          /* tOLEAUTOMATION  */
-    tOPTIMIZE = 379,               /* tOPTIMIZE  */
-    tOPTIONAL = 380,               /* tOPTIONAL  */
-    tOUT = 381,                    /* tOUT  */
-    tPARTIALIGNORE = 382,          /* tPARTIALIGNORE  */
-    tPASCAL = 383,                 /* tPASCAL  */
-    tPOINTERDEFAULT = 384,         /* tPOINTERDEFAULT  */
-    tPRAGMA_WARNING = 385,         /* tPRAGMA_WARNING  */
-    tPROGID = 386,                 /* tPROGID  */
-    tPROPERTIES = 387,             /* tPROPERTIES  */
-    tPROPGET = 388,                /* tPROPGET  */
-    tPROPPUT = 389,                /* tPROPPUT  */
-    tPROPPUTREF = 390,             /* tPROPPUTREF  */
-    tPROXY = 391,                  /* tPROXY  */
-    tPTR = 392,                    /* tPTR  */
-    tPUBLIC = 393,                 /* tPUBLIC  */
-    tRANGE = 394,                  /* tRANGE  */
-    tREADONLY = 395,               /* tREADONLY  */
-    tREF = 396,                    /* tREF  */
-    tREGISTER = 397,               /* tREGISTER  */
-    tREPRESENTAS = 398,            /* tREPRESENTAS  */
-    tREQUESTEDIT = 399,            /* tREQUESTEDIT  */
-    tRESTRICTED = 400,             /* tRESTRICTED  */
-    tRETVAL = 401,                 /* tRETVAL  */
-    tSAFEARRAY = 402,              /* tSAFEARRAY  */
-    tSHORT = 403,                  /* tSHORT  */
-    tSIGNED = 404,                 /* tSIGNED  */
-    tSIZEIS = 405,                 /* tSIZEIS  */
-    tSIZEOF = 406,                 /* tSIZEOF  */
-    tSMALL = 407,                  /* tSMALL  */
-    tSOURCE = 408,                 /* tSOURCE  */
-    tSTATIC = 409,                 /* tSTATIC  */
-    tSTDCALL = 410,                /* tSTDCALL  */
-    tSTRICTCONTEXTHANDLE = 411,    /* tSTRICTCONTEXTHANDLE  */
-    tSTRING = 412,                 /* tSTRING  */
-    tSTRUCT = 413,                 /* tSTRUCT  */
-    tSWITCH = 414,                 /* tSWITCH  */
-    tSWITCHIS = 415,               /* tSWITCHIS  */
-    tSWITCHTYPE = 416,             /* tSWITCHTYPE  */
-    tTHREADING = 417,              /* tTHREADING  */
-    tTRANSMITAS = 418,             /* tTRANSMITAS  */
-    tTRUE = 419,                   /* tTRUE  */
-    tTYPEDEF = 420,                /* tTYPEDEF  */
-    tUIDEFAULT = 421,              /* tUIDEFAULT  */
-    tUNION = 422,                  /* tUNION  */
-    tUNIQUE = 423,                 /* tUNIQUE  */
-    tUNSIGNED = 424,               /* tUNSIGNED  */
-    tUSESGETLASTERROR = 425,       /* tUSESGETLASTERROR  */
-    tUSERMARSHAL = 426,            /* tUSERMARSHAL  */
-    tUUID = 427,                   /* tUUID  */
-    tV1ENUM = 428,                 /* tV1ENUM  */
-    tVARARG = 429,                 /* tVARARG  */
-    tVERSION = 430,                /* tVERSION  */
-    tVIPROGID = 431,               /* tVIPROGID  */
-    tVOID = 432,                   /* tVOID  */
-    tWCHAR = 433,                  /* tWCHAR  */
-    tWIREMARSHAL = 434,            /* tWIREMARSHAL  */
-    tAPARTMENT = 435,              /* tAPARTMENT  */
-    tNEUTRAL = 436,                /* tNEUTRAL  */
-    tSINGLE = 437,                 /* tSINGLE  */
-    tFREE = 438,                   /* tFREE  */
-    tBOTH = 439,                   /* tBOTH  */
-    CAST = 440,                    /* CAST  */
-    PPTR = 441,                    /* PPTR  */
-    POS = 442,                     /* POS  */
-    NEG = 443,                     /* NEG  */
-    ADDRESSOF = 444                /* ADDRESSOF  */
+    tALLNODES = 282,               /* tALLNODES  */
+    tALLOCATE = 283,               /* tALLOCATE  */
+    tANNOTATION = 284,             /* tANNOTATION  */
+    tAPICONTRACT = 285,            /* tAPICONTRACT  */
+    tAPPOBJECT = 286,              /* tAPPOBJECT  */
+    tASYNC = 287,                  /* tASYNC  */
+    tASYNCUUID = 288,              /* tASYNCUUID  */
+    tAUTOHANDLE = 289,             /* tAUTOHANDLE  */
+    tBINDABLE = 290,               /* tBINDABLE  */
+    tBOOLEAN = 291,                /* tBOOLEAN  */
+    tBROADCAST = 292,              /* tBROADCAST  */
+    tBYTE = 293,                   /* tBYTE  */
+    tBYTECOUNT = 294,              /* tBYTECOUNT  */
+    tCALLAS = 295,                 /* tCALLAS  */
+    tCALLBACK = 296,               /* tCALLBACK  */
+    tCASE = 297,                   /* tCASE  */
+    tCDECL = 298,                  /* tCDECL  */
+    tCHAR = 299,                   /* tCHAR  */
+    tCOCLASS = 300,                /* tCOCLASS  */
+    tCODE = 301,                   /* tCODE  */
+    tCOMMSTATUS = 302,             /* tCOMMSTATUS  */
+    tCONST = 303,                  /* tCONST  */
+    tCONTEXTHANDLE = 304,          /* tCONTEXTHANDLE  */
+    tCONTEXTHANDLENOSERIALIZE = 305, /* tCONTEXTHANDLENOSERIALIZE  */
+    tCONTEXTHANDLESERIALIZE = 306, /* tCONTEXTHANDLESERIALIZE  */
+    tCONTRACT = 307,               /* tCONTRACT  */
+    tCONTRACTVERSION = 308,        /* tCONTRACTVERSION  */
+    tCONTROL = 309,                /* tCONTROL  */
+    tCPPQUOTE = 310,               /* tCPPQUOTE  */
+    tCUSTOM = 311,                 /* tCUSTOM  */
+    tDECODE = 312,                 /* tDECODE  */
+    tDEFAULT = 313,                /* tDEFAULT  */
+    tDEFAULTBIND = 314,            /* tDEFAULTBIND  */
+    tDEFAULTCOLLELEM = 315,        /* tDEFAULTCOLLELEM  */
+    tDEFAULTVALUE = 316,           /* tDEFAULTVALUE  */
+    tDEFAULTVTABLE = 317,          /* tDEFAULTVTABLE  */
+    tDISABLECONSISTENCYCHECK = 318, /* tDISABLECONSISTENCYCHECK  */
+    tDISPLAYBIND = 319,            /* tDISPLAYBIND  */
+    tDISPINTERFACE = 320,          /* tDISPINTERFACE  */
+    tDLLNAME = 321,                /* tDLLNAME  */
+    tDONTFREE = 322,               /* tDONTFREE  */
+    tDOUBLE = 323,                 /* tDOUBLE  */
+    tDUAL = 324,                   /* tDUAL  */
+    tENABLEALLOCATE = 325,         /* tENABLEALLOCATE  */
+    tENCODE = 326,                 /* tENCODE  */
+    tENDPOINT = 327,               /* tENDPOINT  */
+    tENTRY = 328,                  /* tENTRY  */
+    tENUM = 329,                   /* tENUM  */
+    tERRORSTATUST = 330,           /* tERRORSTATUST  */
+    tEXPLICITHANDLE = 331,         /* tEXPLICITHANDLE  */
+    tEXTERN = 332,                 /* tEXTERN  */
+    tFALSE = 333,                  /* tFALSE  */
+    tFASTCALL = 334,               /* tFASTCALL  */
+    tFAULTSTATUS = 335,            /* tFAULTSTATUS  */
+    tFLOAT = 336,                  /* tFLOAT  */
+    tFORCEALLOCATE = 337,          /* tFORCEALLOCATE  */
+    tHANDLE = 338,                 /* tHANDLE  */
+    tHANDLET = 339,                /* tHANDLET  */
+    tHELPCONTEXT = 340,            /* tHELPCONTEXT  */
+    tHELPFILE = 341,               /* tHELPFILE  */
+    tHELPSTRING = 342,             /* tHELPSTRING  */
+    tHELPSTRINGCONTEXT = 343,      /* tHELPSTRINGCONTEXT  */
+    tHELPSTRINGDLL = 344,          /* tHELPSTRINGDLL  */
+    tHIDDEN = 345,                 /* tHIDDEN  */
+    tHYPER = 346,                  /* tHYPER  */
+    tID = 347,                     /* tID  */
+    tIDEMPOTENT = 348,             /* tIDEMPOTENT  */
+    tIGNORE = 349,                 /* tIGNORE  */
+    tIIDIS = 350,                  /* tIIDIS  */
+    tIMMEDIATEBIND = 351,          /* tIMMEDIATEBIND  */
+    tIMPLICITHANDLE = 352,         /* tIMPLICITHANDLE  */
+    tIMPORT = 353,                 /* tIMPORT  */
+    tIMPORTLIB = 354,              /* tIMPORTLIB  */
+    tIN = 355,                     /* tIN  */
+    tIN_LINE = 356,                /* tIN_LINE  */
+    tINLINE = 357,                 /* tINLINE  */
+    tINPUTSYNC = 358,              /* tINPUTSYNC  */
+    tINT = 359,                    /* tINT  */
+    tINT32 = 360,                  /* tINT32  */
+    tINT3264 = 361,                /* tINT3264  */
+    tINT64 = 362,                  /* tINT64  */
+    tINTERFACE = 363,              /* tINTERFACE  */
+    tLCID = 364,                   /* tLCID  */
+    tLENGTHIS = 365,               /* tLENGTHIS  */
+    tLIBRARY = 366,                /* tLIBRARY  */
+    tLICENSED = 367,               /* tLICENSED  */
+    tLOCAL = 368,                  /* tLOCAL  */
+    tLONG = 369,                   /* tLONG  */
+    tMAYBE = 370,                  /* tMAYBE  */
+    tMESSAGE = 371,                /* tMESSAGE  */
+    tMETHODS = 372,                /* tMETHODS  */
+    tMODULE = 373,                 /* tMODULE  */
+    tNAMESPACE = 374,              /* tNAMESPACE  */
+    tNOCODE = 375,                 /* tNOCODE  */
+    tNONBROWSABLE = 376,           /* tNONBROWSABLE  */
+    tNONCREATABLE = 377,           /* tNONCREATABLE  */
+    tNONEXTENSIBLE = 378,          /* tNONEXTENSIBLE  */
+    tNOTIFY = 379,                 /* tNOTIFY  */
+    tNOTIFYFLAG = 380,             /* tNOTIFYFLAG  */
+    tNULL = 381,                   /* tNULL  */
+    tOBJECT = 382,                 /* tOBJECT  */
+    tODL = 383,                    /* tODL  */
+    tOLEAUTOMATION = 384,          /* tOLEAUTOMATION  */
+    tOPTIMIZE = 385,               /* tOPTIMIZE  */
+    tOPTIONAL = 386,               /* tOPTIONAL  */
+    tOUT = 387,                    /* tOUT  */
+    tPARTIALIGNORE = 388,          /* tPARTIALIGNORE  */
+    tPASCAL = 389,                 /* tPASCAL  */
+    tPOINTERDEFAULT = 390,         /* tPOINTERDEFAULT  */
+    tPRAGMA_WARNING = 391,         /* tPRAGMA_WARNING  */
+    tPROGID = 392,                 /* tPROGID  */
+    tPROPERTIES = 393,             /* tPROPERTIES  */
+    tPROPGET = 394,                /* tPROPGET  */
+    tPROPPUT = 395,                /* tPROPPUT  */
+    tPROPPUTREF = 396,             /* tPROPPUTREF  */
+    tPROXY = 397,                  /* tPROXY  */
+    tPTR = 398,                    /* tPTR  */
+    tPUBLIC = 399,                 /* tPUBLIC  */
+    tRANGE = 400,                  /* tRANGE  */
+    tREADONLY = 401,               /* tREADONLY  */
+    tREF = 402,                    /* tREF  */
+    tREGISTER = 403,               /* tREGISTER  */
+    tREPRESENTAS = 404,            /* tREPRESENTAS  */
+    tREQUESTEDIT = 405,            /* tREQUESTEDIT  */
+    tRESTRICTED = 406,             /* tRESTRICTED  */
+    tRETVAL = 407,                 /* tRETVAL  */
+    tSAFEARRAY = 408,              /* tSAFEARRAY  */
+    tSHORT = 409,                  /* tSHORT  */
+    tSIGNED = 410,                 /* tSIGNED  */
+    tSINGLENODE = 411,             /* tSINGLENODE  */
+    tSIZEIS = 412,                 /* tSIZEIS  */
+    tSIZEOF = 413,                 /* tSIZEOF  */
+    tSMALL = 414,                  /* tSMALL  */
+    tSOURCE = 415,                 /* tSOURCE  */
+    tSTATIC = 416,                 /* tSTATIC  */
+    tSTDCALL = 417,                /* tSTDCALL  */
+    tSTRICTCONTEXTHANDLE = 418,    /* tSTRICTCONTEXTHANDLE  */
+    tSTRING = 419,                 /* tSTRING  */
+    tSTRUCT = 420,                 /* tSTRUCT  */
+    tSWITCH = 421,                 /* tSWITCH  */
+    tSWITCHIS = 422,               /* tSWITCHIS  */
+    tSWITCHTYPE = 423,             /* tSWITCHTYPE  */
+    tTHREADING = 424,              /* tTHREADING  */
+    tTRANSMITAS = 425,             /* tTRANSMITAS  */
+    tTRUE = 426,                   /* tTRUE  */
+    tTYPEDEF = 427,                /* tTYPEDEF  */
+    tUIDEFAULT = 428,              /* tUIDEFAULT  */
+    tUNION = 429,                  /* tUNION  */
+    tUNIQUE = 430,                 /* tUNIQUE  */
+    tUNSIGNED = 431,               /* tUNSIGNED  */
+    tUSESGETLASTERROR = 432,       /* tUSESGETLASTERROR  */
+    tUSERMARSHAL = 433,            /* tUSERMARSHAL  */
+    tUUID = 434,                   /* tUUID  */
+    tV1ENUM = 435,                 /* tV1ENUM  */
+    tVARARG = 436,                 /* tVARARG  */
+    tVERSION = 437,                /* tVERSION  */
+    tVIPROGID = 438,               /* tVIPROGID  */
+    tVOID = 439,                   /* tVOID  */
+    tWCHAR = 440,                  /* tWCHAR  */
+    tWIREMARSHAL = 441,            /* tWIREMARSHAL  */
+    tAPARTMENT = 442,              /* tAPARTMENT  */
+    tNEUTRAL = 443,                /* tNEUTRAL  */
+    tSINGLE = 444,                 /* tSINGLE  */
+    tFREE = 445,                   /* tFREE  */
+    tBOTH = 446,                   /* tBOTH  */
+    CAST = 447,                    /* CAST  */
+    PPTR = 448,                    /* PPTR  */
+    POS = 449,                     /* POS  */
+    NEG = 450,                     /* NEG  */
+    ADDRESSOF = 451                /* ADDRESSOF  */
   };
   typedef enum yytokentype yytoken_kind_t;
 #endif
@@ -249,7 +256,7 @@
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 133 "tools/widl/parser.y"
+#line 135 "tools/widl/parser.y"
 
 	attr_t *attr;
 	attr_list_t *attr_list;
@@ -278,7 +285,7 @@
 	enum type_qualifier type_qualifier;
 	enum function_specifier function_specifier;
 
-#line 282 "tools/widl/parser.tab.h"
+#line 289 "tools/widl/parser.tab.h"
 
 };
 typedef union YYSTYPE YYSTYPE;
diff --git a/mingw-w64-tools/widl/src/parser.y b/mingw-w64-tools/widl/src/parser.y
index 5bc0d82..1d413ca 100644
--- a/mingw-w64-tools/widl/src/parser.y
+++ b/mingw-w64-tools/widl/src/parser.y
@@ -58,6 +58,7 @@
 static attr_t *make_attr(enum attr_type type);
 static attr_t *make_attrv(enum attr_type type, unsigned int val);
 static attr_t *make_attrp(enum attr_type type, void *val);
+static attr_t *make_custom_attr(UUID *id, expr_t *pval);
 static expr_list_t *append_expr(expr_list_t *list, expr_t *expr);
 static var_t *declare_var(attr_list_t *attrs, decl_spec_t *decl_spec, declarator_t *decl, int top);
 static var_list_t *set_var_types(attr_list_t *attrs, decl_spec_t *decl_spec, declarator_list_t *decls);
@@ -99,6 +100,7 @@
 static attr_list_t *check_dispiface_attrs(const char *name, attr_list_t *attrs);
 static attr_list_t *check_module_attrs(const char *name, attr_list_t *attrs);
 static attr_list_t *check_coclass_attrs(const char *name, attr_list_t *attrs);
+static attr_list_t *check_apicontract_attrs(const char *name, attr_list_t *attrs);
 const char *get_attr_display_name(enum attr_type type);
 static void add_explicit_handle_if_necessary(const type_t *iface, var_t *func);
 static void check_def(const type_t *t);
@@ -172,18 +174,24 @@
 %token GREATEREQUAL LESSEQUAL
 %token LOGICALOR LOGICALAND
 %token ELLIPSIS
-%token tAGGREGATABLE tALLOCATE tANNOTATION tAPPOBJECT tASYNC tASYNCUUID
+%token tAGGREGATABLE tALLNODES tALLOCATE tANNOTATION
+%token tAPICONTRACT
+%token tAPPOBJECT tASYNC tASYNCUUID
 %token tAUTOHANDLE tBINDABLE tBOOLEAN tBROADCAST tBYTE tBYTECOUNT
 %token tCALLAS tCALLBACK tCASE tCDECL tCHAR tCOCLASS tCODE tCOMMSTATUS
 %token tCONST tCONTEXTHANDLE tCONTEXTHANDLENOSERIALIZE
-%token tCONTEXTHANDLESERIALIZE tCONTROL tCPPQUOTE
+%token tCONTEXTHANDLESERIALIZE
+%token tCONTRACT
+%token tCONTRACTVERSION
+%token tCONTROL tCPPQUOTE
+%token tCUSTOM
 %token tDECODE tDEFAULT tDEFAULTBIND
 %token tDEFAULTCOLLELEM
 %token tDEFAULTVALUE
 %token tDEFAULTVTABLE
 %token tDISABLECONSISTENCYCHECK tDISPLAYBIND
 %token tDISPINTERFACE
-%token tDLLNAME tDOUBLE tDUAL
+%token tDLLNAME tDONTFREE tDOUBLE tDUAL
 %token tENABLEALLOCATE tENCODE tENDPOINT
 %token tENTRY tENUM tERRORSTATUST
 %token tEXPLICITHANDLE tEXTERN
@@ -235,7 +243,7 @@
 %token tRETVAL
 %token tSAFEARRAY
 %token tSHORT
-%token tSIGNED
+%token tSIGNED tSINGLENODE
 %token tSIZEIS tSIZEOF
 %token tSMALL
 %token tSOURCE
@@ -264,6 +272,7 @@
 %type <str_list> str_list
 %type <expr> m_expr expr expr_const expr_int_const array m_bitfield
 %type <expr_list> m_exprs /* exprs expr_list */ expr_list_int_const
+%type <expr> contract_req
 %type <type> interfacehdr
 %type <stgclass> storage_cls_spec
 %type <type_qualifier> type_qualifier m_type_qual_list
@@ -288,6 +297,8 @@
 %type <declarator> m_abstract_declarator abstract_declarator abstract_declarator_no_direct abstract_direct_declarator
 %type <declarator_list> declarator_list struct_declarator_list
 %type <type> coclass coclasshdr coclassdef
+%type <type> apicontract
+%type <num> contract_ver
 %type <num> pointer_type threading_type version
 %type <str> libraryhdr callconv cppquote importlib import t_ident
 %type <uuid> uuid_string
@@ -296,6 +307,7 @@
 %type <statement> statement typedef pragma_warning
 %type <stmt_list> gbl_statements imp_statements int_statements
 %type <warning_list> warnings
+%type <num> allocate_option_list allocate_option
 
 %left ','
 %right '?' ':'
@@ -343,6 +355,8 @@
 	| gbl_statements coclassdef		{ $$ = append_statement($1, make_statement_type_decl($2));
 						  reg_type($2, $2->name, current_namespace, 0);
 						}
+	| gbl_statements apicontract ';'        { $$ = append_statement($1, make_statement_type_decl($2));
+	                                          reg_type($2, $2->name, current_namespace, 0); }
 	| gbl_statements moduledef		{ $$ = append_statement($1, make_statement_module($2)); }
 	| gbl_statements librarydef		{ $$ = append_statement($1, make_statement_library($2)); }
 	| gbl_statements statement		{ $$ = append_statement($1, $2); }
@@ -357,6 +371,8 @@
 	| imp_statements coclassdef		{ $$ = append_statement($1, make_statement_type_decl($2));
 						  reg_type($2, $2->name, current_namespace, 0);
 						}
+	| imp_statements apicontract ';'        { $$ = append_statement($1, make_statement_type_decl($2));
+	                                          reg_type($2, $2->name, current_namespace, 0); }
 	| imp_statements moduledef		{ $$ = append_statement($1, make_statement_module($2)); }
 	| imp_statements statement		{ $$ = append_statement($1, $2); }
 	| imp_statements importlib		{ $$ = append_statement($1, make_statement_importlib($2)); }
@@ -489,6 +505,17 @@
 	| str_list ',' aSTRING                  { $$ = append_str( $1, $3 ); }
 	;
 
+contract_ver:
+	  aNUM					{ $$ = MAKEVERSION(0, $1); }
+	| aNUM '.' aNUM				{ $$ = MAKEVERSION($3, $1); }
+	;
+
+contract_req: decl_spec ',' contract_ver	{ if ($1->type->type_type != TYPE_APICONTRACT)
+						      error_loc("type %s is not an apicontract\n", $1->type->name);
+						  $$ = make_exprl(EXPR_NUM, $3);
+						  $$ = make_exprt(EXPR_GTREQL, declare_var(NULL, $1, make_declarator(NULL), 0), $$);
+						}
+
 attribute:					{ $$ = NULL; }
 	| tAGGREGATABLE				{ $$ = make_attr(ATTR_AGGREGATABLE); }
 	| tANNOTATION '(' aSTRING ')'		{ $$ = make_attrp(ATTR_ANNOTATION, $3); }
@@ -504,7 +531,10 @@
 	| tCONTEXTHANDLE			{ $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); }
 	| tCONTEXTHANDLENOSERIALIZE		{ $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_DONT_SERIALIZE */ }
 	| tCONTEXTHANDLESERIALIZE		{ $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_SERIALIZE */ }
+	| tCONTRACT '(' contract_req ')'	{ $$ = make_attrp(ATTR_CONTRACT, $3); }
+	| tCONTRACTVERSION '(' contract_ver ')'	{ $$ = make_attrv(ATTR_CONTRACTVERSION, $3); }
 	| tCONTROL				{ $$ = make_attr(ATTR_CONTROL); }
+	| tCUSTOM '(' uuid_string ',' expr_const ')' { $$ = make_custom_attr($3, $5); }
 	| tDECODE				{ $$ = make_attr(ATTR_DECODE); }
 	| tDEFAULT				{ $$ = make_attr(ATTR_DEFAULT); }
 	| tDEFAULTBIND				{ $$ = make_attr(ATTR_DEFAULTBIND); }
@@ -855,6 +885,13 @@
 						{ $$ = type_coclass_define($1, $3); }
 	;
 
+apicontract: attributes tAPICONTRACT aIDENTIFIER '{' '}'
+						{ $$ = get_type(TYPE_APICONTRACT, $3, current_namespace, 0);
+						  check_def($$);
+						  $$->attrs = check_apicontract_attrs($$->name, $1);
+						}
+	;
+
 namespacedef: tNAMESPACE aIDENTIFIER		{ $$ = $2; }
 	| tNAMESPACE aNAMESPACE                 { $$ = $2; }
 	;
@@ -1150,16 +1187,20 @@
 acf_statements
         : /* empty */
         | acf_interface acf_statements
+	;
 
 acf_int_statements
         : /* empty */
         | acf_int_statement acf_int_statements
+	;
 
 acf_int_statement
         : tTYPEDEF acf_attributes aKNOWNTYPE ';'
                                                 { type_t *type = find_type_or_error($3, 0);
                                                   type->attrs = append_attr_list(type->attrs, $2);
                                                 }
+	;
+
 acf_interface
         : acf_attributes tINTERFACE aKNOWNTYPE '{' acf_int_statements '}'
                                                 {  type_t *iface = find_type_or_error2($3, 0);
@@ -1167,19 +1208,38 @@
                                                        error_loc("%s is not an interface\n", iface->name);
                                                    iface->attrs = append_attr_list(iface->attrs, $1);
                                                 }
+	;
 
 acf_attributes
         : /* empty */                           { $$ = NULL; };
         | '[' acf_attribute_list ']'            { $$ = $2; };
+	;
 
 acf_attribute_list
         : acf_attribute                         { $$ = append_attr(NULL, $1); }
         | acf_attribute_list ',' acf_attribute  { $$ = append_attr($1, $3); }
+	;
 
 acf_attribute
-        : tENCODE                               { $$ = make_attr(ATTR_ENCODE); }
+	: tALLOCATE '(' allocate_option_list ')'
+						{ $$ = make_attrv(ATTR_ALLOCATE, $3); }
+        | tENCODE                               { $$ = make_attr(ATTR_ENCODE); }
         | tDECODE                               { $$ = make_attr(ATTR_DECODE); }
         | tEXPLICITHANDLE                       { $$ = make_attr(ATTR_EXPLICIT_HANDLE); }
+	;
+
+allocate_option_list
+	: allocate_option			{ $$ = $1; }
+	| allocate_option_list ',' allocate_option
+						{ $$ = $1 | $3; }
+	;
+
+allocate_option
+	: tDONTFREE				{ $$ = FC_DONT_FREE; }
+	| tFREE					{ $$ = 0; }
+	| tALLNODES				{ $$ = FC_ALLOCATE_ALL_NODES; }
+	| tSINGLENODE				{ $$ = 0; }
+	;
 
 %%
 
@@ -1222,27 +1282,6 @@
     return list;
 }
 
-static attr_list_t *append_attr(attr_list_t *list, attr_t *attr)
-{
-    attr_t *attr_existing;
-    if (!attr) return list;
-    if (!list)
-    {
-        list = xmalloc( sizeof(*list) );
-        list_init( list );
-    }
-    LIST_FOR_EACH_ENTRY(attr_existing, list, attr_t, entry)
-        if (attr_existing->type == attr->type)
-        {
-            parser_warning("duplicate attribute %s\n", get_attr_display_name(attr->type));
-            /* use the last attribute, like MIDL does */
-            list_remove(&attr_existing->entry);
-            break;
-        }
-    list_add_tail( list, &attr->entry );
-    return list;
-}
-
 static attr_list_t *move_attr(attr_list_t *dst, attr_list_t *src, enum attr_type type)
 {
   attr_t *attr;
@@ -1363,6 +1402,17 @@
   return a;
 }
 
+static attr_t *make_custom_attr(UUID *id, expr_t *pval)
+{
+  attr_t *a = xmalloc(sizeof(attr_t));
+  attr_custdata_t *cstdata = xmalloc(sizeof(attr_custdata_t));
+  a->type = ATTR_CUSTOM;
+  cstdata->id = *id;
+  cstdata->pval = pval;
+  a->u.pval = cstdata;
+  return a;
+}
+
 static expr_list_t *append_expr(expr_list_t *list, expr_t *expr)
 {
     if (!expr) return list;
@@ -1905,7 +1955,7 @@
   if (is_global_namespace(namespace))
     type->c_name = name;
   else
-    type->c_name = format_namespace(namespace, "__x_", "_C", name);
+    type->c_name = format_namespace(namespace, "__x_", "_C", name, use_abi_namespace ? "ABI" : NULL);
   nt->type = type;
   nt->t = t;
   nt->next = namespace->type_hash[hash];
@@ -2102,6 +2152,8 @@
 {
     unsigned int dce_compatible : 1;
     unsigned int acf : 1;
+    unsigned int multiple : 1;
+
     unsigned int on_interface : 1;
     unsigned int on_function : 1;
     unsigned int on_arg : 1;
@@ -2115,113 +2167,142 @@
     unsigned int on_dispinterface : 1;
     unsigned int on_module : 1;
     unsigned int on_coclass : 1;
+    unsigned int on_apicontract : 1;
     const char *display_name;
 };
 
 struct allowed_attr allowed_attr[] =
 {
-    /* attr                        { D ACF I Fn ARG T En Enm St Un Fi L  DI M  C  <display name> } */
-    /* ATTR_AGGREGATABLE */        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "aggregatable" },
-    /* ATTR_ANNOTATION */          { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "annotation" },
-    /* ATTR_APPOBJECT */           { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "appobject" },
-    /* ATTR_ASYNC */               { 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "async" },
-    /* ATTR_ASYNCUUID */           { 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, "async_uuid" },
-    /* ATTR_AUTO_HANDLE */         { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "auto_handle" },
-    /* ATTR_BINDABLE */            { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "bindable" },
-    /* ATTR_BROADCAST */           { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "broadcast" },
-    /* ATTR_CALLAS */              { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "call_as" },
-    /* ATTR_CALLCONV */            { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL },
-    /* ATTR_CASE */                { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "case" },
-    /* ATTR_CODE */                { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "code" },
-    /* ATTR_COMMSTATUS */          { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "comm_status" },
-    /* ATTR_CONTEXTHANDLE */       { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "context_handle" },
-    /* ATTR_CONTROL */             { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, "control" },
-    /* ATTR_DECODE */              { 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "decode" },
-    /* ATTR_DEFAULT */             { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, "default" },
-    /* ATTR_DEFAULTBIND */         { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "defaultbind" },
-    /* ATTR_DEFAULTCOLLELEM */     { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "defaultcollelem" },
-    /* ATTR_DEFAULTVALUE */        { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "defaultvalue" },
-    /* ATTR_DEFAULTVTABLE */       { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "defaultvtable" },
- /* ATTR_DISABLECONSISTENCYCHECK */{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "disable_consistency_check" },
-    /* ATTR_DISPINTERFACE */       { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL },
-    /* ATTR_DISPLAYBIND */         { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "displaybind" },
-    /* ATTR_DLLNAME */             { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "dllname" },
-    /* ATTR_DUAL */                { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "dual" },
-    /* ATTR_ENABLEALLOCATE */      { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "enable_allocate" },
-    /* ATTR_ENCODE */              { 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "encode" },
-    /* ATTR_ENDPOINT */            { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "endpoint" },
-    /* ATTR_ENTRY */               { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "entry" },
-    /* ATTR_EXPLICIT_HANDLE */     { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "explicit_handle" },
-    /* ATTR_FAULTSTATUS */         { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "fault_status" },
-    /* ATTR_FORCEALLOCATE */       { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "force_allocate" },
-    /* ATTR_HANDLE */              { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "handle" },
-    /* ATTR_HELPCONTEXT */         { 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, "helpcontext" },
-    /* ATTR_HELPFILE */            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "helpfile" },
-    /* ATTR_HELPSTRING */          { 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, "helpstring" },
-    /* ATTR_HELPSTRINGCONTEXT */   { 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, "helpstringcontext" },
-    /* ATTR_HELPSTRINGDLL */       { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "helpstringdll" },
-    /* ATTR_HIDDEN */              { 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, "hidden" },
-    /* ATTR_ID */                  { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, "id" },
-    /* ATTR_IDEMPOTENT */          { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "idempotent" },
-    /* ATTR_IGNORE */              { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "ignore" },
-    /* ATTR_IIDIS */               { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "iid_is" },
-    /* ATTR_IMMEDIATEBIND */       { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "immediatebind" },
-    /* ATTR_IMPLICIT_HANDLE */     { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "implicit_handle" },
-    /* ATTR_IN */                  { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "in" },
-    /* ATTR_INPUTSYNC */           { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inputsync" },
-    /* ATTR_LENGTHIS */            { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "length_is" },
-    /* ATTR_LIBLCID */             { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "lcid" },
-    /* ATTR_LICENSED */            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "licensed" },
-    /* ATTR_LOCAL */               { 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "local" },
-    /* ATTR_MAYBE */               { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "maybe" },
-    /* ATTR_MESSAGE */             { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "message" },
-    /* ATTR_NOCODE */              { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "nocode" },
-    /* ATTR_NONBROWSABLE */        { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "nonbrowsable" },
-    /* ATTR_NONCREATABLE */        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "noncreatable" },
-    /* ATTR_NONEXTENSIBLE */       { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "nonextensible" },
-    /* ATTR_NOTIFY */              { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "notify" },
-    /* ATTR_NOTIFYFLAG */          { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "notify_flag" },
-    /* ATTR_OBJECT */              { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "object" },
-    /* ATTR_ODL */                 { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, "odl" },
-    /* ATTR_OLEAUTOMATION */       { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "oleautomation" },
-    /* ATTR_OPTIMIZE */            { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "optimize" },
-    /* ATTR_OPTIONAL */            { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "optional" },
-    /* ATTR_OUT */                 { 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "out" },
-    /* ATTR_PARAMLCID */           { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "lcid" },
-    /* ATTR_PARTIALIGNORE */       { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "partial_ignore" },
-    /* ATTR_POINTERDEFAULT */      { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "pointer_default" },
-    /* ATTR_POINTERTYPE */         { 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, "ref, unique or ptr" },
-    /* ATTR_PROGID */              { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "progid" },
-    /* ATTR_PROPGET */             { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propget" },
-    /* ATTR_PROPPUT */             { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propput" },
-    /* ATTR_PROPPUTREF */          { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propputref" },
-    /* ATTR_PROXY */               { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "proxy" },
-    /* ATTR_PUBLIC */              { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "public" },
-    /* ATTR_RANGE */               { 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, "range" },
-    /* ATTR_READONLY */            { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "readonly" },
-    /* ATTR_REPRESENTAS */         { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "represent_as" },
-    /* ATTR_REQUESTEDIT */         { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "requestedit" },
-    /* ATTR_RESTRICTED */          { 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, "restricted" },
-    /* ATTR_RETVAL */              { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "retval" },
-    /* ATTR_SIZEIS */              { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "size_is" },
-    /* ATTR_SOURCE */              { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, "source" },
-    /* ATTR_STRICTCONTEXTHANDLE */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "strict_context_handle" },
-    /* ATTR_STRING */              { 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, "string" },
-    /* ATTR_SWITCHIS */            { 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "switch_is" },
-    /* ATTR_SWITCHTYPE */          { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, "switch_type" },
-    /* ATTR_THREADING */           { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "threading" },
-    /* ATTR_TRANSMITAS */          { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "transmit_as" },
-    /* ATTR_UIDEFAULT */           { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "uidefault" },
-    /* ATTR_USESGETLASTERROR */    { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "usesgetlasterror" },
-    /* ATTR_USERMARSHAL */         { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "user_marshal" },
-    /* ATTR_UUID */                { 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, "uuid" },
-    /* ATTR_V1ENUM */              { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, "v1_enum" },
-    /* ATTR_VARARG */              { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "vararg" },
-    /* ATTR_VERSION */             { 1, 0, 1, 0, 0, 1, 1, 0, 2, 0, 0, 1, 0, 0, 1, "version" },
-    /* ATTR_VIPROGID */            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "vi_progid" },
-    /* ATTR_WIREMARSHAL */         { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "wire_marshal" },
+    /* attr                        { D ACF M   I Fn ARG T En Enm St Un Fi L  DI M  C AC  <display name> } */
+    /* ATTR_AGGREGATABLE */        { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "aggregatable" },
+    /* ATTR_ALLOCATE */            { 0, 1, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "allocate" },
+    /* ATTR_ANNOTATION */          { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "annotation" },
+    /* ATTR_APPOBJECT */           { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "appobject" },
+    /* ATTR_ASYNC */               { 0, 1, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "async" },
+    /* ATTR_ASYNCUUID */           { 1, 0, 0,  1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, "async_uuid" },
+    /* ATTR_AUTO_HANDLE */         { 1, 1, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "auto_handle" },
+    /* ATTR_BINDABLE */            { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "bindable" },
+    /* ATTR_BROADCAST */           { 1, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "broadcast" },
+    /* ATTR_CALLAS */              { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "call_as" },
+    /* ATTR_CALLCONV */            { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL },
+    /* ATTR_CASE */                { 1, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "case" },
+    /* ATTR_CODE */                { 0, 1, 0,  1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "code" },
+    /* ATTR_COMMSTATUS */          { 0, 0, 0,  0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "comm_status" },
+    /* ATTR_CONTEXTHANDLE */       { 1, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "context_handle" },
+    /* ATTR_CONTRACT */            { 0, 0, 0,  1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, "contract" },
+    /* ATTR_CONTRACTVERSION */     { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "contractversion" },
+    /* ATTR_CONTROL */             { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, "control" },
+    /* ATTR_CUSTOM */              { 0, 0, 1,  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, "custom" },
+    /* ATTR_DECODE */              { 0, 0, 0,  1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "decode" },
+    /* ATTR_DEFAULT */             { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, "default" },
+    /* ATTR_DEFAULTBIND */         { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "defaultbind" },
+    /* ATTR_DEFAULTCOLLELEM */     { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "defaultcollelem" },
+    /* ATTR_DEFAULTVALUE */        { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "defaultvalue" },
+    /* ATTR_DEFAULTVTABLE */       { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "defaultvtable" },
+ /* ATTR_DISABLECONSISTENCYCHECK */{ 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "disable_consistency_check" },
+    /* ATTR_DISPINTERFACE */       { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL },
+    /* ATTR_DISPLAYBIND */         { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "displaybind" },
+    /* ATTR_DLLNAME */             { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, "dllname" },
+    /* ATTR_DUAL */                { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "dual" },
+    /* ATTR_ENABLEALLOCATE */      { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "enable_allocate" },
+    /* ATTR_ENCODE */              { 0, 0, 0,  1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "encode" },
+    /* ATTR_ENDPOINT */            { 1, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "endpoint" },
+    /* ATTR_ENTRY */               { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "entry" },
+    /* ATTR_EXPLICIT_HANDLE */     { 1, 1, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "explicit_handle" },
+    /* ATTR_FAULTSTATUS */         { 0, 0, 0,  0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "fault_status" },
+    /* ATTR_FORCEALLOCATE */       { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "force_allocate" },
+    /* ATTR_HANDLE */              { 1, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "handle" },
+    /* ATTR_HELPCONTEXT */         { 0, 0, 0,  1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, "helpcontext" },
+    /* ATTR_HELPFILE */            { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "helpfile" },
+    /* ATTR_HELPSTRING */          { 0, 0, 0,  1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, "helpstring" },
+    /* ATTR_HELPSTRINGCONTEXT */   { 0, 0, 0,  1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, "helpstringcontext" },
+    /* ATTR_HELPSTRINGDLL */       { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "helpstringdll" },
+    /* ATTR_HIDDEN */              { 0, 0, 0,  1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, "hidden" },
+    /* ATTR_ID */                  { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, "id" },
+    /* ATTR_IDEMPOTENT */          { 1, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "idempotent" },
+    /* ATTR_IGNORE */              { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "ignore" },
+    /* ATTR_IIDIS */               { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "iid_is" },
+    /* ATTR_IMMEDIATEBIND */       { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "immediatebind" },
+    /* ATTR_IMPLICIT_HANDLE */     { 1, 1, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "implicit_handle" },
+    /* ATTR_IN */                  { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "in" },
+    /* ATTR_INPUTSYNC */           { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inputsync" },
+    /* ATTR_LENGTHIS */            { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "length_is" },
+    /* ATTR_LIBLCID */             { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "lcid" },
+    /* ATTR_LICENSED */            { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "licensed" },
+    /* ATTR_LOCAL */               { 1, 0, 0,  1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "local" },
+    /* ATTR_MAYBE */               { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "maybe" },
+    /* ATTR_MESSAGE */             { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "message" },
+    /* ATTR_NOCODE */              { 0, 1, 0,  1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "nocode" },
+    /* ATTR_NONBROWSABLE */        { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "nonbrowsable" },
+    /* ATTR_NONCREATABLE */        { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "noncreatable" },
+    /* ATTR_NONEXTENSIBLE */       { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "nonextensible" },
+    /* ATTR_NOTIFY */              { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "notify" },
+    /* ATTR_NOTIFYFLAG */          { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "notify_flag" },
+    /* ATTR_OBJECT */              { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "object" },
+    /* ATTR_ODL */                 { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "odl" },
+    /* ATTR_OLEAUTOMATION */       { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "oleautomation" },
+    /* ATTR_OPTIMIZE */            { 0, 0, 0,  1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "optimize" },
+    /* ATTR_OPTIONAL */            { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "optional" },
+    /* ATTR_OUT */                 { 1, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "out" },
+    /* ATTR_PARAMLCID */           { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "lcid" },
+    /* ATTR_PARTIALIGNORE */       { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "partial_ignore" },
+    /* ATTR_POINTERDEFAULT */      { 1, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "pointer_default" },
+    /* ATTR_POINTERTYPE */         { 1, 0, 0,  0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "ref, unique or ptr" },
+    /* ATTR_PROGID */              { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "progid" },
+    /* ATTR_PROPGET */             { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propget" },
+    /* ATTR_PROPPUT */             { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propput" },
+    /* ATTR_PROPPUTREF */          { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propputref" },
+    /* ATTR_PROXY */               { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "proxy" },
+    /* ATTR_PUBLIC */              { 0, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "public" },
+    /* ATTR_RANGE */               { 0, 0, 0,  0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, "range" },
+    /* ATTR_READONLY */            { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "readonly" },
+    /* ATTR_REPRESENTAS */         { 1, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "represent_as" },
+    /* ATTR_REQUESTEDIT */         { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "requestedit" },
+    /* ATTR_RESTRICTED */          { 0, 0, 0,  1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, "restricted" },
+    /* ATTR_RETVAL */              { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "retval" },
+    /* ATTR_SIZEIS */              { 0, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "size_is" },
+    /* ATTR_SOURCE */              { 0, 0, 0,  1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "source" },
+    /* ATTR_STRICTCONTEXTHANDLE */ { 0, 0, 0,  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "strict_context_handle" },
+    /* ATTR_STRING */              { 1, 0, 0,  0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "string" },
+    /* ATTR_SWITCHIS */            { 1, 0, 0,  0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "switch_is" },
+    /* ATTR_SWITCHTYPE */          { 1, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "switch_type" },
+    /* ATTR_THREADING */           { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "threading" },
+    /* ATTR_TRANSMITAS */          { 1, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "transmit_as" },
+    /* ATTR_UIDEFAULT */           { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "uidefault" },
+    /* ATTR_USESGETLASTERROR */    { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "usesgetlasterror" },
+    /* ATTR_USERMARSHAL */         { 0, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "user_marshal" },
+    /* ATTR_UUID */                { 1, 0, 0,  1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, "uuid" },
+    /* ATTR_V1ENUM */              { 0, 0, 0,  0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "v1_enum" },
+    /* ATTR_VARARG */              { 0, 0, 0,  0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "vararg" },
+    /* ATTR_VERSION */             { 1, 0, 0,  1, 0, 0, 1, 1, 0, 2, 0, 0, 1, 0, 0, 1, 0, "version" },
+    /* ATTR_VIPROGID */            { 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "vi_progid" },
+    /* ATTR_WIREMARSHAL */         { 1, 0, 0,  0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "wire_marshal" },
 };
 
+static attr_list_t *append_attr(attr_list_t *list, attr_t *attr)
+{
+    attr_t *attr_existing;
+    if (!attr) return list;
+    if (!list)
+    {
+        list = xmalloc( sizeof(*list) );
+        list_init( list );
+    }
+    if (!allowed_attr[attr->type].multiple)
+    {
+        LIST_FOR_EACH_ENTRY(attr_existing, list, attr_t, entry)
+            if (attr_existing->type == attr->type)
+            {
+                parser_warning("duplicate attribute %s\n", get_attr_display_name(attr->type));
+                /* use the last attribute, like MIDL does */
+                list_remove(&attr_existing->entry);
+                break;
+            }
+    }
+    list_add_tail( list, &attr->entry );
+    return list;
+}
+
 const char *get_attr_display_name(enum attr_type type)
 {
     return allowed_attr[type].display_name;
@@ -2410,6 +2491,17 @@
   return attrs;
 }
 
+static attr_list_t *check_apicontract_attrs(const char *name, attr_list_t *attrs)
+{
+    const attr_t *attr;
+    if (!attrs) return attrs;
+    LIST_FOR_EACH_ENTRY(attr, attrs, const attr_t, entry)
+        if (!allowed_attr[attr->type].on_apicontract)
+            error_loc("inapplicable attribute %s for apicontract %s\n",
+                      allowed_attr[attr->type].display_name, name);
+    return attrs;
+}
+
 static int is_allowed_conf_type(const type_t *type)
 {
     switch (type_get_type(type))
@@ -2449,6 +2541,10 @@
     case TYPE_INTERFACE:
     case TYPE_BITFIELD:
         return FALSE;
+    case TYPE_APICONTRACT:
+        /* not supposed to be here */
+        assert(0);
+        break;
     }
     return FALSE;
 }
diff --git a/mingw-w64-tools/widl/src/parser.yy.c b/mingw-w64-tools/widl/src/parser.yy.c
index f0ffc90..3455b6b 100644
--- a/mingw-w64-tools/widl/src/parser.yy.c
+++ b/mingw-w64-tools/widl/src/parser.yy.c
@@ -2640,67 +2640,69 @@
 struct keyword {
 	const char *kw;
 	int token;
+	int winrt_only : 1;
 };
 
 /* This table MUST be alphabetically sorted on the kw field */
 static const struct keyword keywords[] = {
-	{"FALSE",			tFALSE},
-	{"NULL",			tNULL},
-	{"TRUE",			tTRUE},
-	{"__cdecl",			tCDECL},
-	{"__fastcall",			tFASTCALL},
-	{"__int32",			tINT32},
-	{"__int3264",			tINT3264},
-	{"__int64",			tINT64},
-	{"__pascal",			tPASCAL},
-	{"__stdcall",			tSTDCALL},
-	{"_cdecl",			tCDECL},
-	{"_fastcall",			tFASTCALL},
-	{"_pascal",			tPASCAL},
-	{"_stdcall",			tSTDCALL},
-	{"boolean",			tBOOLEAN},
-	{"byte",			tBYTE},
-	{"case",			tCASE},
-	{"cdecl",			tCDECL},
-	{"char",			tCHAR},
-	{"coclass",			tCOCLASS},
-	{"const",			tCONST},
-	{"cpp_quote",			tCPPQUOTE},
-	{"default",			tDEFAULT},
-	{"dispinterface",		tDISPINTERFACE},
-	{"double",			tDOUBLE},
-	{"enum",			tENUM},
-	{"error_status_t",		tERRORSTATUST},
-	{"extern",			tEXTERN},
-	{"float",			tFLOAT},
-	{"handle_t",			tHANDLET},
-	{"hyper",			tHYPER},
-	{"import",			tIMPORT},
-	{"importlib",			tIMPORTLIB},
-	{"inline",			tINLINE},
-	{"int",				tINT},
-	{"interface",			tINTERFACE},
-	{"library",			tLIBRARY},
-	{"long",			tLONG},
-	{"methods",			tMETHODS},
-	{"module",			tMODULE},
-	{"namespace",			tNAMESPACE},
-	{"pascal",			tPASCAL},
-	{"properties",			tPROPERTIES},
-	{"register",			tREGISTER},
-	{"short",			tSHORT},
-	{"signed",			tSIGNED},
-	{"sizeof",			tSIZEOF},
-        {"small",			tSMALL},
-	{"static",			tSTATIC},
-	{"stdcall",			tSTDCALL},
-	{"struct",			tSTRUCT},
-	{"switch",			tSWITCH},
-	{"typedef",			tTYPEDEF},
-	{"union",			tUNION},
-	{"unsigned",			tUNSIGNED},
-	{"void",			tVOID},
-	{"wchar_t",			tWCHAR},
+	{"FALSE",           tFALSE,          0},
+	{"NULL",            tNULL,           0},
+	{"TRUE",            tTRUE,           0},
+	{"__cdecl",         tCDECL,          0},
+	{"__fastcall",      tFASTCALL,       0},
+	{"__int32",         tINT32,          0},
+	{"__int3264",       tINT3264,        0},
+	{"__int64",         tINT64,          0},
+	{"__pascal",        tPASCAL,         0},
+	{"__stdcall",       tSTDCALL,        0},
+	{"_cdecl",          tCDECL,          0},
+	{"_fastcall",       tFASTCALL,       0},
+	{"_pascal",         tPASCAL,         0},
+	{"_stdcall",        tSTDCALL,        0},
+	{"apicontract",     tAPICONTRACT,    1},
+	{"boolean",         tBOOLEAN,        0},
+	{"byte",            tBYTE,           0},
+	{"case",            tCASE,           0},
+	{"cdecl",           tCDECL,          0},
+	{"char",            tCHAR,           0},
+	{"coclass",         tCOCLASS,        0},
+	{"const",           tCONST,          0},
+	{"cpp_quote",       tCPPQUOTE,       0},
+	{"default",         tDEFAULT,        0},
+	{"dispinterface",   tDISPINTERFACE,  0},
+	{"double",          tDOUBLE,         0},
+	{"enum",            tENUM,           0},
+	{"error_status_t",  tERRORSTATUST,   0},
+	{"extern",          tEXTERN,         0},
+	{"float",           tFLOAT,          0},
+	{"handle_t",        tHANDLET,        0},
+	{"hyper",           tHYPER,          0},
+	{"import",          tIMPORT,         0},
+	{"importlib",       tIMPORTLIB,      0},
+	{"inline",          tINLINE,         0},
+	{"int",             tINT,            0},
+	{"interface",       tINTERFACE,      0},
+	{"library",         tLIBRARY,        0},
+	{"long",            tLONG,           0},
+	{"methods",         tMETHODS,        0},
+	{"module",          tMODULE,         0},
+	{"namespace",       tNAMESPACE,      1},
+	{"pascal",          tPASCAL,         0},
+	{"properties",      tPROPERTIES,     0},
+	{"register",        tREGISTER,       0},
+	{"short",           tSHORT,          0},
+	{"signed",          tSIGNED,         0},
+	{"sizeof",          tSIZEOF,         0},
+	{"small",           tSMALL,          0},
+	{"static",          tSTATIC,         0},
+	{"stdcall",         tSTDCALL,        0},
+	{"struct",          tSTRUCT,         0},
+	{"switch",          tSWITCH,         0},
+	{"typedef",         tTYPEDEF,        0},
+	{"union",           tUNION,          0},
+	{"unsigned",        tUNSIGNED,       0},
+	{"void",            tVOID,           0},
+	{"wchar_t",         tWCHAR,          0},
 };
 #define NKEYWORDS (sizeof(keywords)/sizeof(keywords[0]))
 
@@ -2709,117 +2711,122 @@
  */
 static const struct keyword attr_keywords[] =
 {
-        {"aggregatable",                tAGGREGATABLE},
-        {"allocate",                    tALLOCATE},
-        {"annotation",                  tANNOTATION},
-        {"apartment",                   tAPARTMENT},
-        {"appobject",                   tAPPOBJECT},
-        {"async",                       tASYNC},
-        {"async_uuid",                  tASYNCUUID},
-        {"auto_handle",                 tAUTOHANDLE},
-        {"bindable",                    tBINDABLE},
-        {"both",                        tBOTH},
-        {"broadcast",                   tBROADCAST},
-        {"byte_count",                  tBYTECOUNT},
-        {"call_as",                     tCALLAS},
-        {"callback",                    tCALLBACK},
-        {"code",                        tCODE},
-        {"comm_status",                 tCOMMSTATUS},
-        {"context_handle",              tCONTEXTHANDLE},
-        {"context_handle_noserialize",  tCONTEXTHANDLENOSERIALIZE},
-        {"context_handle_serialize",    tCONTEXTHANDLENOSERIALIZE},
-        {"control",                     tCONTROL},
-        {"decode",                      tDECODE},
-        {"defaultbind",                 tDEFAULTBIND},
-        {"defaultcollelem",             tDEFAULTCOLLELEM},
-        {"defaultvalue",                tDEFAULTVALUE},
-        {"defaultvtable",               tDEFAULTVTABLE},
-        {"disable_consistency_check",   tDISABLECONSISTENCYCHECK},
-        {"displaybind",                 tDISPLAYBIND},
-        {"dllname",                     tDLLNAME},
-        {"dual",                        tDUAL},
-        {"enable_allocate",             tENABLEALLOCATE},
-        {"encode",                      tENCODE},
-        {"endpoint",                    tENDPOINT},
-        {"entry",                       tENTRY},
-        {"explicit_handle",             tEXPLICITHANDLE},
-        {"fault_status",                tFAULTSTATUS},
-        {"force_allocate",              tFORCEALLOCATE},
-        {"free",                        tFREE},
-        {"handle",                      tHANDLE},
-        {"helpcontext",                 tHELPCONTEXT},
-        {"helpfile",                    tHELPFILE},
-        {"helpstring",                  tHELPSTRING},
-        {"helpstringcontext",           tHELPSTRINGCONTEXT},
-        {"helpstringdll",               tHELPSTRINGDLL},
-        {"hidden",                      tHIDDEN},
-        {"id",                          tID},
-        {"idempotent",                  tIDEMPOTENT},
-        {"ignore",                      tIGNORE},
-        {"iid_is",                      tIIDIS},
-        {"immediatebind",               tIMMEDIATEBIND},
-        {"implicit_handle",             tIMPLICITHANDLE},
-        {"in",                          tIN},
-        {"in_line",                     tIN_LINE},
-        {"input_sync",                  tINPUTSYNC},
-        {"lcid",                        tLCID},
-        {"length_is",                   tLENGTHIS},
-        {"licensed",                    tLICENSED},
-        {"local",                       tLOCAL},
-        {"maybe",                       tMAYBE},
-        {"message",                     tMESSAGE},
-        {"neutral",                     tNEUTRAL},
-        {"nocode",                      tNOCODE},
-        {"nonbrowsable",                tNONBROWSABLE},
-        {"noncreatable",                tNONCREATABLE},
-        {"nonextensible",               tNONEXTENSIBLE},
-        {"notify",                      tNOTIFY},
-        {"notify_flag",                 tNOTIFYFLAG},
-        {"object",                      tOBJECT},
-        {"odl",                         tODL},
-        {"oleautomation",               tOLEAUTOMATION},
-        {"optimize",                    tOPTIMIZE},
-        {"optional",                    tOPTIONAL},
-        {"out",                         tOUT},
-        {"partial_ignore",              tPARTIALIGNORE},
-        {"pointer_default",             tPOINTERDEFAULT},
-        {"progid",                      tPROGID},
-        {"propget",                     tPROPGET},
-        {"propput",                     tPROPPUT},
-        {"propputref",                  tPROPPUTREF},
-        {"proxy",                       tPROXY},
-        {"ptr",                         tPTR},
-        {"public",                      tPUBLIC},
-        {"range",                       tRANGE},
-        {"readonly",                    tREADONLY},
-        {"ref",                         tREF},
-        {"represent_as",                tREPRESENTAS},
-        {"requestedit",                 tREQUESTEDIT},
-        {"restricted",                  tRESTRICTED},
-        {"retval",                      tRETVAL},
-        {"single",                      tSINGLE},
-        {"size_is",                     tSIZEIS},
-        {"source",                      tSOURCE},
-        {"strict_context_handle",       tSTRICTCONTEXTHANDLE},
-        {"string",                      tSTRING},
-        {"switch_is",                   tSWITCHIS},
-        {"switch_type",                 tSWITCHTYPE},
-        {"threading",                   tTHREADING},
-        {"transmit_as",                 tTRANSMITAS},
-        {"uidefault",                   tUIDEFAULT},
-        {"unique",                      tUNIQUE},
-        {"user_marshal",                tUSERMARSHAL},
-        {"usesgetlasterror",            tUSESGETLASTERROR},
-        {"uuid",                        tUUID},
-        {"v1_enum",                     tV1ENUM},
-        {"vararg",                      tVARARG},
-        {"version",                     tVERSION},
-        {"vi_progid",                   tVIPROGID},
-        {"wire_marshal",                tWIREMARSHAL},
+	{"aggregatable",                tAGGREGATABLE,              0},
+	{"all_nodes",                   tALLNODES,                  0},
+	{"allocate",                    tALLOCATE,                  0},
+	{"annotation",                  tANNOTATION,                0},
+	{"apartment",                   tAPARTMENT,                 0},
+	{"appobject",                   tAPPOBJECT,                 0},
+	{"async",                       tASYNC,                     0},
+	{"async_uuid",                  tASYNCUUID,                 0},
+	{"auto_handle",                 tAUTOHANDLE,                0},
+	{"bindable",                    tBINDABLE,                  0},
+	{"both",                        tBOTH,                      0},
+	{"broadcast",                   tBROADCAST,                 0},
+	{"byte_count",                  tBYTECOUNT,                 0},
+	{"call_as",                     tCALLAS,                    0},
+	{"callback",                    tCALLBACK,                  0},
+	{"code",                        tCODE,                      0},
+	{"comm_status",                 tCOMMSTATUS,                0},
+	{"context_handle",              tCONTEXTHANDLE,             0},
+	{"context_handle_noserialize",  tCONTEXTHANDLENOSERIALIZE,  0},
+	{"context_handle_serialize",    tCONTEXTHANDLENOSERIALIZE,  0},
+	{"contract",                    tCONTRACT,                  1},
+	{"contractversion",             tCONTRACTVERSION,           1},
+	{"control",                     tCONTROL,                   0},
+	{"custom",                      tCUSTOM,                    0},
+	{"decode",                      tDECODE,                    0},
+	{"defaultbind",                 tDEFAULTBIND,               0},
+	{"defaultcollelem",             tDEFAULTCOLLELEM,           0},
+	{"defaultvalue",                tDEFAULTVALUE,              0},
+	{"defaultvtable",               tDEFAULTVTABLE,             0},
+	{"disable_consistency_check",   tDISABLECONSISTENCYCHECK,   0},
+	{"displaybind",                 tDISPLAYBIND,               0},
+	{"dllname",                     tDLLNAME,                   0},
+	{"dont_free",                   tDONTFREE,                  0},
+	{"dual",                        tDUAL,                      0},
+	{"enable_allocate",             tENABLEALLOCATE,            0},
+	{"encode",                      tENCODE,                    0},
+	{"endpoint",                    tENDPOINT,                  0},
+	{"entry",                       tENTRY,                     0},
+	{"explicit_handle",             tEXPLICITHANDLE,            0},
+	{"fault_status",                tFAULTSTATUS,               0},
+	{"force_allocate",              tFORCEALLOCATE,             0},
+	{"free",                        tFREE,                      0},
+	{"handle",                      tHANDLE,                    0},
+	{"helpcontext",                 tHELPCONTEXT,               0},
+	{"helpfile",                    tHELPFILE,                  0},
+	{"helpstring",                  tHELPSTRING,                0},
+	{"helpstringcontext",           tHELPSTRINGCONTEXT,         0},
+	{"helpstringdll",               tHELPSTRINGDLL,             0},
+	{"hidden",                      tHIDDEN,                    0},
+	{"id",                          tID,                        0},
+	{"idempotent",                  tIDEMPOTENT,                0},
+	{"ignore",                      tIGNORE,                    0},
+	{"iid_is",                      tIIDIS,                     0},
+	{"immediatebind",               tIMMEDIATEBIND,             0},
+	{"implicit_handle",             tIMPLICITHANDLE,            0},
+	{"in",                          tIN,                        0},
+	{"in_line",                     tIN_LINE,                   0},
+	{"input_sync",                  tINPUTSYNC,                 0},
+	{"lcid",                        tLCID,                      0},
+	{"length_is",                   tLENGTHIS,                  0},
+	{"licensed",                    tLICENSED,                  0},
+	{"local",                       tLOCAL,                     0},
+	{"maybe",                       tMAYBE,                     0},
+	{"message",                     tMESSAGE,                   0},
+	{"neutral",                     tNEUTRAL,                   0},
+	{"nocode",                      tNOCODE,                    0},
+	{"nonbrowsable",                tNONBROWSABLE,              0},
+	{"noncreatable",                tNONCREATABLE,              0},
+	{"nonextensible",               tNONEXTENSIBLE,             0},
+	{"notify",                      tNOTIFY,                    0},
+	{"notify_flag",                 tNOTIFYFLAG,                0},
+	{"object",                      tOBJECT,                    0},
+	{"odl",                         tODL,                       0},
+	{"oleautomation",               tOLEAUTOMATION,             0},
+	{"optimize",                    tOPTIMIZE,                  0},
+	{"optional",                    tOPTIONAL,                  0},
+	{"out",                         tOUT,                       0},
+	{"partial_ignore",              tPARTIALIGNORE,             0},
+	{"pointer_default",             tPOINTERDEFAULT,            0},
+	{"progid",                      tPROGID,                    0},
+	{"propget",                     tPROPGET,                   0},
+	{"propput",                     tPROPPUT,                   0},
+	{"propputref",                  tPROPPUTREF,                0},
+	{"proxy",                       tPROXY,                     0},
+	{"ptr",                         tPTR,                       0},
+	{"public",                      tPUBLIC,                    0},
+	{"range",                       tRANGE,                     0},
+	{"readonly",                    tREADONLY,                  0},
+	{"ref",                         tREF,                       0},
+	{"represent_as",                tREPRESENTAS,               0},
+	{"requestedit",                 tREQUESTEDIT,               0},
+	{"restricted",                  tRESTRICTED,                0},
+	{"retval",                      tRETVAL,                    0},
+	{"single",                      tSINGLE,                    0},
+	{"single_node",                 tSINGLENODE,                0},
+	{"size_is",                     tSIZEIS,                    0},
+	{"source",                      tSOURCE,                    0},
+	{"strict_context_handle",       tSTRICTCONTEXTHANDLE,       0},
+	{"string",                      tSTRING,                    0},
+	{"switch_is",                   tSWITCHIS,                  0},
+	{"switch_type",                 tSWITCHTYPE,                0},
+	{"threading",                   tTHREADING,                 0},
+	{"transmit_as",                 tTRANSMITAS,                0},
+	{"uidefault",                   tUIDEFAULT,                 0},
+	{"unique",                      tUNIQUE,                    0},
+	{"user_marshal",                tUSERMARSHAL,               0},
+	{"usesgetlasterror",            tUSESGETLASTERROR,          0},
+	{"uuid",                        tUUID,                      0},
+	{"v1_enum",                     tV1ENUM,                    0},
+	{"vararg",                      tVARARG,                    0},
+	{"version",                     tVERSION,                   0},
+	{"vi_progid",                   tVIPROGID,                  0},
+	{"wire_marshal",                tWIREMARSHAL,               0},
 };
 
 /* attributes TODO:
-    custom
     first_is
     last_is
     max_is
@@ -2838,7 +2845,7 @@
 	struct keyword key, *kwp;
 	key.kw = kw;
 	kwp = bsearch(&key, keywords, NKEYWORDS, sizeof(keywords[0]), kw_cmp_func);
-	if (kwp && (winrt_mode || kwp->token != tNAMESPACE)) {
+	if (kwp && (!kwp->winrt_only || winrt_mode)) {
 		parser_lval.str = xstrdup(kwp->kw);
 		return kwp->token;
 	}
@@ -2852,7 +2859,7 @@
         key.kw = kw;
         kwp = bsearch(&key, attr_keywords, sizeof(attr_keywords)/sizeof(attr_keywords[0]),
                       sizeof(attr_keywords[0]), kw_cmp_func);
-        if (kwp) {
+        if (kwp && (!kwp->winrt_only || winrt_mode)) {
             parser_lval.str = xstrdup(kwp->kw);
             return kwp->token;
         }
diff --git a/mingw-w64-tools/widl/src/typegen.c b/mingw-w64-tools/widl/src/typegen.c
index 04280cb..5d0f24b 100644
--- a/mingw-w64-tools/widl/src/typegen.c
+++ b/mingw-w64-tools/widl/src/typegen.c
@@ -374,6 +374,10 @@
     case TYPE_ALIAS:
     case TYPE_BITFIELD:
         break;
+    case TYPE_APICONTRACT:
+        /* not supposed to be here */
+        assert(0);
+        break;
     }
     return TGT_INVALID;
 }
@@ -1966,6 +1970,7 @@
     case TYPE_MODULE:
     case TYPE_FUNCTION:
     case TYPE_BITFIELD:
+    case TYPE_APICONTRACT:
         /* these types should not be encountered here due to language
          * restrictions (interface, void, coclass, module), logical
          * restrictions (alias - due to type_get_type call above) or
@@ -2067,6 +2072,7 @@
     case TYPE_MODULE:
     case TYPE_FUNCTION:
     case TYPE_BITFIELD:
+    case TYPE_APICONTRACT:
         /* these types should not be encountered here due to language
          * restrictions (interface, void, coclass, module), logical
          * restrictions (alias - due to type_get_type call above) or
@@ -2153,6 +2159,9 @@
         type_t *ref = type_pointer_get_ref_type(type);
         if(is_declptr(ref) && !is_user_type(ref))
             flags |= FC_POINTER_DEREF;
+        if (pointer_type != FC_RP) {
+            flags |= get_attrv(type->attrs, ATTR_ALLOCATE);
+        }
     }
 
     print_file(file, 2, "0x%x, 0x%x,\t\t/* %s",
@@ -2165,6 +2174,10 @@
             fprintf(file, " [allocated_on_stack]");
         if (flags & FC_POINTER_DEREF)
             fprintf(file, " [pointer_deref]");
+        if (flags & FC_DONT_FREE)
+            fprintf(file, " [dont_free]");
+        if (flags & FC_ALLOCATE_ALL_NODES)
+            fprintf(file, " [all_nodes]");
         fprintf(file, " */\n");
     }
 
diff --git a/mingw-w64-tools/widl/src/typelib.c b/mingw-w64-tools/widl/src/typelib.c
index cf02755..faf7644 100644
--- a/mingw-w64-tools/widl/src/typelib.c
+++ b/mingw-w64-tools/widl/src/typelib.c
@@ -224,7 +224,8 @@
     return VT_VOID;
 
   case TYPE_ALIAS:
-    /* aliases should be filtered out by the type_get_type call above */
+  case TYPE_APICONTRACT:
+    /* not supposed to be here */
     assert(0);
     break;
 
diff --git a/mingw-w64-tools/widl/src/typetree.c b/mingw-w64-tools/widl/src/typetree.c
index e9afc6f..df88357 100644
--- a/mingw-w64-tools/widl/src/typetree.c
+++ b/mingw-w64-tools/widl/src/typetree.c
@@ -82,45 +82,45 @@
     case NAME_DEFAULT:
         return type->name;
     case NAME_C:
-        return type->c_name;
+        return type->c_name ? type->c_name : type->name;
     }
 
     assert(0);
     return NULL;
 }
 
-static char *append_namespace(char *ptr, struct namespace *namespace, const char *separator)
+static char *append_namespace(char *ptr, struct namespace *namespace, const char *separator, const char *abi_prefix)
 {
     if(is_global_namespace(namespace)) {
-        if(!use_abi_namespace)
-            return ptr;
-        strcpy(ptr, "ABI");
+        if(!abi_prefix) return ptr;
+        strcpy(ptr, abi_prefix);
         strcat(ptr, separator);
         return ptr + strlen(ptr);
     }
 
-    ptr = append_namespace(ptr, namespace->parent, separator);
+    ptr = append_namespace(ptr, namespace->parent, separator, abi_prefix);
     strcpy(ptr, namespace->name);
     strcat(ptr, separator);
     return ptr + strlen(ptr);
 }
 
-char *format_namespace(struct namespace *namespace, const char *prefix, const char *separator, const char *suffix)
+char *format_namespace(struct namespace *namespace, const char *prefix, const char *separator, const char *suffix,
+                       const char *abi_prefix)
 {
     unsigned len = strlen(prefix) + strlen(suffix);
     unsigned sep_len = strlen(separator);
     struct namespace *iter;
     char *ret, *ptr;
 
-    if(use_abi_namespace && !is_global_namespace(namespace))
-        len += 3 /* strlen("ABI") */ + sep_len;
+    if(abi_prefix)
+        len += strlen(abi_prefix) + sep_len;
 
     for(iter = namespace; !is_global_namespace(iter); iter = iter->parent)
         len += strlen(iter->name) + sep_len;
 
     ret = xmalloc(len+1);
     strcpy(ret, prefix);
-    ptr = append_namespace(ret + strlen(ret), namespace, separator);
+    ptr = append_namespace(ret + strlen(ret), namespace, separator, abi_prefix);
     strcpy(ptr, suffix);
 
     return ret;
diff --git a/mingw-w64-tools/widl/src/typetree.h b/mingw-w64-tools/widl/src/typetree.h
index e288c57..7abec41 100644
--- a/mingw-w64-tools/widl/src/typetree.h
+++ b/mingw-w64-tools/widl/src/typetree.h
@@ -223,6 +223,9 @@
     case TYPE_ARRAY:
     case TYPE_BITFIELD:
         return TRUE;
+    case TYPE_APICONTRACT:
+        assert(0);
+        break;
     }
     return FALSE;
 }
diff --git a/mingw-w64-tools/widl/src/widl.c b/mingw-w64-tools/widl/src/widl.c
index 69cb4b6..6192229 100644
--- a/mingw-w64-tools/widl/src/widl.c
+++ b/mingw-w64-tools/widl/src/widl.c
@@ -250,6 +250,7 @@
 
 static void add_widl_version_define(void)
 {
+    char version_str[32];
     unsigned int version;
     const char *p = PACKAGE_VERSION;
 
@@ -268,14 +269,8 @@
     if (p)
         version += atoi(p + 1);
 
-    if (version != 0)
-    {
-        char version_str[11];
-        snprintf(version_str, sizeof(version_str), "0x%x", version);
-        wpp_add_define("__WIDL__", version_str);
-    }
-    else
-        wpp_add_define("__WIDL__", NULL);
+    snprintf(version_str, sizeof(version_str), "__WIDL__=0x%x", version);
+    wpp_add_cmdline_define(version_str);
 }
 
 /* set the target platform */
@@ -916,7 +911,7 @@
   if (do_regscript) regscript_token = dup_basename_token(regscript_name,"_r.rgs");
 
   add_widl_version_define();
-  wpp_add_define("_WIN32", NULL);
+  wpp_add_cmdline_define("_WIN32=1");
 
   atexit(rm_tempfile);
   if (!no_preprocess)
diff --git a/mingw-w64-tools/widl/src/widltypes.h b/mingw-w64-tools/widl/src/widltypes.h
index 085a0ff..d586242 100644
--- a/mingw-w64-tools/widl/src/widltypes.h
+++ b/mingw-w64-tools/widl/src/widltypes.h
@@ -37,6 +37,7 @@
 
 typedef struct _loc_info_t loc_info_t;
 typedef struct _attr_t attr_t;
+typedef struct _attr_custdata_t attr_custdata_t;
 typedef struct _expr_t expr_t;
 typedef struct _type_t type_t;
 typedef struct _var_t var_t;
@@ -69,6 +70,7 @@
 enum attr_type
 {
     ATTR_AGGREGATABLE,
+    ATTR_ALLOCATE,
     ATTR_ANNOTATION,
     ATTR_APPOBJECT,
     ATTR_ASYNC,
@@ -82,7 +84,10 @@
     ATTR_CODE,
     ATTR_COMMSTATUS,
     ATTR_CONTEXTHANDLE,
+    ATTR_CONTRACT,
+    ATTR_CONTRACTVERSION,
     ATTR_CONTROL,
+    ATTR_CUSTOM,
     ATTR_DECODE,
     ATTR_DEFAULT,
     ATTR_DEFAULTBIND,
@@ -337,6 +342,11 @@
   struct list entry;
 };
 
+struct _attr_custdata_t {
+  GUID id;
+  expr_t *pval;
+};
+
 struct struct_details
 {
   var_list_t *fields;
@@ -431,6 +441,7 @@
     TYPE_POINTER,
     TYPE_ARRAY,
     TYPE_BITFIELD,
+    TYPE_APICONTRACT,
 };
 
 struct _type_t {
@@ -605,7 +616,8 @@
 
 void init_loc_info(loc_info_t *);
 
-char *format_namespace(struct namespace *namespace, const char *prefix, const char *separator, const char *suffix);
+char *format_namespace(struct namespace *namespace, const char *prefix, const char *separator, const char *suffix,
+                       const char *abi_prefix);
 
 static inline enum type_type type_get_type_detect_alias(const type_t *type)
 {
diff --git a/mingw-w64-tools/widl/src/wpp/ppl.l b/mingw-w64-tools/widl/src/wpp/ppl.l
index 566cf2f..c1b8307 100644
--- a/mingw-w64-tools/widl/src/wpp/ppl.l
+++ b/mingw-w64-tools/widl/src/wpp/ppl.l
@@ -210,7 +210,7 @@
 
 typedef struct bufferstackentry {
 	YY_BUFFER_STATE	bufferstate;	/* Buffer to switch back to */
-	void		*filehandle;    /* Handle to be used with wpp_callbacks->read */
+	FILE		*file;          /* File handle */
 	pp_entry_t	*define;	/* Points to expanding define or NULL if handling includes */
 	int		line_number;	/* Line that we were handling */
 	int		char_number;	/* The current position on that line */
@@ -302,7 +302,7 @@
     0      /* seen_junk */
 };
 
-includelogicentry_t *pp_includelogiclist = NULL;
+struct list pp_includelogiclist = LIST_INIT( pp_includelogiclist );
 
 #define YY_INPUT(buf,result,max_size)					     \
 	{								     \
@@ -322,8 +322,6 @@
 	if(buffercapacity == 0)
 	{
 		buffer = pp_xmalloc(BUFFERINITIALCAPACITY);
-		if(buffer == NULL)
-			return;
 		buffercapacity = BUFFERINITIALCAPACITY;
 	}
 
@@ -498,7 +496,7 @@
 	/*
 	 * Handle left side of #define
 	 */
-<pp_def>{cident}\(		ppy_lval.cptr = pp_xstrdup(ppy_text); if(ppy_lval.cptr) ppy_lval.cptr[ppy_leng-1] = '\0'; yy_pp_state(pp_macro);  return tMACRO;
+<pp_def>{cident}\(		ppy_lval.cptr = pp_xstrdup(ppy_text); ppy_lval.cptr[ppy_leng-1] = '\0'; yy_pp_state(pp_macro);  return tMACRO;
 <pp_def>{cident}		ppy_lval.cptr = pp_xstrdup(ppy_text); yy_pp_state(pp_define); return tDEFINE;
 <pp_def>{ws}+			;
 <pp_def>\\\r?\n			newline(0);
@@ -851,10 +849,6 @@
  *
  * FIXME:
  * The sizes of resulting 'int' and 'long' are compiler specific.
- * I depend on sizeof(int) > 2 here (although a relatively safe
- * assumption).
- * Long longs are not yet implemented because this is very compiler
- * specific and I don't want to think too much about the problems.
  *
  *-------------------------------------------------------------------------
  */
@@ -1225,10 +1219,6 @@
  */
 static void new_string(void)
 {
-#ifdef DEBUG
-	if(strbuf_idx)
-		ppy_warning("new_string: strbuf_idx != 0");
-#endif
 	strbuf_idx = 0;
 	str_startline = pp_status.line_number;
 }
@@ -1258,22 +1248,15 @@
 static char *get_string(void)
 {
 	char *str = pp_xmalloc(strbuf_idx + 1);
-	if(!str)
-		return NULL;
+
 	memcpy(str, strbuffer, strbuf_idx);
 	str[strbuf_idx] = '\0';
-#ifdef DEBUG
-	strbuf_idx = 0;
-#endif
 	return str;
 }
 
 static void put_string(void)
 {
 	put_buffer(strbuffer, strbuf_idx);
-#ifdef DEBUG
-	strbuf_idx = 0;
-#endif
 }
 
 static int string_start(void)
@@ -1296,7 +1279,7 @@
 
 	memset(&bufferstack[bufferstackidx], 0, sizeof(bufferstack[0]));
 	bufferstack[bufferstackidx].bufferstate	= YY_CURRENT_BUFFER;
-	bufferstack[bufferstackidx].filehandle  = pp_status.file;
+	bufferstack[bufferstackidx].file        = pp_status.file;
 	bufferstack[bufferstackidx].define	= ppp;
 	bufferstack[bufferstackidx].line_number	= pp_status.line_number;
 	bufferstack[bufferstackidx].char_number	= pp_status.char_number;
@@ -1350,20 +1333,13 @@
 				if(ppp)
 				{
 					iep = pp_xmalloc(sizeof(includelogicentry_t));
-					if (iep)
-					{
-						iep->ppp = ppp;
-						ppp->iep = iep;
-						iep->filename = bufferstack[bufferstackidx].include_filename;
-						iep->prev = NULL;
-						iep->next = pp_includelogiclist;
-						if(iep->next)
-							iep->next->prev = iep;
-						pp_includelogiclist = iep;
-						if(pp_status.debug)
-							fprintf(stderr, "pop_buffer: %s:%d: includelogic added, include_ppp='%s', file='%s'\n",
-                                                                bufferstack[bufferstackidx].filename, bufferstack[bufferstackidx].line_number, pp_incl_state.ppp, iep->filename);
-					}
+					iep->ppp = ppp;
+					ppp->iep = iep;
+					iep->filename = bufferstack[bufferstackidx].include_filename;
+                                        list_add_head( &pp_includelogiclist, &iep->entry );
+					if(pp_status.debug)
+						fprintf(stderr, "pop_buffer: %s:%d: includelogic added, include_ppp='%s', file='%s'\n",
+                                                        bufferstack[bufferstackidx].filename, bufferstack[bufferstackidx].line_number, pp_incl_state.ppp, iep->filename);
 				}
 			}
 			free(pp_incl_state.ppp);
@@ -1393,7 +1369,7 @@
 			bufferstack[bufferstackidx].filename,
 			bufferstack[bufferstackidx].should_pop);
 
-	pp_status.file = bufferstack[bufferstackidx].filehandle;
+	pp_status.file = bufferstack[bufferstackidx].file;
 	ppy__switch_to_buffer(bufferstack[bufferstackidx].bufferstate);
 
 	if(bufferstack[bufferstackidx].should_pop)
@@ -1423,8 +1399,6 @@
 	}
 
 	macexpstack[macexpstackidx] = pp_xmalloc(sizeof(macexpstack[0][0]));
-	if(!macexpstack[macexpstackidx])
-		return;
         memset( macexpstack[macexpstackidx], 0, sizeof(macexpstack[0][0]));
 	macexpstack[macexpstackidx]->ppp = ppp;
 	macexpstackidx++;
@@ -1479,30 +1453,15 @@
 {
 	int nnl = 0;
 	char *cptr;
-	char **new_args, **new_ppargs;
-	int *new_nnls;
 	macexpstackentry_t *mep = top_macro();
 
 	assert(mep->ppp->expanding == 0);
 
-	new_args = pp_xrealloc(mep->args, (mep->nargs+1) * sizeof(mep->args[0]));
-	if(!new_args)
-		return;
-	mep->args = new_args;
-
-	new_ppargs = pp_xrealloc(mep->ppargs, (mep->nargs+1) * sizeof(mep->ppargs[0]));
-	if(!new_ppargs)
-		return;
-	mep->ppargs = new_ppargs;
-
-	new_nnls = pp_xrealloc(mep->nnls, (mep->nargs+1) * sizeof(mep->nnls[0]));
-	if(!new_nnls)
-		return;
-	mep->nnls = new_nnls;
+	mep->args = pp_xrealloc(mep->args, (mep->nargs+1) * sizeof(mep->args[0]));
+	mep->ppargs = pp_xrealloc(mep->ppargs, (mep->nargs+1) * sizeof(mep->ppargs[0]));
+	mep->nnls = pp_xrealloc(mep->nnls, (mep->nargs+1) * sizeof(mep->nnls[0]));
 
 	mep->args[mep->nargs] = pp_xstrdup(mep->curarg ? mep->curarg : "");
-	if(!mep->args[mep->nargs])
-		return;
 	cptr = mep->args[mep->nargs]-1;
 	while((cptr = strchr(cptr+1, '\n')))
 	{
@@ -1580,7 +1539,7 @@
 	if(!fname)
 		return;
 
-	for(iep = pp_includelogiclist; iep; iep = iep->next)
+	LIST_FOR_EACH_ENTRY( iep, &pp_includelogiclist, includelogicentry_t, entry )
 	{
 		if(!strcmp(iep->filename, fname))
 		{
diff --git a/mingw-w64-tools/widl/src/wpp/ppl.yy.c b/mingw-w64-tools/widl/src/wpp/ppl.yy.c
index 98f9272..6fed3bc 100644
--- a/mingw-w64-tools/widl/src/wpp/ppl.yy.c
+++ b/mingw-w64-tools/widl/src/wpp/ppl.yy.c
@@ -1476,7 +1476,7 @@
 
 typedef struct bufferstackentry {
 	YY_BUFFER_STATE	bufferstate;	/* Buffer to switch back to */
-	void		*filehandle;    /* Handle to be used with wpp_callbacks->read */
+	FILE		*file;          /* File handle */
 	pp_entry_t	*define;	/* Points to expanding define or NULL if handling includes */
 	int		line_number;	/* Line that we were handling */
 	int		char_number;	/* The current position on that line */
@@ -1568,7 +1568,7 @@
     0      /* seen_junk */
 };
 
-includelogicentry_t *pp_includelogiclist = NULL;
+struct list pp_includelogiclist = LIST_INIT( pp_includelogiclist );
 
 #define YY_INPUT(buf,result,max_size)					     \
 	{								     \
@@ -1588,8 +1588,6 @@
 	if(buffercapacity == 0)
 	{
 		buffer = pp_xmalloc(BUFFERINITIALCAPACITY);
-		if(buffer == NULL)
-			return;
 		buffercapacity = BUFFERINITIALCAPACITY;
 	}
 
@@ -1622,13 +1620,13 @@
         fwrite(buffer, 1, len, ppy_out);
 }
 
-#line 1625 "libs/wpp/ppl.yy.c"
+#line 1623 "libs/wpp/ppl.yy.c"
 /*
  **************************************************************************
  * The scanner starts here
  **************************************************************************
  */
-#line 1631 "libs/wpp/ppl.yy.c"
+#line 1629 "libs/wpp/ppl.yy.c"
 
 #define INITIAL 0
 #define pp_pp 1
@@ -1878,9 +1876,9 @@
 		}
 
 	{
-#line 367 "libs/wpp/ppl.l"
+#line 365 "libs/wpp/ppl.l"
 
-#line 369 "libs/wpp/ppl.l"
+#line 367 "libs/wpp/ppl.l"
 	/*
 	 * Catch line-continuations.
 	 * Note: Gcc keeps the line-continuations in, for example, strings
@@ -1893,7 +1891,7 @@
 	/*
 	 * Detect the leading # of a preprocessor directive.
 	 */
-#line 1896 "libs/wpp/ppl.yy.c"
+#line 1894 "libs/wpp/ppl.yy.c"
 
 	while ( /*CONSTCOND*/1 )		/* loops until end-of-file is reached */
 		{
@@ -1949,7 +1947,7 @@
 
 case 1:
 YY_RULE_SETUP
-#line 381 "libs/wpp/ppl.l"
+#line 379 "libs/wpp/ppl.l"
 pp_incl_state.seen_junk++; yy_push_state(pp_pp);
 	YY_BREAK
 /*
@@ -1957,104 +1955,104 @@
 	 */
 case 2:
 YY_RULE_SETUP
-#line 386 "libs/wpp/ppl.l"
+#line 384 "libs/wpp/ppl.l"
 if(yy_top_state() != pp_ignore) {yy_pp_state(pp_inc); return tINCLUDE;} else {yy_pp_state(pp_eol);}
 	YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 387 "libs/wpp/ppl.l"
+#line 385 "libs/wpp/ppl.l"
 yy_pp_state(yy_current_state() != pp_ignore ? pp_def : pp_eol);
 	YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 388 "libs/wpp/ppl.l"
+#line 386 "libs/wpp/ppl.l"
 yy_pp_state(pp_eol);	if(yy_top_state() != pp_ignore) return tERROR;
 	YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 389 "libs/wpp/ppl.l"
+#line 387 "libs/wpp/ppl.l"
 yy_pp_state(pp_eol);	if(yy_top_state() != pp_ignore) return tWARNING;
 	YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 390 "libs/wpp/ppl.l"
+#line 388 "libs/wpp/ppl.l"
 yy_pp_state(pp_eol);	if(yy_top_state() != pp_ignore) return tPRAGMA;
 	YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 391 "libs/wpp/ppl.l"
+#line 389 "libs/wpp/ppl.l"
 yy_pp_state(pp_eol);	if(yy_top_state() != pp_ignore) return tPPIDENT;
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 392 "libs/wpp/ppl.l"
+#line 390 "libs/wpp/ppl.l"
 if(yy_top_state() != pp_ignore) {yy_pp_state(pp_ifd); return tUNDEF;} else {yy_pp_state(pp_eol);}
 	YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 393 "libs/wpp/ppl.l"
+#line 391 "libs/wpp/ppl.l"
 yy_pp_state(pp_ifd);	return tIFDEF;
 	YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 394 "libs/wpp/ppl.l"
+#line 392 "libs/wpp/ppl.l"
 pp_incl_state.seen_junk--; yy_pp_state(pp_ifd);	return tIFNDEF;
 	YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 395 "libs/wpp/ppl.l"
+#line 393 "libs/wpp/ppl.l"
 if(yy_top_state() != pp_ignore) {yy_pp_state(pp_if);} else {yy_pp_state(pp_ifignored);} return tIF;
 	YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 396 "libs/wpp/ppl.l"
+#line 394 "libs/wpp/ppl.l"
 yy_pp_state(pp_if);	return tELIF;
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 397 "libs/wpp/ppl.l"
+#line 395 "libs/wpp/ppl.l"
 yy_pp_state(pp_endif);  return tELSE;
 	YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 398 "libs/wpp/ppl.l"
+#line 396 "libs/wpp/ppl.l"
 yy_pp_state(pp_endif);  return tENDIF;
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 399 "libs/wpp/ppl.l"
+#line 397 "libs/wpp/ppl.l"
 if(yy_top_state() != pp_ignore) {yy_pp_state(pp_line); return tLINE;} else {yy_pp_state(pp_eol);}
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 400 "libs/wpp/ppl.l"
+#line 398 "libs/wpp/ppl.l"
 if(yy_top_state() != pp_ignore) {yy_pp_state(pp_line); return tGCCLINE;} else {yy_pp_state(pp_eol);}
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 401 "libs/wpp/ppl.l"
+#line 399 "libs/wpp/ppl.l"
 ppy_error("Invalid preprocessor token '%s'", ppy_text);
 	YY_BREAK
 case 18:
 /* rule 18 can match eol */
 YY_RULE_SETUP
-#line 402 "libs/wpp/ppl.l"
+#line 400 "libs/wpp/ppl.l"
 newline(1); yy_pop_state(); return tNL;	/* This could be the null-token */
 	YY_BREAK
 case 19:
 /* rule 19 can match eol */
 YY_RULE_SETUP
-#line 403 "libs/wpp/ppl.l"
+#line 401 "libs/wpp/ppl.l"
 newline(0);
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 404 "libs/wpp/ppl.l"
+#line 402 "libs/wpp/ppl.l"
 ppy_error("Preprocessor junk '%s'", ppy_text);
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 405 "libs/wpp/ppl.l"
+#line 403 "libs/wpp/ppl.l"
 return *ppy_text;
 	YY_BREAK
 /*
@@ -2062,39 +2060,39 @@
 	 */
 case 22:
 YY_RULE_SETUP
-#line 410 "libs/wpp/ppl.l"
+#line 408 "libs/wpp/ppl.l"
 return make_number(10, &ppy_lval, ppy_text, ppy_leng);
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 411 "libs/wpp/ppl.l"
+#line 409 "libs/wpp/ppl.l"
 new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_iqs);
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 412 "libs/wpp/ppl.l"
+#line 410 "libs/wpp/ppl.l"
 new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_dqs);
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 413 "libs/wpp/ppl.l"
+#line 411 "libs/wpp/ppl.l"
 ;
 	YY_BREAK
 case 26:
 /* rule 26 can match eol */
 YY_RULE_SETUP
-#line 414 "libs/wpp/ppl.l"
+#line 412 "libs/wpp/ppl.l"
 newline(1); yy_pop_state(); return tNL;
 	YY_BREAK
 case 27:
 /* rule 27 can match eol */
 YY_RULE_SETUP
-#line 415 "libs/wpp/ppl.l"
+#line 413 "libs/wpp/ppl.l"
 newline(0);
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 416 "libs/wpp/ppl.l"
+#line 414 "libs/wpp/ppl.l"
 ppy_error(yy_current_state() == pp_inc ? "Trailing junk in #include" : "Trailing junk in #line");
 	YY_BREAK
 /*
@@ -2102,24 +2100,24 @@
 	 */
 case 29:
 YY_RULE_SETUP
-#line 421 "libs/wpp/ppl.l"
+#line 419 "libs/wpp/ppl.l"
 ;
 	YY_BREAK
 case 30:
 /* rule 30 can match eol */
 YY_RULE_SETUP
-#line 422 "libs/wpp/ppl.l"
+#line 420 "libs/wpp/ppl.l"
 newline(1);
 	YY_BREAK
 case 31:
 /* rule 31 can match eol */
 YY_RULE_SETUP
-#line 423 "libs/wpp/ppl.l"
+#line 421 "libs/wpp/ppl.l"
 newline(0);
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 424 "libs/wpp/ppl.l"
+#line 422 "libs/wpp/ppl.l"
 ;
 	YY_BREAK
 /*
@@ -2130,120 +2128,120 @@
 	 */
 case 33:
 YY_RULE_SETUP
-#line 433 "libs/wpp/ppl.l"
+#line 431 "libs/wpp/ppl.l"
 return make_number(8, &ppy_lval, ppy_text, ppy_leng);
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 434 "libs/wpp/ppl.l"
+#line 432 "libs/wpp/ppl.l"
 ppy_error("Invalid octal digit");
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 435 "libs/wpp/ppl.l"
+#line 433 "libs/wpp/ppl.l"
 return make_number(10, &ppy_lval, ppy_text, ppy_leng);
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 436 "libs/wpp/ppl.l"
+#line 434 "libs/wpp/ppl.l"
 return make_number(16, &ppy_lval, ppy_text, ppy_leng);
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 437 "libs/wpp/ppl.l"
+#line 435 "libs/wpp/ppl.l"
 ppy_error("Invalid hex number");
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 438 "libs/wpp/ppl.l"
+#line 436 "libs/wpp/ppl.l"
 yy_push_state(pp_defined); return tDEFINED;
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 439 "libs/wpp/ppl.l"
+#line 437 "libs/wpp/ppl.l"
 return tLSHIFT;
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 440 "libs/wpp/ppl.l"
+#line 438 "libs/wpp/ppl.l"
 return tRSHIFT;
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 441 "libs/wpp/ppl.l"
+#line 439 "libs/wpp/ppl.l"
 return tLOGAND;
 	YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 442 "libs/wpp/ppl.l"
+#line 440 "libs/wpp/ppl.l"
 return tLOGOR;
 	YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 443 "libs/wpp/ppl.l"
+#line 441 "libs/wpp/ppl.l"
 return tEQ;
 	YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 444 "libs/wpp/ppl.l"
+#line 442 "libs/wpp/ppl.l"
 return tNE;
 	YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 445 "libs/wpp/ppl.l"
+#line 443 "libs/wpp/ppl.l"
 return tLTE;
 	YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 446 "libs/wpp/ppl.l"
+#line 444 "libs/wpp/ppl.l"
 return tGTE;
 	YY_BREAK
 case 47:
 /* rule 47 can match eol */
 YY_RULE_SETUP
-#line 447 "libs/wpp/ppl.l"
+#line 445 "libs/wpp/ppl.l"
 newline(1); yy_pop_state(); return tNL;
 	YY_BREAK
 case 48:
 /* rule 48 can match eol */
 YY_RULE_SETUP
-#line 448 "libs/wpp/ppl.l"
+#line 446 "libs/wpp/ppl.l"
 newline(0);
 	YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 449 "libs/wpp/ppl.l"
+#line 447 "libs/wpp/ppl.l"
 ppy_error("Junk in conditional expression");
 	YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 450 "libs/wpp/ppl.l"
+#line 448 "libs/wpp/ppl.l"
 ;
 	YY_BREAK
 case 51:
 YY_RULE_SETUP
-#line 451 "libs/wpp/ppl.l"
+#line 449 "libs/wpp/ppl.l"
 new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_sqs);
 	YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 452 "libs/wpp/ppl.l"
+#line 450 "libs/wpp/ppl.l"
 ppy_error("String constants not allowed in conditionals");
 	YY_BREAK
 case 53:
 YY_RULE_SETUP
-#line 453 "libs/wpp/ppl.l"
+#line 451 "libs/wpp/ppl.l"
 return *ppy_text;
 	YY_BREAK
 case 54:
 YY_RULE_SETUP
-#line 455 "libs/wpp/ppl.l"
+#line 453 "libs/wpp/ppl.l"
 ppy_lval.sint = 0; return tSINT;
 	YY_BREAK
 case 55:
 /* rule 55 can match eol */
 YY_RULE_SETUP
-#line 456 "libs/wpp/ppl.l"
+#line 454 "libs/wpp/ppl.l"
 newline(1); yy_pop_state(); return tNL;
 	YY_BREAK
 /*
@@ -2252,29 +2250,29 @@
 	 */
 case 56:
 YY_RULE_SETUP
-#line 462 "libs/wpp/ppl.l"
+#line 460 "libs/wpp/ppl.l"
 ppy_lval.cptr = pp_xstrdup(ppy_text); return tIDENT;
 	YY_BREAK
 case 57:
 YY_RULE_SETUP
-#line 463 "libs/wpp/ppl.l"
+#line 461 "libs/wpp/ppl.l"
 ;
 	YY_BREAK
 case 58:
 /* rule 58 can match eol */
 YY_RULE_SETUP
-#line 464 "libs/wpp/ppl.l"
+#line 462 "libs/wpp/ppl.l"
 newline(1); yy_pop_state(); return tNL;
 	YY_BREAK
 case 59:
 /* rule 59 can match eol */
 YY_RULE_SETUP
-#line 465 "libs/wpp/ppl.l"
+#line 463 "libs/wpp/ppl.l"
 newline(0);
 	YY_BREAK
 case 60:
 YY_RULE_SETUP
-#line 466 "libs/wpp/ppl.l"
+#line 464 "libs/wpp/ppl.l"
 ppy_error("Identifier expected");
 	YY_BREAK
 /*
@@ -2282,24 +2280,24 @@
 	 */
 case 61:
 YY_RULE_SETUP
-#line 471 "libs/wpp/ppl.l"
+#line 469 "libs/wpp/ppl.l"
 ;
 	YY_BREAK
 case 62:
 /* rule 62 can match eol */
 YY_RULE_SETUP
-#line 472 "libs/wpp/ppl.l"
+#line 470 "libs/wpp/ppl.l"
 newline(1); yy_pop_state(); return tNL;
 	YY_BREAK
 case 63:
 /* rule 63 can match eol */
 YY_RULE_SETUP
-#line 473 "libs/wpp/ppl.l"
+#line 471 "libs/wpp/ppl.l"
 newline(0);
 	YY_BREAK
 case 64:
 YY_RULE_SETUP
-#line 474 "libs/wpp/ppl.l"
+#line 472 "libs/wpp/ppl.l"
 ppy_error("Garbage after #else or #endif.");
 	YY_BREAK
 /*
@@ -2309,29 +2307,29 @@
 	 */
 case 65:
 YY_RULE_SETUP
-#line 481 "libs/wpp/ppl.l"
+#line 479 "libs/wpp/ppl.l"
 yy_pop_state(); ppy_lval.cptr = pp_xstrdup(ppy_text); return tIDENT;
 	YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 482 "libs/wpp/ppl.l"
+#line 480 "libs/wpp/ppl.l"
 ;
 	YY_BREAK
 case 67:
 YY_RULE_SETUP
-#line 483 "libs/wpp/ppl.l"
+#line 481 "libs/wpp/ppl.l"
 return *ppy_text;
 	YY_BREAK
 case 68:
 /* rule 68 can match eol */
 YY_RULE_SETUP
-#line 484 "libs/wpp/ppl.l"
+#line 482 "libs/wpp/ppl.l"
 newline(0);
 	YY_BREAK
 case 69:
 /* rule 69 can match eol */
 YY_RULE_SETUP
-#line 485 "libs/wpp/ppl.l"
+#line 483 "libs/wpp/ppl.l"
 ppy_error("Identifier expected");
 	YY_BREAK
 /*
@@ -2342,30 +2340,30 @@
 	 */
 case 70:
 YY_RULE_SETUP
-#line 493 "libs/wpp/ppl.l"
+#line 491 "libs/wpp/ppl.l"
 if(yy_top_state() != pp_ignore) { ppy_lval.cptr = pp_xstrdup(ppy_text); return tLITERAL; }
 	YY_BREAK
 case 71:
 YY_RULE_SETUP
-#line 494 "libs/wpp/ppl.l"
+#line 492 "libs/wpp/ppl.l"
 if(yy_top_state() != pp_ignore) { ppy_lval.cptr = pp_xstrdup(ppy_text); return tLITERAL; }
 	YY_BREAK
 case 72:
 /* rule 72 can match eol */
 YY_RULE_SETUP
-#line 495 "libs/wpp/ppl.l"
+#line 493 "libs/wpp/ppl.l"
 if(yy_top_state() != pp_ignore) { ppy_lval.cptr = pp_xstrdup(ppy_text); return tLITERAL; }
 	YY_BREAK
 case 73:
 /* rule 73 can match eol */
 YY_RULE_SETUP
-#line 496 "libs/wpp/ppl.l"
+#line 494 "libs/wpp/ppl.l"
 newline(1); yy_pop_state(); if(yy_current_state() != pp_ignore) { return tNL; }
 	YY_BREAK
 case 74:
 /* rule 74 can match eol */
 YY_RULE_SETUP
-#line 497 "libs/wpp/ppl.l"
+#line 495 "libs/wpp/ppl.l"
 newline(0);
 	YY_BREAK
 /*
@@ -2373,29 +2371,29 @@
 	 */
 case 75:
 YY_RULE_SETUP
-#line 502 "libs/wpp/ppl.l"
-ppy_lval.cptr = pp_xstrdup(ppy_text); if(ppy_lval.cptr) ppy_lval.cptr[ppy_leng-1] = '\0'; yy_pp_state(pp_macro);  return tMACRO;
+#line 500 "libs/wpp/ppl.l"
+ppy_lval.cptr = pp_xstrdup(ppy_text); ppy_lval.cptr[ppy_leng-1] = '\0'; yy_pp_state(pp_macro);  return tMACRO;
 	YY_BREAK
 case 76:
 YY_RULE_SETUP
-#line 503 "libs/wpp/ppl.l"
+#line 501 "libs/wpp/ppl.l"
 ppy_lval.cptr = pp_xstrdup(ppy_text); yy_pp_state(pp_define); return tDEFINE;
 	YY_BREAK
 case 77:
 YY_RULE_SETUP
-#line 504 "libs/wpp/ppl.l"
+#line 502 "libs/wpp/ppl.l"
 ;
 	YY_BREAK
 case 78:
 /* rule 78 can match eol */
 YY_RULE_SETUP
-#line 505 "libs/wpp/ppl.l"
+#line 503 "libs/wpp/ppl.l"
 newline(0);
 	YY_BREAK
 case 79:
 /* rule 79 can match eol */
 YY_RULE_SETUP
-#line 506 "libs/wpp/ppl.l"
+#line 504 "libs/wpp/ppl.l"
 perror("Identifier expected");
 	YY_BREAK
 /*
@@ -2403,41 +2401,41 @@
 	 */
 case 80:
 YY_RULE_SETUP
-#line 511 "libs/wpp/ppl.l"
+#line 509 "libs/wpp/ppl.l"
 ppy_lval.cptr = pp_xstrdup(ppy_text); return tLITERAL;
 	YY_BREAK
 case 81:
 /* rule 81 can match eol */
 YY_RULE_SETUP
-#line 512 "libs/wpp/ppl.l"
+#line 510 "libs/wpp/ppl.l"
 ppy_lval.cptr = pp_xstrdup(ppy_text); return tLITERAL;
 	YY_BREAK
 case 82:
 /* rule 82 can match eol */
 YY_RULE_SETUP
-#line 513 "libs/wpp/ppl.l"
+#line 511 "libs/wpp/ppl.l"
 newline(0); ppy_lval.cptr = pp_xstrdup(" "); return tLITERAL;
 	YY_BREAK
 case 83:
 /* rule 83 can match eol */
 YY_RULE_SETUP
-#line 514 "libs/wpp/ppl.l"
+#line 512 "libs/wpp/ppl.l"
 newline(0);
 	YY_BREAK
 case 84:
 /* rule 84 can match eol */
 YY_RULE_SETUP
-#line 515 "libs/wpp/ppl.l"
+#line 513 "libs/wpp/ppl.l"
 newline(1); yy_pop_state(); return tNL;
 	YY_BREAK
 case 85:
 YY_RULE_SETUP
-#line 516 "libs/wpp/ppl.l"
+#line 514 "libs/wpp/ppl.l"
 new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_sqs);
 	YY_BREAK
 case 86:
 YY_RULE_SETUP
-#line 517 "libs/wpp/ppl.l"
+#line 515 "libs/wpp/ppl.l"
 new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_dqs);
 	YY_BREAK
 /*
@@ -2445,39 +2443,39 @@
 	 */
 case 87:
 YY_RULE_SETUP
-#line 522 "libs/wpp/ppl.l"
+#line 520 "libs/wpp/ppl.l"
 yy_pp_state(pp_mbody); return tMACROEND;
 	YY_BREAK
 case 88:
 YY_RULE_SETUP
-#line 523 "libs/wpp/ppl.l"
+#line 521 "libs/wpp/ppl.l"
 ;
 	YY_BREAK
 case 89:
 YY_RULE_SETUP
-#line 524 "libs/wpp/ppl.l"
+#line 522 "libs/wpp/ppl.l"
 ppy_lval.cptr = pp_xstrdup(ppy_text); return tIDENT;
 	YY_BREAK
 case 90:
 YY_RULE_SETUP
-#line 525 "libs/wpp/ppl.l"
+#line 523 "libs/wpp/ppl.l"
 return ',';
 	YY_BREAK
 case 91:
 YY_RULE_SETUP
-#line 526 "libs/wpp/ppl.l"
+#line 524 "libs/wpp/ppl.l"
 return tELLIPSIS;
 	YY_BREAK
 case 92:
 /* rule 92 can match eol */
 YY_RULE_SETUP
-#line 527 "libs/wpp/ppl.l"
+#line 525 "libs/wpp/ppl.l"
 ppy_error("Argument identifier expected");
 	YY_BREAK
 case 93:
 /* rule 93 can match eol */
 YY_RULE_SETUP
-#line 528 "libs/wpp/ppl.l"
+#line 526 "libs/wpp/ppl.l"
 newline(0);
 	YY_BREAK
 /*
@@ -2485,60 +2483,60 @@
 	 */
 case 94:
 YY_RULE_SETUP
-#line 533 "libs/wpp/ppl.l"
+#line 531 "libs/wpp/ppl.l"
 ppy_lval.cptr = pp_xstrdup(ppy_text); return tLITERAL;
 	YY_BREAK
 case 95:
 YY_RULE_SETUP
-#line 534 "libs/wpp/ppl.l"
+#line 532 "libs/wpp/ppl.l"
 ppy_lval.cptr = pp_xstrdup(ppy_text); return tIDENT;
 	YY_BREAK
 case 96:
 YY_RULE_SETUP
-#line 535 "libs/wpp/ppl.l"
+#line 533 "libs/wpp/ppl.l"
 return tCONCAT;
 	YY_BREAK
 case 97:
 YY_RULE_SETUP
-#line 536 "libs/wpp/ppl.l"
+#line 534 "libs/wpp/ppl.l"
 return tSTRINGIZE;
 	YY_BREAK
 case 98:
 YY_RULE_SETUP
-#line 537 "libs/wpp/ppl.l"
+#line 535 "libs/wpp/ppl.l"
 ppy_lval.cptr = pp_xstrdup(ppy_text); return tLITERAL;
 	YY_BREAK
 case 99:
 YY_RULE_SETUP
-#line 538 "libs/wpp/ppl.l"
+#line 536 "libs/wpp/ppl.l"
 ppy_lval.cptr = pp_xstrdup(ppy_text); return tLITERAL;
 	YY_BREAK
 case 100:
 /* rule 100 can match eol */
 YY_RULE_SETUP
-#line 539 "libs/wpp/ppl.l"
+#line 537 "libs/wpp/ppl.l"
 newline(0); ppy_lval.cptr = pp_xstrdup(" "); return tLITERAL;
 	YY_BREAK
 case 101:
 /* rule 101 can match eol */
 YY_RULE_SETUP
-#line 540 "libs/wpp/ppl.l"
+#line 538 "libs/wpp/ppl.l"
 newline(0);
 	YY_BREAK
 case 102:
 /* rule 102 can match eol */
 YY_RULE_SETUP
-#line 541 "libs/wpp/ppl.l"
+#line 539 "libs/wpp/ppl.l"
 newline(1); yy_pop_state(); return tNL;
 	YY_BREAK
 case 103:
 YY_RULE_SETUP
-#line 542 "libs/wpp/ppl.l"
+#line 540 "libs/wpp/ppl.l"
 new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_sqs);
 	YY_BREAK
 case 104:
 YY_RULE_SETUP
-#line 543 "libs/wpp/ppl.l"
+#line 541 "libs/wpp/ppl.l"
 new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_dqs);
 	YY_BREAK
 /*
@@ -2555,13 +2553,13 @@
 (yy_c_buf_p) = yy_cp -= 1;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 554 "libs/wpp/ppl.l"
+#line 552 "libs/wpp/ppl.l"
 yy_pp_state(pp_macscan);
 	YY_BREAK
 case 106:
 /* rule 106 can match eol */
 YY_RULE_SETUP
-#line 555 "libs/wpp/ppl.l"
+#line 553 "libs/wpp/ppl.l"
 {
 		if(yy_top_state() != pp_macscan)
 			newline(0);
@@ -2570,12 +2568,12 @@
 case 107:
 /* rule 107 can match eol */
 YY_RULE_SETUP
-#line 559 "libs/wpp/ppl.l"
+#line 557 "libs/wpp/ppl.l"
 newline(0);
 	YY_BREAK
 case 108:
 YY_RULE_SETUP
-#line 560 "libs/wpp/ppl.l"
+#line 558 "libs/wpp/ppl.l"
 {
 		macexpstackentry_t *mac = pop_macro();
 		yy_pop_state();
@@ -2590,7 +2588,7 @@
 	 */
 case 109:
 YY_RULE_SETUP
-#line 572 "libs/wpp/ppl.l"
+#line 570 "libs/wpp/ppl.l"
 {
 		if(++MACROPARENTHESES() > 1)
 			add_text_to_macro(ppy_text, ppy_leng);
@@ -2598,7 +2596,7 @@
 	YY_BREAK
 case 110:
 YY_RULE_SETUP
-#line 576 "libs/wpp/ppl.l"
+#line 574 "libs/wpp/ppl.l"
 {
 		if(--MACROPARENTHESES() == 0)
 		{
@@ -2611,7 +2609,7 @@
 	YY_BREAK
 case 111:
 YY_RULE_SETUP
-#line 585 "libs/wpp/ppl.l"
+#line 583 "libs/wpp/ppl.l"
 {
 		if(MACROPARENTHESES() > 1)
 			add_text_to_macro(ppy_text, ppy_leng);
@@ -2621,34 +2619,34 @@
 	YY_BREAK
 case 112:
 YY_RULE_SETUP
-#line 591 "libs/wpp/ppl.l"
+#line 589 "libs/wpp/ppl.l"
 new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_dqs);
 	YY_BREAK
 case 113:
 YY_RULE_SETUP
-#line 592 "libs/wpp/ppl.l"
+#line 590 "libs/wpp/ppl.l"
 new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_sqs);
 	YY_BREAK
 case 114:
 YY_RULE_SETUP
-#line 593 "libs/wpp/ppl.l"
+#line 591 "libs/wpp/ppl.l"
 yy_push_state(pp_comment); add_text_to_macro(" ", 1);
 	YY_BREAK
 case 115:
 /* rule 115 can match eol */
 YY_RULE_SETUP
-#line 594 "libs/wpp/ppl.l"
+#line 592 "libs/wpp/ppl.l"
 pp_status.line_number++; pp_status.char_number = 1; add_text_to_macro(ppy_text, ppy_leng);
 	YY_BREAK
 case 116:
 YY_RULE_SETUP
-#line 595 "libs/wpp/ppl.l"
+#line 593 "libs/wpp/ppl.l"
 add_text_to_macro(ppy_text, ppy_leng);
 	YY_BREAK
 case 117:
 /* rule 117 can match eol */
 YY_RULE_SETUP
-#line 596 "libs/wpp/ppl.l"
+#line 594 "libs/wpp/ppl.l"
 newline(0);
 	YY_BREAK
 /*
@@ -2656,23 +2654,23 @@
 	 */
 case 118:
 YY_RULE_SETUP
-#line 601 "libs/wpp/ppl.l"
+#line 599 "libs/wpp/ppl.l"
 yy_push_state(pp_comment);
 	YY_BREAK
 case 119:
 YY_RULE_SETUP
-#line 602 "libs/wpp/ppl.l"
+#line 600 "libs/wpp/ppl.l"
 ;
 	YY_BREAK
 case 120:
 /* rule 120 can match eol */
 YY_RULE_SETUP
-#line 603 "libs/wpp/ppl.l"
+#line 601 "libs/wpp/ppl.l"
 newline(0);
 	YY_BREAK
 case 121:
 YY_RULE_SETUP
-#line 604 "libs/wpp/ppl.l"
+#line 602 "libs/wpp/ppl.l"
 yy_pop_state();
 	YY_BREAK
 /*
@@ -2680,7 +2678,7 @@
 	 */
 case 122:
 YY_RULE_SETUP
-#line 609 "libs/wpp/ppl.l"
+#line 607 "libs/wpp/ppl.l"
 {
 		if(ppy_text[ppy_leng-1] == '\\')
 			ppy_warning("C++ style comment ends with an escaped newline (escape ignored)");
@@ -2691,22 +2689,22 @@
 	 */
 case 123:
 YY_RULE_SETUP
-#line 617 "libs/wpp/ppl.l"
+#line 615 "libs/wpp/ppl.l"
 pp_incl_state.seen_junk++; new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_dqs);
 	YY_BREAK
 case 124:
 YY_RULE_SETUP
-#line 618 "libs/wpp/ppl.l"
+#line 616 "libs/wpp/ppl.l"
 pp_incl_state.seen_junk++; new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_sqs);
 	YY_BREAK
 case 125:
 YY_RULE_SETUP
-#line 619 "libs/wpp/ppl.l"
+#line 617 "libs/wpp/ppl.l"
 add_string(ppy_text, ppy_leng);
 	YY_BREAK
 case 126:
 YY_RULE_SETUP
-#line 620 "libs/wpp/ppl.l"
+#line 618 "libs/wpp/ppl.l"
 {
 		add_string(ppy_text, ppy_leng);
 		yy_pop_state();
@@ -2730,12 +2728,12 @@
 	YY_BREAK
 case 127:
 YY_RULE_SETUP
-#line 640 "libs/wpp/ppl.l"
+#line 638 "libs/wpp/ppl.l"
 add_string(ppy_text, ppy_leng);
 	YY_BREAK
 case 128:
 YY_RULE_SETUP
-#line 641 "libs/wpp/ppl.l"
+#line 639 "libs/wpp/ppl.l"
 {
 		add_string(ppy_text, ppy_leng);
 		yy_pop_state();
@@ -2753,12 +2751,12 @@
 	YY_BREAK
 case 129:
 YY_RULE_SETUP
-#line 655 "libs/wpp/ppl.l"
+#line 653 "libs/wpp/ppl.l"
 add_string(ppy_text, ppy_leng);
 	YY_BREAK
 case 130:
 YY_RULE_SETUP
-#line 656 "libs/wpp/ppl.l"
+#line 654 "libs/wpp/ppl.l"
 {
 		add_string(ppy_text, ppy_leng);
 		yy_pop_state();
@@ -2769,7 +2767,7 @@
 case 131:
 /* rule 131 can match eol */
 YY_RULE_SETUP
-#line 662 "libs/wpp/ppl.l"
+#line 660 "libs/wpp/ppl.l"
 {
 		/*
 		 * This is tricky; we need to remove the line-continuation
@@ -2797,13 +2795,13 @@
 	YY_BREAK
 case 132:
 YY_RULE_SETUP
-#line 686 "libs/wpp/ppl.l"
+#line 684 "libs/wpp/ppl.l"
 add_string(ppy_text, ppy_leng);
 	YY_BREAK
 case 133:
 /* rule 133 can match eol */
 YY_RULE_SETUP
-#line 687 "libs/wpp/ppl.l"
+#line 685 "libs/wpp/ppl.l"
 {
 		newline(1);
 		add_string(ppy_text, ppy_leng);
@@ -2815,7 +2813,7 @@
 	 */
 case 134:
 YY_RULE_SETUP
-#line 696 "libs/wpp/ppl.l"
+#line 694 "libs/wpp/ppl.l"
 {
 		pp_entry_t *ppp;
 		pp_incl_state.seen_junk++;
@@ -2864,29 +2862,29 @@
 	 */
 case 135:
 YY_RULE_SETUP
-#line 742 "libs/wpp/ppl.l"
+#line 740 "libs/wpp/ppl.l"
 pp_incl_state.seen_junk++; put_buffer(ppy_text, ppy_leng);
 	YY_BREAK
 case 136:
 YY_RULE_SETUP
-#line 743 "libs/wpp/ppl.l"
+#line 741 "libs/wpp/ppl.l"
 put_buffer(ppy_text, ppy_leng);
 	YY_BREAK
 case 137:
 /* rule 137 can match eol */
 YY_RULE_SETUP
-#line 744 "libs/wpp/ppl.l"
+#line 742 "libs/wpp/ppl.l"
 newline(1);
 	YY_BREAK
 case 138:
 /* rule 138 can match eol */
 YY_RULE_SETUP
-#line 745 "libs/wpp/ppl.l"
+#line 743 "libs/wpp/ppl.l"
 newline(0);
 	YY_BREAK
 case 139:
 YY_RULE_SETUP
-#line 746 "libs/wpp/ppl.l"
+#line 744 "libs/wpp/ppl.l"
 pp_incl_state.seen_junk++; put_buffer(ppy_text, ppy_leng);
 	YY_BREAK
 /*
@@ -2896,12 +2894,12 @@
 case 140:
 /* rule 140 can match eol */
 YY_RULE_SETUP
-#line 752 "libs/wpp/ppl.l"
+#line 750 "libs/wpp/ppl.l"
 put_buffer(ppy_text, ppy_leng);
 	YY_BREAK
 case 141:
 YY_RULE_SETUP
-#line 754 "libs/wpp/ppl.l"
+#line 752 "libs/wpp/ppl.l"
 {
 		ppy_lval.cptr=pp_xstrdup(ppy_text);
         	yy_pop_state();
@@ -2910,12 +2908,12 @@
 	YY_BREAK
 case 142:
 YY_RULE_SETUP
-#line 760 "libs/wpp/ppl.l"
+#line 758 "libs/wpp/ppl.l"
 ;
 	YY_BREAK
 case 143:
 YY_RULE_SETUP
-#line 762 "libs/wpp/ppl.l"
+#line 760 "libs/wpp/ppl.l"
 {
 		new_string(); add_string(ppy_text,ppy_leng);yy_push_state(pp_dqs);
 	}
@@ -2926,7 +2924,7 @@
 	 */
 case 144:
 YY_RULE_SETUP
-#line 770 "libs/wpp/ppl.l"
+#line 768 "libs/wpp/ppl.l"
 pp_incl_state.seen_junk++; ppy_warning("Unmatched text '%c' (0x%02x); please report\n", isprint(*ppy_text & 0xff) ? *ppy_text : ' ', *ppy_text);
 	YY_BREAK
 case YY_STATE_EOF(INITIAL):
@@ -2952,7 +2950,7 @@
 case YY_STATE_EOF(pp_defined):
 case YY_STATE_EOF(pp_ignore):
 case YY_STATE_EOF(RCINCL):
-#line 772 "libs/wpp/ppl.l"
+#line 770 "libs/wpp/ppl.l"
 {
 		YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
 		bufferstackentry_t *bep = pop_buffer();
@@ -2980,10 +2978,10 @@
 	YY_BREAK
 case 145:
 YY_RULE_SETUP
-#line 797 "libs/wpp/ppl.l"
+#line 795 "libs/wpp/ppl.l"
 ECHO;
 	YY_BREAK
-#line 2986 "libs/wpp/ppl.yy.c"
+#line 2984 "libs/wpp/ppl.yy.c"
 
 	case YY_END_OF_BUFFER:
 		{
@@ -3999,7 +3997,7 @@
 
 #define YYTABLES_NAME "yytables"
 
-#line 797 "libs/wpp/ppl.l"
+#line 795 "libs/wpp/ppl.l"
 
 /*
  **************************************************************************
@@ -4058,10 +4056,6 @@
  *
  * FIXME:
  * The sizes of resulting 'int' and 'long' are compiler specific.
- * I depend on sizeof(int) > 2 here (although a relatively safe
- * assumption).
- * Long longs are not yet implemented because this is very compiler
- * specific and I don't want to think too much about the problems.
  *
  *-------------------------------------------------------------------------
  */
@@ -4432,10 +4426,6 @@
  */
 static void new_string(void)
 {
-#ifdef DEBUG
-	if(strbuf_idx)
-		ppy_warning("new_string: strbuf_idx != 0");
-#endif
 	strbuf_idx = 0;
 	str_startline = pp_status.line_number;
 }
@@ -4465,22 +4455,15 @@
 static char *get_string(void)
 {
 	char *str = pp_xmalloc(strbuf_idx + 1);
-	if(!str)
-		return NULL;
+
 	memcpy(str, strbuffer, strbuf_idx);
 	str[strbuf_idx] = '\0';
-#ifdef DEBUG
-	strbuf_idx = 0;
-#endif
 	return str;
 }
 
 static void put_string(void)
 {
 	put_buffer(strbuffer, strbuf_idx);
-#ifdef DEBUG
-	strbuf_idx = 0;
-#endif
 }
 
 static int string_start(void)
@@ -4503,7 +4486,7 @@
 
 	memset(&bufferstack[bufferstackidx], 0, sizeof(bufferstack[0]));
 	bufferstack[bufferstackidx].bufferstate	= YY_CURRENT_BUFFER;
-	bufferstack[bufferstackidx].filehandle  = pp_status.file;
+	bufferstack[bufferstackidx].file        = pp_status.file;
 	bufferstack[bufferstackidx].define	= ppp;
 	bufferstack[bufferstackidx].line_number	= pp_status.line_number;
 	bufferstack[bufferstackidx].char_number	= pp_status.char_number;
@@ -4557,20 +4540,13 @@
 				if(ppp)
 				{
 					iep = pp_xmalloc(sizeof(includelogicentry_t));
-					if (iep)
-					{
-						iep->ppp = ppp;
-						ppp->iep = iep;
-						iep->filename = bufferstack[bufferstackidx].include_filename;
-						iep->prev = NULL;
-						iep->next = pp_includelogiclist;
-						if(iep->next)
-							iep->next->prev = iep;
-						pp_includelogiclist = iep;
-						if(pp_status.debug)
-							fprintf(stderr, "pop_buffer: %s:%d: includelogic added, include_ppp='%s', file='%s'\n",
-                                                                bufferstack[bufferstackidx].filename, bufferstack[bufferstackidx].line_number, pp_incl_state.ppp, iep->filename);
-					}
+					iep->ppp = ppp;
+					ppp->iep = iep;
+					iep->filename = bufferstack[bufferstackidx].include_filename;
+                                        list_add_head( &pp_includelogiclist, &iep->entry );
+					if(pp_status.debug)
+						fprintf(stderr, "pop_buffer: %s:%d: includelogic added, include_ppp='%s', file='%s'\n",
+                                                        bufferstack[bufferstackidx].filename, bufferstack[bufferstackidx].line_number, pp_incl_state.ppp, iep->filename);
 				}
 			}
 			free(pp_incl_state.ppp);
@@ -4600,7 +4576,7 @@
 			bufferstack[bufferstackidx].filename,
 			bufferstack[bufferstackidx].should_pop);
 
-	pp_status.file = bufferstack[bufferstackidx].filehandle;
+	pp_status.file = bufferstack[bufferstackidx].file;
 	ppy__switch_to_buffer(bufferstack[bufferstackidx].bufferstate);
 
 	if(bufferstack[bufferstackidx].should_pop)
@@ -4630,8 +4606,6 @@
 	}
 
 	macexpstack[macexpstackidx] = pp_xmalloc(sizeof(macexpstack[0][0]));
-	if(!macexpstack[macexpstackidx])
-		return;
         memset( macexpstack[macexpstackidx], 0, sizeof(macexpstack[0][0]));
 	macexpstack[macexpstackidx]->ppp = ppp;
 	macexpstackidx++;
@@ -4686,30 +4660,15 @@
 {
 	int nnl = 0;
 	char *cptr;
-	char **new_args, **new_ppargs;
-	int *new_nnls;
 	macexpstackentry_t *mep = top_macro();
 
 	assert(mep->ppp->expanding == 0);
 
-	new_args = pp_xrealloc(mep->args, (mep->nargs+1) * sizeof(mep->args[0]));
-	if(!new_args)
-		return;
-	mep->args = new_args;
-
-	new_ppargs = pp_xrealloc(mep->ppargs, (mep->nargs+1) * sizeof(mep->ppargs[0]));
-	if(!new_ppargs)
-		return;
-	mep->ppargs = new_ppargs;
-
-	new_nnls = pp_xrealloc(mep->nnls, (mep->nargs+1) * sizeof(mep->nnls[0]));
-	if(!new_nnls)
-		return;
-	mep->nnls = new_nnls;
+	mep->args = pp_xrealloc(mep->args, (mep->nargs+1) * sizeof(mep->args[0]));
+	mep->ppargs = pp_xrealloc(mep->ppargs, (mep->nargs+1) * sizeof(mep->ppargs[0]));
+	mep->nnls = pp_xrealloc(mep->nnls, (mep->nargs+1) * sizeof(mep->nnls[0]));
 
 	mep->args[mep->nargs] = pp_xstrdup(mep->curarg ? mep->curarg : "");
-	if(!mep->args[mep->nargs])
-		return;
 	cptr = mep->args[mep->nargs]-1;
 	while((cptr = strchr(cptr+1, '\n')))
 	{
@@ -4787,7 +4746,7 @@
 	if(!fname)
 		return;
 
-	for(iep = pp_includelogiclist; iep; iep = iep->next)
+	LIST_FOR_EACH_ENTRY( iep, &pp_includelogiclist, includelogicentry_t, entry )
 	{
 		if(!strcmp(iep->filename, fname))
 		{
diff --git a/mingw-w64-tools/widl/src/wpp/ppy.tab.c b/mingw-w64-tools/widl/src/wpp/ppy.tab.c
index d6a254f..fdc9a06 100644
--- a/mingw-w64-tools/widl/src/wpp/ppy.tab.c
+++ b/mingw-w64-tools/widl/src/wpp/ppy.tab.c
@@ -1,4 +1,4 @@
-/* A Bison parser, made by GNU Bison 3.7.2.  */
+/* A Bison parser, made by GNU Bison 3.7.4.  */
 
 /* Bison implementation for Yacc-like parsers in C
 
@@ -45,11 +45,11 @@
    define necessary library symbols; they are noted "INFRINGES ON
    USER NAME SPACE" below.  */
 
-/* Identify Bison output.  */
-#define YYBISON 1
+/* Identify Bison output, and Bison version.  */
+#define YYBISON 30704
 
-/* Bison version.  */
-#define YYBISON_VERSION "3.7.2"
+/* Bison version string.  */
+#define YYBISON_VERSION "3.7.4"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -156,8 +156,7 @@
 static void cast_to_ulong(cval_t *v);
 static void cast_to_sll(cval_t *v);
 static void cast_to_ull(cval_t *v);
-static marg_t *new_marg(char *str, def_arg_t type);
-static marg_t *add_new_marg(char *str, def_arg_t type);
+static char *add_new_marg(char *str);
 static int marg_index(char *id);
 static mtext_t *new_mtext(char *str, int idx, def_exp_t type);
 static mtext_t *combine_mtext(mtext_t *tail, mtext_t *mtp);
@@ -166,11 +165,11 @@
 /*
  * Local variables
  */
-static marg_t **macro_args;	/* Macro parameters array while parsing */
+static char   **macro_args;	/* Macro parameters array while parsing */
 static int	nmacro_args;
 
 
-#line 174 "libs/wpp/ppy.tab.c"
+#line 173 "libs/wpp/ppy.tab.c"
 
 # ifndef YY_CAST
 #  ifdef __cplusplus
@@ -262,7 +261,7 @@
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 126 "libs/wpp/ppy.y"
+#line 125 "libs/wpp/ppy.y"
 
 	int		sint;
 	unsigned int	uint;
@@ -273,10 +272,10 @@
 	int		*iptr;
 	char		*cptr;
 	cval_t		cval;
-	marg_t		*marg;
+	char		*marg;
 	mtext_t		*mtext;
 
-#line 280 "libs/wpp/ppy.tab.c"
+#line 279 "libs/wpp/ppy.tab.c"
 
 };
 typedef union YYSTYPE YYSTYPE;
@@ -741,15 +740,15 @@
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,   181,   181,   182,   186,   187,   188,   189,   190,   210,
-     234,   260,   277,   278,   279,   282,   283,   284,   286,   288,
-     290,   292,   293,   294,   295,   296,   297,   310,   316,   317,
-     320,   321,   322,   323,   324,   325,   328,   331,   332,   335,
-     336,   339,   340,   344,   345,   351,   352,   355,   356,   357,
-     358,   359,   366,   375,   376,   377,   378,   379,   380,   381,
-     382,   383,   384,   385,   386,   387,   388,   389,   390,   391,
-     392,   393,   394,   395,   396,   397,   398,   399,   400,   401,
-     402,   403,   404,   405,   406
+       0,   180,   180,   181,   185,   186,   187,   188,   189,   209,
+     233,   259,   276,   277,   278,   281,   282,   283,   285,   287,
+     289,   291,   292,   293,   294,   295,   296,   303,   309,   310,
+     313,   314,   315,   316,   317,   318,   321,   324,   325,   328,
+     329,   332,   333,   337,   338,   344,   345,   348,   349,   350,
+     351,   352,   359,   368,   369,   370,   371,   372,   373,   374,
+     375,   376,   377,   378,   379,   380,   381,   382,   383,   384,
+     385,   386,   387,   388,   389,   390,   391,   392,   393,   394,
+     395,   396,   397,   398,   399
 };
 #endif
 
@@ -1458,31 +1457,31 @@
   switch (yyn)
     {
   case 4: /* preprocessor: tINCLUDE tDQSTRING tNL  */
-#line 186 "libs/wpp/ppy.y"
+#line 185 "libs/wpp/ppy.y"
                                         { pp_do_include((yyvsp[-1].cptr), 1); }
-#line 1464 "libs/wpp/ppy.tab.c"
+#line 1463 "libs/wpp/ppy.tab.c"
     break;
 
   case 5: /* preprocessor: tINCLUDE tIQSTRING tNL  */
-#line 187 "libs/wpp/ppy.y"
+#line 186 "libs/wpp/ppy.y"
                                         { pp_do_include((yyvsp[-1].cptr), 0); }
-#line 1470 "libs/wpp/ppy.tab.c"
+#line 1469 "libs/wpp/ppy.tab.c"
     break;
 
   case 6: /* preprocessor: tIF pp_expr tNL  */
-#line 188 "libs/wpp/ppy.y"
+#line 187 "libs/wpp/ppy.y"
                                 { pp_next_if_state(boolean(&(yyvsp[-1].cval))); }
-#line 1476 "libs/wpp/ppy.tab.c"
+#line 1475 "libs/wpp/ppy.tab.c"
     break;
 
   case 7: /* preprocessor: tIFDEF tIDENT tNL  */
-#line 189 "libs/wpp/ppy.y"
+#line 188 "libs/wpp/ppy.y"
                                 { pp_next_if_state(pplookup((yyvsp[-1].cptr)) != NULL); free((yyvsp[-1].cptr)); }
-#line 1482 "libs/wpp/ppy.tab.c"
+#line 1481 "libs/wpp/ppy.tab.c"
     break;
 
   case 8: /* preprocessor: tIFNDEF tIDENT tNL  */
-#line 190 "libs/wpp/ppy.y"
+#line 189 "libs/wpp/ppy.y"
                                 {
 		int t = pplookup((yyvsp[-1].cptr)) == NULL;
 		if(pp_incl_state.state == 0 && t && !pp_incl_state.seen_junk)
@@ -1503,11 +1502,11 @@
 			fprintf(stderr, "tIFNDEF: %s:%d: include_state=%d, include_ppp='%s', include_ifdepth=%d\n",
                                 pp_status.input, pp_status.line_number, pp_incl_state.state, pp_incl_state.ppp, pp_incl_state.ifdepth);
 		}
-#line 1507 "libs/wpp/ppy.tab.c"
+#line 1506 "libs/wpp/ppy.tab.c"
     break;
 
   case 9: /* preprocessor: tELIF pp_expr tNL  */
-#line 210 "libs/wpp/ppy.y"
+#line 209 "libs/wpp/ppy.y"
                                 {
 		pp_if_state_t s = pp_pop_if();
 		switch(s)
@@ -1532,11 +1531,11 @@
 			pp_internal_error(__FILE__, __LINE__, "Invalid pp_if_state (%d) in #elif directive", s);
 		}
 		}
-#line 1536 "libs/wpp/ppy.tab.c"
+#line 1535 "libs/wpp/ppy.tab.c"
     break;
 
   case 10: /* preprocessor: tELSE tNL  */
-#line 234 "libs/wpp/ppy.y"
+#line 233 "libs/wpp/ppy.y"
                                 {
 		pp_if_state_t s = pp_pop_if();
 		switch(s)
@@ -1563,11 +1562,11 @@
 			pp_internal_error(__FILE__, __LINE__, "Invalid pp_if_state (%d) in #else directive", s);
 		}
 		}
-#line 1567 "libs/wpp/ppy.tab.c"
+#line 1566 "libs/wpp/ppy.tab.c"
     break;
 
   case 11: /* preprocessor: tENDIF tNL  */
-#line 260 "libs/wpp/ppy.y"
+#line 259 "libs/wpp/ppy.y"
                                 {
 		if(pp_pop_if() != if_error)
 		{
@@ -1585,258 +1584,252 @@
 					pp_status.input, pp_status.line_number, pp_incl_state.state, pp_incl_state.ppp, pp_incl_state.ifdepth);
 		}
 		}
-#line 1589 "libs/wpp/ppy.tab.c"
+#line 1588 "libs/wpp/ppy.tab.c"
     break;
 
   case 12: /* preprocessor: tUNDEF tIDENT tNL  */
-#line 277 "libs/wpp/ppy.y"
+#line 276 "libs/wpp/ppy.y"
                                 { pp_del_define((yyvsp[-1].cptr)); free((yyvsp[-1].cptr)); }
-#line 1595 "libs/wpp/ppy.tab.c"
+#line 1594 "libs/wpp/ppy.tab.c"
     break;
 
   case 13: /* preprocessor: tDEFINE opt_text tNL  */
-#line 278 "libs/wpp/ppy.y"
+#line 277 "libs/wpp/ppy.y"
                                 { pp_add_define((yyvsp[-2].cptr), (yyvsp[-1].cptr)); free((yyvsp[-2].cptr)); free((yyvsp[-1].cptr)); }
-#line 1601 "libs/wpp/ppy.tab.c"
+#line 1600 "libs/wpp/ppy.tab.c"
     break;
 
   case 14: /* preprocessor: tMACRO res_arg allmargs tMACROEND opt_mtexts tNL  */
-#line 279 "libs/wpp/ppy.y"
+#line 278 "libs/wpp/ppy.y"
                                                                 {
 		pp_add_macro((yyvsp[-5].cptr), macro_args, nmacro_args, (yyvsp[-1].mtext));
 		}
-#line 1609 "libs/wpp/ppy.tab.c"
+#line 1608 "libs/wpp/ppy.tab.c"
     break;
 
   case 15: /* preprocessor: tLINE tSINT tDQSTRING tNL  */
-#line 282 "libs/wpp/ppy.y"
+#line 281 "libs/wpp/ppy.y"
                                         { if((yyvsp[-1].cptr)) pp_writestring("# %d %s\n", (yyvsp[-2].sint) , (yyvsp[-1].cptr)); free((yyvsp[-1].cptr)); }
-#line 1615 "libs/wpp/ppy.tab.c"
+#line 1614 "libs/wpp/ppy.tab.c"
     break;
 
   case 16: /* preprocessor: tGCCLINE tSINT tDQSTRING tNL  */
-#line 283 "libs/wpp/ppy.y"
+#line 282 "libs/wpp/ppy.y"
                                         { if((yyvsp[-1].cptr)) pp_writestring("# %d %s\n", (yyvsp[-2].sint) , (yyvsp[-1].cptr)); free((yyvsp[-1].cptr)); }
-#line 1621 "libs/wpp/ppy.tab.c"
+#line 1620 "libs/wpp/ppy.tab.c"
     break;
 
   case 17: /* preprocessor: tGCCLINE tSINT tDQSTRING tSINT tNL  */
-#line 285 "libs/wpp/ppy.y"
+#line 284 "libs/wpp/ppy.y"
                 { if((yyvsp[-2].cptr)) pp_writestring("# %d %s %d\n", (yyvsp[-3].sint), (yyvsp[-2].cptr), (yyvsp[-1].sint)); free((yyvsp[-2].cptr)); }
-#line 1627 "libs/wpp/ppy.tab.c"
+#line 1626 "libs/wpp/ppy.tab.c"
     break;
 
   case 18: /* preprocessor: tGCCLINE tSINT tDQSTRING tSINT tSINT tNL  */
-#line 287 "libs/wpp/ppy.y"
+#line 286 "libs/wpp/ppy.y"
                 { if((yyvsp[-3].cptr)) pp_writestring("# %d %s %d %d\n", (yyvsp[-4].sint) ,(yyvsp[-3].cptr), (yyvsp[-2].sint), (yyvsp[-1].sint)); free((yyvsp[-3].cptr)); }
-#line 1633 "libs/wpp/ppy.tab.c"
+#line 1632 "libs/wpp/ppy.tab.c"
     break;
 
   case 19: /* preprocessor: tGCCLINE tSINT tDQSTRING tSINT tSINT tSINT tNL  */
-#line 289 "libs/wpp/ppy.y"
+#line 288 "libs/wpp/ppy.y"
                 { if((yyvsp[-4].cptr)) pp_writestring("# %d %s %d %d %d\n", (yyvsp[-5].sint) ,(yyvsp[-4].cptr) ,(yyvsp[-3].sint) ,(yyvsp[-2].sint), (yyvsp[-1].sint)); free((yyvsp[-4].cptr)); }
-#line 1639 "libs/wpp/ppy.tab.c"
+#line 1638 "libs/wpp/ppy.tab.c"
     break;
 
   case 20: /* preprocessor: tGCCLINE tSINT tDQSTRING tSINT tSINT tSINT tSINT tNL  */
-#line 291 "libs/wpp/ppy.y"
+#line 290 "libs/wpp/ppy.y"
                 { if((yyvsp[-5].cptr)) pp_writestring("# %d %s %d %d %d %d\n", (yyvsp[-6].sint) ,(yyvsp[-5].cptr) ,(yyvsp[-4].sint) ,(yyvsp[-3].sint), (yyvsp[-2].sint), (yyvsp[-1].sint)); free((yyvsp[-5].cptr)); }
-#line 1645 "libs/wpp/ppy.tab.c"
+#line 1644 "libs/wpp/ppy.tab.c"
     break;
 
   case 22: /* preprocessor: tERROR opt_text tNL  */
-#line 293 "libs/wpp/ppy.y"
+#line 292 "libs/wpp/ppy.y"
                                 { ppy_error("#error directive: '%s'", (yyvsp[-1].cptr)); free((yyvsp[-1].cptr)); }
-#line 1651 "libs/wpp/ppy.tab.c"
+#line 1650 "libs/wpp/ppy.tab.c"
     break;
 
   case 23: /* preprocessor: tWARNING opt_text tNL  */
-#line 294 "libs/wpp/ppy.y"
+#line 293 "libs/wpp/ppy.y"
                                 { ppy_warning("#warning directive: '%s'", (yyvsp[-1].cptr)); free((yyvsp[-1].cptr)); }
-#line 1657 "libs/wpp/ppy.tab.c"
+#line 1656 "libs/wpp/ppy.tab.c"
     break;
 
   case 24: /* preprocessor: tPRAGMA opt_text tNL  */
-#line 295 "libs/wpp/ppy.y"
+#line 294 "libs/wpp/ppy.y"
                                 { pp_writestring("#pragma %s\n", (yyvsp[-1].cptr) ? (yyvsp[-1].cptr) : ""); free((yyvsp[-1].cptr)); }
-#line 1663 "libs/wpp/ppy.tab.c"
+#line 1662 "libs/wpp/ppy.tab.c"
     break;
 
   case 25: /* preprocessor: tPPIDENT opt_text tNL  */
-#line 296 "libs/wpp/ppy.y"
+#line 295 "libs/wpp/ppy.y"
                                 { if(pp_status.pedantic) ppy_warning("#ident ignored (arg: '%s')", (yyvsp[-1].cptr)); free((yyvsp[-1].cptr)); }
-#line 1669 "libs/wpp/ppy.tab.c"
+#line 1668 "libs/wpp/ppy.tab.c"
     break;
 
   case 26: /* preprocessor: tRCINCLUDE tRCINCLUDEPATH  */
-#line 297 "libs/wpp/ppy.y"
+#line 296 "libs/wpp/ppy.y"
                                     {
-                if((yyvsp[0].cptr))
-                {
-                        int nl=strlen((yyvsp[0].cptr)) +3;
-                        char *fn=pp_xmalloc(nl);
-                        if(fn)
-                        {
-                                sprintf(fn,"\"%s\"",(yyvsp[0].cptr));
-                                pp_do_include(fn,1);
-                        }
-                        free((yyvsp[0].cptr));
-                }
+                int nl=strlen((yyvsp[0].cptr)) +3;
+                char *fn=pp_xmalloc(nl);
+                sprintf(fn,"\"%s\"",(yyvsp[0].cptr));
+                pp_do_include(fn,1);
+                free((yyvsp[0].cptr));
 	}
-#line 1687 "libs/wpp/ppy.tab.c"
+#line 1680 "libs/wpp/ppy.tab.c"
     break;
 
   case 27: /* preprocessor: tRCINCLUDE tDQSTRING  */
-#line 310 "libs/wpp/ppy.y"
+#line 303 "libs/wpp/ppy.y"
                                {
 		pp_do_include((yyvsp[0].cptr),1);
 	}
-#line 1695 "libs/wpp/ppy.tab.c"
+#line 1688 "libs/wpp/ppy.tab.c"
     break;
 
   case 28: /* opt_text: %empty  */
-#line 316 "libs/wpp/ppy.y"
+#line 309 "libs/wpp/ppy.y"
                         { (yyval.cptr) = NULL; }
-#line 1701 "libs/wpp/ppy.tab.c"
+#line 1694 "libs/wpp/ppy.tab.c"
     break;
 
   case 29: /* opt_text: text  */
-#line 317 "libs/wpp/ppy.y"
+#line 310 "libs/wpp/ppy.y"
                         { (yyval.cptr) = (yyvsp[0].cptr); }
-#line 1707 "libs/wpp/ppy.tab.c"
+#line 1700 "libs/wpp/ppy.tab.c"
     break;
 
   case 30: /* text: tLITERAL  */
-#line 320 "libs/wpp/ppy.y"
+#line 313 "libs/wpp/ppy.y"
                                 { (yyval.cptr) = (yyvsp[0].cptr); }
-#line 1713 "libs/wpp/ppy.tab.c"
+#line 1706 "libs/wpp/ppy.tab.c"
     break;
 
   case 31: /* text: tDQSTRING  */
-#line 321 "libs/wpp/ppy.y"
+#line 314 "libs/wpp/ppy.y"
                                 { (yyval.cptr) = (yyvsp[0].cptr); }
-#line 1719 "libs/wpp/ppy.tab.c"
+#line 1712 "libs/wpp/ppy.tab.c"
     break;
 
   case 32: /* text: tSQSTRING  */
-#line 322 "libs/wpp/ppy.y"
+#line 315 "libs/wpp/ppy.y"
                                 { (yyval.cptr) = (yyvsp[0].cptr); }
-#line 1725 "libs/wpp/ppy.tab.c"
+#line 1718 "libs/wpp/ppy.tab.c"
     break;
 
   case 33: /* text: text tLITERAL  */
-#line 323 "libs/wpp/ppy.y"
+#line 316 "libs/wpp/ppy.y"
                                 { (yyval.cptr) = merge_text((yyvsp[-1].cptr), (yyvsp[0].cptr)); }
-#line 1731 "libs/wpp/ppy.tab.c"
+#line 1724 "libs/wpp/ppy.tab.c"
     break;
 
   case 34: /* text: text tDQSTRING  */
-#line 324 "libs/wpp/ppy.y"
+#line 317 "libs/wpp/ppy.y"
                                 { (yyval.cptr) = merge_text((yyvsp[-1].cptr), (yyvsp[0].cptr)); }
-#line 1737 "libs/wpp/ppy.tab.c"
+#line 1730 "libs/wpp/ppy.tab.c"
     break;
 
   case 35: /* text: text tSQSTRING  */
-#line 325 "libs/wpp/ppy.y"
+#line 318 "libs/wpp/ppy.y"
                                 { (yyval.cptr) = merge_text((yyvsp[-1].cptr), (yyvsp[0].cptr)); }
-#line 1743 "libs/wpp/ppy.tab.c"
+#line 1736 "libs/wpp/ppy.tab.c"
     break;
 
   case 36: /* res_arg: %empty  */
-#line 328 "libs/wpp/ppy.y"
+#line 321 "libs/wpp/ppy.y"
                         { macro_args = NULL; nmacro_args = 0; }
-#line 1749 "libs/wpp/ppy.tab.c"
+#line 1742 "libs/wpp/ppy.tab.c"
     break;
 
   case 37: /* allmargs: %empty  */
-#line 331 "libs/wpp/ppy.y"
+#line 324 "libs/wpp/ppy.y"
                                 { (yyval.sint) = 0; macro_args = NULL; nmacro_args = 0; }
-#line 1755 "libs/wpp/ppy.tab.c"
+#line 1748 "libs/wpp/ppy.tab.c"
     break;
 
   case 38: /* allmargs: emargs  */
-#line 332 "libs/wpp/ppy.y"
+#line 325 "libs/wpp/ppy.y"
                                 { (yyval.sint) = nmacro_args; }
-#line 1761 "libs/wpp/ppy.tab.c"
+#line 1754 "libs/wpp/ppy.tab.c"
     break;
 
   case 39: /* emargs: margs  */
-#line 335 "libs/wpp/ppy.y"
+#line 328 "libs/wpp/ppy.y"
                                 { (yyval.marg) = (yyvsp[0].marg); }
-#line 1767 "libs/wpp/ppy.tab.c"
+#line 1760 "libs/wpp/ppy.tab.c"
     break;
 
   case 40: /* emargs: margs ',' tELLIPSIS  */
-#line 336 "libs/wpp/ppy.y"
-                                { (yyval.marg) = add_new_marg(NULL, arg_list); nmacro_args *= -1; }
-#line 1773 "libs/wpp/ppy.tab.c"
+#line 329 "libs/wpp/ppy.y"
+                                { nmacro_args *= -1; }
+#line 1766 "libs/wpp/ppy.tab.c"
     break;
 
   case 41: /* margs: margs ',' tIDENT  */
-#line 339 "libs/wpp/ppy.y"
-                                { (yyval.marg) = add_new_marg((yyvsp[0].cptr), arg_single); }
-#line 1779 "libs/wpp/ppy.tab.c"
+#line 332 "libs/wpp/ppy.y"
+                                { (yyval.marg) = add_new_marg((yyvsp[0].cptr)); }
+#line 1772 "libs/wpp/ppy.tab.c"
     break;
 
   case 42: /* margs: tIDENT  */
-#line 340 "libs/wpp/ppy.y"
-                                { (yyval.marg) = add_new_marg((yyvsp[0].cptr), arg_single); }
-#line 1785 "libs/wpp/ppy.tab.c"
+#line 333 "libs/wpp/ppy.y"
+                                { (yyval.marg) = add_new_marg((yyvsp[0].cptr)); }
+#line 1778 "libs/wpp/ppy.tab.c"
     break;
 
   case 43: /* opt_mtexts: %empty  */
-#line 344 "libs/wpp/ppy.y"
+#line 337 "libs/wpp/ppy.y"
                         { (yyval.mtext) = NULL; }
-#line 1791 "libs/wpp/ppy.tab.c"
+#line 1784 "libs/wpp/ppy.tab.c"
     break;
 
   case 44: /* opt_mtexts: mtexts  */
-#line 345 "libs/wpp/ppy.y"
+#line 338 "libs/wpp/ppy.y"
                         {
 		for((yyval.mtext) = (yyvsp[0].mtext); (yyval.mtext) && (yyval.mtext)->prev; (yyval.mtext) = (yyval.mtext)->prev)
 			;
 		}
-#line 1800 "libs/wpp/ppy.tab.c"
+#line 1793 "libs/wpp/ppy.tab.c"
     break;
 
   case 45: /* mtexts: mtext  */
-#line 351 "libs/wpp/ppy.y"
+#line 344 "libs/wpp/ppy.y"
                         { (yyval.mtext) = (yyvsp[0].mtext); }
-#line 1806 "libs/wpp/ppy.tab.c"
+#line 1799 "libs/wpp/ppy.tab.c"
     break;
 
   case 46: /* mtexts: mtexts mtext  */
-#line 352 "libs/wpp/ppy.y"
+#line 345 "libs/wpp/ppy.y"
                         { (yyval.mtext) = combine_mtext((yyvsp[-1].mtext), (yyvsp[0].mtext)); }
-#line 1812 "libs/wpp/ppy.tab.c"
+#line 1805 "libs/wpp/ppy.tab.c"
     break;
 
   case 47: /* mtext: tLITERAL  */
-#line 355 "libs/wpp/ppy.y"
+#line 348 "libs/wpp/ppy.y"
                         { (yyval.mtext) = new_mtext((yyvsp[0].cptr), 0, exp_text); }
-#line 1818 "libs/wpp/ppy.tab.c"
+#line 1811 "libs/wpp/ppy.tab.c"
     break;
 
   case 48: /* mtext: tDQSTRING  */
-#line 356 "libs/wpp/ppy.y"
+#line 349 "libs/wpp/ppy.y"
                         { (yyval.mtext) = new_mtext((yyvsp[0].cptr), 0, exp_text); }
-#line 1824 "libs/wpp/ppy.tab.c"
+#line 1817 "libs/wpp/ppy.tab.c"
     break;
 
   case 49: /* mtext: tSQSTRING  */
-#line 357 "libs/wpp/ppy.y"
+#line 350 "libs/wpp/ppy.y"
                         { (yyval.mtext) = new_mtext((yyvsp[0].cptr), 0, exp_text); }
-#line 1830 "libs/wpp/ppy.tab.c"
+#line 1823 "libs/wpp/ppy.tab.c"
     break;
 
   case 50: /* mtext: tCONCAT  */
-#line 358 "libs/wpp/ppy.y"
+#line 351 "libs/wpp/ppy.y"
                         { (yyval.mtext) = new_mtext(NULL, 0, exp_concat); }
-#line 1836 "libs/wpp/ppy.tab.c"
+#line 1829 "libs/wpp/ppy.tab.c"
     break;
 
   case 51: /* mtext: tSTRINGIZE tIDENT  */
-#line 359 "libs/wpp/ppy.y"
+#line 352 "libs/wpp/ppy.y"
                                 {
 		int mat = marg_index((yyvsp[0].cptr));
 		if(mat < 0)
@@ -1844,11 +1837,11 @@
 		else
 			(yyval.mtext) = new_mtext(NULL, mat, exp_stringize);
 		}
-#line 1848 "libs/wpp/ppy.tab.c"
+#line 1841 "libs/wpp/ppy.tab.c"
     break;
 
   case 52: /* mtext: tIDENT  */
-#line 366 "libs/wpp/ppy.y"
+#line 359 "libs/wpp/ppy.y"
                         {
 		int mat = marg_index((yyvsp[0].cptr));
 		if(mat >= 0)
@@ -1856,203 +1849,203 @@
 		else if((yyvsp[0].cptr))
 			(yyval.mtext) = new_mtext((yyvsp[0].cptr), 0, exp_text);
 		}
-#line 1860 "libs/wpp/ppy.tab.c"
+#line 1853 "libs/wpp/ppy.tab.c"
     break;
 
   case 53: /* pp_expr: tSINT  */
-#line 375 "libs/wpp/ppy.y"
+#line 368 "libs/wpp/ppy.y"
                                         { (yyval.cval).type = cv_sint;  (yyval.cval).val.si = (yyvsp[0].sint); }
-#line 1866 "libs/wpp/ppy.tab.c"
+#line 1859 "libs/wpp/ppy.tab.c"
     break;
 
   case 54: /* pp_expr: tUINT  */
-#line 376 "libs/wpp/ppy.y"
+#line 369 "libs/wpp/ppy.y"
                                         { (yyval.cval).type = cv_uint;  (yyval.cval).val.ui = (yyvsp[0].uint); }
-#line 1872 "libs/wpp/ppy.tab.c"
+#line 1865 "libs/wpp/ppy.tab.c"
     break;
 
   case 55: /* pp_expr: tSLONG  */
-#line 377 "libs/wpp/ppy.y"
+#line 370 "libs/wpp/ppy.y"
                                         { (yyval.cval).type = cv_slong; (yyval.cval).val.sl = (yyvsp[0].slong); }
-#line 1878 "libs/wpp/ppy.tab.c"
+#line 1871 "libs/wpp/ppy.tab.c"
     break;
 
   case 56: /* pp_expr: tULONG  */
-#line 378 "libs/wpp/ppy.y"
+#line 371 "libs/wpp/ppy.y"
                                         { (yyval.cval).type = cv_ulong; (yyval.cval).val.ul = (yyvsp[0].ulong); }
-#line 1884 "libs/wpp/ppy.tab.c"
+#line 1877 "libs/wpp/ppy.tab.c"
     break;
 
   case 57: /* pp_expr: tSLONGLONG  */
-#line 379 "libs/wpp/ppy.y"
+#line 372 "libs/wpp/ppy.y"
                                         { (yyval.cval).type = cv_sll;   (yyval.cval).val.sll = (yyvsp[0].sll); }
-#line 1890 "libs/wpp/ppy.tab.c"
+#line 1883 "libs/wpp/ppy.tab.c"
     break;
 
   case 58: /* pp_expr: tULONGLONG  */
-#line 380 "libs/wpp/ppy.y"
+#line 373 "libs/wpp/ppy.y"
                                         { (yyval.cval).type = cv_ull;   (yyval.cval).val.ull = (yyvsp[0].ull); }
-#line 1896 "libs/wpp/ppy.tab.c"
+#line 1889 "libs/wpp/ppy.tab.c"
     break;
 
   case 59: /* pp_expr: tDEFINED tIDENT  */
-#line 381 "libs/wpp/ppy.y"
+#line 374 "libs/wpp/ppy.y"
                                         { (yyval.cval).type = cv_sint;  (yyval.cval).val.si = pplookup((yyvsp[0].cptr)) != NULL; }
-#line 1902 "libs/wpp/ppy.tab.c"
+#line 1895 "libs/wpp/ppy.tab.c"
     break;
 
   case 60: /* pp_expr: tDEFINED '(' tIDENT ')'  */
-#line 382 "libs/wpp/ppy.y"
+#line 375 "libs/wpp/ppy.y"
                                         { (yyval.cval).type = cv_sint;  (yyval.cval).val.si = pplookup((yyvsp[-1].cptr)) != NULL; }
-#line 1908 "libs/wpp/ppy.tab.c"
+#line 1901 "libs/wpp/ppy.tab.c"
     break;
 
   case 61: /* pp_expr: tIDENT  */
-#line 383 "libs/wpp/ppy.y"
+#line 376 "libs/wpp/ppy.y"
                                         { (yyval.cval).type = cv_sint;  (yyval.cval).val.si = 0; }
-#line 1914 "libs/wpp/ppy.tab.c"
+#line 1907 "libs/wpp/ppy.tab.c"
     break;
 
   case 62: /* pp_expr: pp_expr tLOGOR pp_expr  */
-#line 384 "libs/wpp/ppy.y"
+#line 377 "libs/wpp/ppy.y"
                                         { (yyval.cval).type = cv_sint; (yyval.cval).val.si = boolean(&(yyvsp[-2].cval)) || boolean(&(yyvsp[0].cval)); }
-#line 1920 "libs/wpp/ppy.tab.c"
+#line 1913 "libs/wpp/ppy.tab.c"
     break;
 
   case 63: /* pp_expr: pp_expr tLOGAND pp_expr  */
-#line 385 "libs/wpp/ppy.y"
+#line 378 "libs/wpp/ppy.y"
                                         { (yyval.cval).type = cv_sint; (yyval.cval).val.si = boolean(&(yyvsp[-2].cval)) && boolean(&(yyvsp[0].cval)); }
-#line 1926 "libs/wpp/ppy.tab.c"
+#line 1919 "libs/wpp/ppy.tab.c"
     break;
 
   case 64: /* pp_expr: pp_expr tEQ pp_expr  */
-#line 386 "libs/wpp/ppy.y"
+#line 379 "libs/wpp/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval), ==); }
-#line 1932 "libs/wpp/ppy.tab.c"
+#line 1925 "libs/wpp/ppy.tab.c"
     break;
 
   case 65: /* pp_expr: pp_expr tNE pp_expr  */
-#line 387 "libs/wpp/ppy.y"
+#line 380 "libs/wpp/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval), !=); }
-#line 1938 "libs/wpp/ppy.tab.c"
+#line 1931 "libs/wpp/ppy.tab.c"
     break;
 
   case 66: /* pp_expr: pp_expr '<' pp_expr  */
-#line 388 "libs/wpp/ppy.y"
+#line 381 "libs/wpp/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval),  <); }
-#line 1944 "libs/wpp/ppy.tab.c"
+#line 1937 "libs/wpp/ppy.tab.c"
     break;
 
   case 67: /* pp_expr: pp_expr '>' pp_expr  */
-#line 389 "libs/wpp/ppy.y"
+#line 382 "libs/wpp/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval),  >); }
-#line 1950 "libs/wpp/ppy.tab.c"
+#line 1943 "libs/wpp/ppy.tab.c"
     break;
 
   case 68: /* pp_expr: pp_expr tLTE pp_expr  */
-#line 390 "libs/wpp/ppy.y"
+#line 383 "libs/wpp/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval), <=); }
-#line 1956 "libs/wpp/ppy.tab.c"
+#line 1949 "libs/wpp/ppy.tab.c"
     break;
 
   case 69: /* pp_expr: pp_expr tGTE pp_expr  */
-#line 391 "libs/wpp/ppy.y"
+#line 384 "libs/wpp/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval), >=); }
-#line 1962 "libs/wpp/ppy.tab.c"
+#line 1955 "libs/wpp/ppy.tab.c"
     break;
 
   case 70: /* pp_expr: pp_expr '+' pp_expr  */
-#line 392 "libs/wpp/ppy.y"
+#line 385 "libs/wpp/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval),  +); }
-#line 1968 "libs/wpp/ppy.tab.c"
+#line 1961 "libs/wpp/ppy.tab.c"
     break;
 
   case 71: /* pp_expr: pp_expr '-' pp_expr  */
-#line 393 "libs/wpp/ppy.y"
+#line 386 "libs/wpp/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval),  -); }
-#line 1974 "libs/wpp/ppy.tab.c"
+#line 1967 "libs/wpp/ppy.tab.c"
     break;
 
   case 72: /* pp_expr: pp_expr '^' pp_expr  */
-#line 394 "libs/wpp/ppy.y"
+#line 387 "libs/wpp/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval),  ^); }
-#line 1980 "libs/wpp/ppy.tab.c"
+#line 1973 "libs/wpp/ppy.tab.c"
     break;
 
   case 73: /* pp_expr: pp_expr '&' pp_expr  */
-#line 395 "libs/wpp/ppy.y"
+#line 388 "libs/wpp/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval),  &); }
-#line 1986 "libs/wpp/ppy.tab.c"
+#line 1979 "libs/wpp/ppy.tab.c"
     break;
 
   case 74: /* pp_expr: pp_expr '|' pp_expr  */
-#line 396 "libs/wpp/ppy.y"
+#line 389 "libs/wpp/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval),  |); }
-#line 1992 "libs/wpp/ppy.tab.c"
+#line 1985 "libs/wpp/ppy.tab.c"
     break;
 
   case 75: /* pp_expr: pp_expr '*' pp_expr  */
-#line 397 "libs/wpp/ppy.y"
+#line 390 "libs/wpp/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval),  *); }
-#line 1998 "libs/wpp/ppy.tab.c"
+#line 1991 "libs/wpp/ppy.tab.c"
     break;
 
   case 76: /* pp_expr: pp_expr '/' pp_expr  */
-#line 398 "libs/wpp/ppy.y"
+#line 391 "libs/wpp/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval),  /); }
-#line 2004 "libs/wpp/ppy.tab.c"
+#line 1997 "libs/wpp/ppy.tab.c"
     break;
 
   case 77: /* pp_expr: pp_expr tLSHIFT pp_expr  */
-#line 399 "libs/wpp/ppy.y"
+#line 392 "libs/wpp/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval), <<); }
-#line 2010 "libs/wpp/ppy.tab.c"
+#line 2003 "libs/wpp/ppy.tab.c"
     break;
 
   case 78: /* pp_expr: pp_expr tRSHIFT pp_expr  */
-#line 400 "libs/wpp/ppy.y"
+#line 393 "libs/wpp/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval), >>); }
-#line 2016 "libs/wpp/ppy.tab.c"
+#line 2009 "libs/wpp/ppy.tab.c"
     break;
 
   case 79: /* pp_expr: '+' pp_expr  */
-#line 401 "libs/wpp/ppy.y"
+#line 394 "libs/wpp/ppy.y"
                                         { (yyval.cval) =  (yyvsp[0].cval); }
-#line 2022 "libs/wpp/ppy.tab.c"
+#line 2015 "libs/wpp/ppy.tab.c"
     break;
 
   case 80: /* pp_expr: '-' pp_expr  */
-#line 402 "libs/wpp/ppy.y"
+#line 395 "libs/wpp/ppy.y"
                                         { UNARY_OP((yyval.cval), (yyvsp[0].cval), -); }
-#line 2028 "libs/wpp/ppy.tab.c"
+#line 2021 "libs/wpp/ppy.tab.c"
     break;
 
   case 81: /* pp_expr: '~' pp_expr  */
-#line 403 "libs/wpp/ppy.y"
+#line 396 "libs/wpp/ppy.y"
                                         { UNARY_OP((yyval.cval), (yyvsp[0].cval), ~); }
-#line 2034 "libs/wpp/ppy.tab.c"
+#line 2027 "libs/wpp/ppy.tab.c"
     break;
 
   case 82: /* pp_expr: '!' pp_expr  */
-#line 404 "libs/wpp/ppy.y"
+#line 397 "libs/wpp/ppy.y"
                                         { (yyval.cval).type = cv_sint; (yyval.cval).val.si = !boolean(&(yyvsp[0].cval)); }
-#line 2040 "libs/wpp/ppy.tab.c"
+#line 2033 "libs/wpp/ppy.tab.c"
     break;
 
   case 83: /* pp_expr: '(' pp_expr ')'  */
-#line 405 "libs/wpp/ppy.y"
+#line 398 "libs/wpp/ppy.y"
                                         { (yyval.cval) =  (yyvsp[-1].cval); }
-#line 2046 "libs/wpp/ppy.tab.c"
+#line 2039 "libs/wpp/ppy.tab.c"
     break;
 
   case 84: /* pp_expr: pp_expr '?' pp_expr ':' pp_expr  */
-#line 406 "libs/wpp/ppy.y"
+#line 399 "libs/wpp/ppy.y"
                                           { (yyval.cval) = boolean(&(yyvsp[-4].cval)) ? (yyvsp[-2].cval) : (yyvsp[0].cval); }
-#line 2052 "libs/wpp/ppy.tab.c"
+#line 2045 "libs/wpp/ppy.tab.c"
     break;
 
 
-#line 2056 "libs/wpp/ppy.tab.c"
+#line 2049 "libs/wpp/ppy.tab.c"
 
       default: break;
     }
@@ -2246,7 +2239,7 @@
   return yyresult;
 }
 
-#line 409 "libs/wpp/ppy.y"
+#line 402 "libs/wpp/ppy.y"
 
 
 /*
@@ -2390,32 +2383,11 @@
 	return 0;
 }
 
-static marg_t *new_marg(char *str, def_arg_t type)
+static char *add_new_marg(char *str)
 {
-	marg_t *ma = pp_xmalloc(sizeof(marg_t));
-	if(!ma)
-		return NULL;
-	ma->arg = str;
-	ma->type = type;
-	ma->nnl = 0;
-	return ma;
-}
-
-static marg_t *add_new_marg(char *str, def_arg_t type)
-{
-	marg_t **new_macro_args;
-	marg_t *ma;
-	if(!str)
-		return NULL;
-	new_macro_args = pp_xrealloc(macro_args, (nmacro_args+1) * sizeof(macro_args[0]));
-	if(!new_macro_args)
-		return NULL;
-	macro_args = new_macro_args;
-	ma = new_marg(str, type);
-	if(!ma)
-		return NULL;
-	macro_args[nmacro_args] = ma;
-	nmacro_args++;
+	char *ma;
+	macro_args = pp_xrealloc(macro_args, (nmacro_args+1) * sizeof(macro_args[0]));
+	macro_args[nmacro_args++] = ma = pp_xstrdup(str);
 	return ma;
 }
 
@@ -2426,7 +2398,7 @@
 		return -1;
 	for(t = 0; t < nmacro_args; t++)
 	{
-		if(!strcmp(id, macro_args[t]->arg))
+		if(!strcmp(id, macro_args[t]))
 			break;
 	}
 	return t < nmacro_args ? t : -1;
@@ -2435,8 +2407,7 @@
 static mtext_t *new_mtext(char *str, int idx, def_exp_t type)
 {
 	mtext_t *mt = pp_xmalloc(sizeof(mtext_t));
-	if(!mt)
-		return NULL;
+
 	if(str == NULL)
 		mt->subst.argidx = idx;
 	else
@@ -2456,11 +2427,7 @@
 
 	if(tail->type == exp_text && mtp->type == exp_text)
 	{
-		char *new_text;
-		new_text = pp_xrealloc(tail->subst.text, strlen(tail->subst.text)+strlen(mtp->subst.text)+1);
-		if(!new_text)
-			return mtp;
-		tail->subst.text = new_text;
+		tail->subst.text = pp_xrealloc(tail->subst.text, strlen(tail->subst.text)+strlen(mtp->subst.text)+1);
 		strcat(tail->subst.text, mtp->subst.text);
 		free(mtp->subst.text);
 		free(mtp);
@@ -2524,22 +2491,9 @@
 
 static char *merge_text(char *s1, char *s2)
 {
-	int l1;
-	int l2;
-	char *snew;
-	if(!s1)
-		return s2;
-	if(!s2)
-		return s1;
-	l1 = strlen(s1);
-	l2 = strlen(s2);
-	snew = pp_xrealloc(s1, l1+l2+1);
-	if(!snew)
-	{
-		free(s2);
-		return s1;
-	}
-	s1 = snew;
+	int l1 = strlen(s1);
+	int l2 = strlen(s2);
+	s1 = pp_xrealloc(s1, l1+l2+1);
 	memcpy(s1+l1, s2, l2+1);
 	free(s2);
 	return s1;
diff --git a/mingw-w64-tools/widl/src/wpp/ppy.tab.h b/mingw-w64-tools/widl/src/wpp/ppy.tab.h
index 4dda322..808deaa 100644
--- a/mingw-w64-tools/widl/src/wpp/ppy.tab.h
+++ b/mingw-w64-tools/widl/src/wpp/ppy.tab.h
@@ -1,4 +1,4 @@
-/* A Bison parser, made by GNU Bison 3.7.2.  */
+/* A Bison parser, made by GNU Bison 3.7.4.  */
 
 /* Bison interface for Yacc-like parsers in C
 
@@ -105,7 +105,7 @@
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 126 "libs/wpp/ppy.y"
+#line 125 "libs/wpp/ppy.y"
 
 	int		sint;
 	unsigned int	uint;
@@ -116,7 +116,7 @@
 	int		*iptr;
 	char		*cptr;
 	cval_t		cval;
-	marg_t		*marg;
+	char		*marg;
 	mtext_t		*mtext;
 
 #line 123 "libs/wpp/ppy.tab.h"
diff --git a/mingw-w64-tools/widl/src/wpp/ppy.y b/mingw-w64-tools/widl/src/wpp/ppy.y
index a6c0957..5b7083b 100644
--- a/mingw-w64-tools/widl/src/wpp/ppy.y
+++ b/mingw-w64-tools/widl/src/wpp/ppy.y
@@ -108,8 +108,7 @@
 static void cast_to_ulong(cval_t *v);
 static void cast_to_sll(cval_t *v);
 static void cast_to_ull(cval_t *v);
-static marg_t *new_marg(char *str, def_arg_t type);
-static marg_t *add_new_marg(char *str, def_arg_t type);
+static char *add_new_marg(char *str);
 static int marg_index(char *id);
 static mtext_t *new_mtext(char *str, int idx, def_exp_t type);
 static mtext_t *combine_mtext(mtext_t *tail, mtext_t *mtp);
@@ -118,7 +117,7 @@
 /*
  * Local variables
  */
-static marg_t **macro_args;	/* Macro parameters array while parsing */
+static char   **macro_args;	/* Macro parameters array while parsing */
 static int	nmacro_args;
 
 %}
@@ -133,7 +132,7 @@
 	int		*iptr;
 	char		*cptr;
 	cval_t		cval;
-	marg_t		*marg;
+	char		*marg;
 	mtext_t		*mtext;
 }
 
@@ -295,17 +294,11 @@
 	| tPRAGMA opt_text tNL	{ pp_writestring("#pragma %s\n", $2 ? $2 : ""); free($2); }
 	| tPPIDENT opt_text tNL	{ if(pp_status.pedantic) ppy_warning("#ident ignored (arg: '%s')", $2); free($2); }
         | tRCINCLUDE tRCINCLUDEPATH {
-                if($2)
-                {
-                        int nl=strlen($2) +3;
-                        char *fn=pp_xmalloc(nl);
-                        if(fn)
-                        {
-                                sprintf(fn,"\"%s\"",$2);
-                                pp_do_include(fn,1);
-                        }
-                        free($2);
-                }
+                int nl=strlen($2) +3;
+                char *fn=pp_xmalloc(nl);
+                sprintf(fn,"\"%s\"",$2);
+                pp_do_include(fn,1);
+                free($2);
 	}
 	| tRCINCLUDE tDQSTRING {
 		pp_do_include($2,1);
@@ -333,11 +326,11 @@
 	;
 
 emargs	: margs			{ $$ = $1; }
-	| margs ',' tELLIPSIS	{ $$ = add_new_marg(NULL, arg_list); nmacro_args *= -1; }
+	| margs ',' tELLIPSIS	{ nmacro_args *= -1; }
 	;
 
-margs	: margs ',' tIDENT	{ $$ = add_new_marg($3, arg_single); }
-	| tIDENT		{ $$ = add_new_marg($1, arg_single); }
+margs	: margs ',' tIDENT	{ $$ = add_new_marg($3); }
+	| tIDENT		{ $$ = add_new_marg($1); }
 	;
 
 opt_mtexts
@@ -549,32 +542,11 @@
 	return 0;
 }
 
-static marg_t *new_marg(char *str, def_arg_t type)
+static char *add_new_marg(char *str)
 {
-	marg_t *ma = pp_xmalloc(sizeof(marg_t));
-	if(!ma)
-		return NULL;
-	ma->arg = str;
-	ma->type = type;
-	ma->nnl = 0;
-	return ma;
-}
-
-static marg_t *add_new_marg(char *str, def_arg_t type)
-{
-	marg_t **new_macro_args;
-	marg_t *ma;
-	if(!str)
-		return NULL;
-	new_macro_args = pp_xrealloc(macro_args, (nmacro_args+1) * sizeof(macro_args[0]));
-	if(!new_macro_args)
-		return NULL;
-	macro_args = new_macro_args;
-	ma = new_marg(str, type);
-	if(!ma)
-		return NULL;
-	macro_args[nmacro_args] = ma;
-	nmacro_args++;
+	char *ma;
+	macro_args = pp_xrealloc(macro_args, (nmacro_args+1) * sizeof(macro_args[0]));
+	macro_args[nmacro_args++] = ma = pp_xstrdup(str);
 	return ma;
 }
 
@@ -585,7 +557,7 @@
 		return -1;
 	for(t = 0; t < nmacro_args; t++)
 	{
-		if(!strcmp(id, macro_args[t]->arg))
+		if(!strcmp(id, macro_args[t]))
 			break;
 	}
 	return t < nmacro_args ? t : -1;
@@ -594,8 +566,7 @@
 static mtext_t *new_mtext(char *str, int idx, def_exp_t type)
 {
 	mtext_t *mt = pp_xmalloc(sizeof(mtext_t));
-	if(!mt)
-		return NULL;
+
 	if(str == NULL)
 		mt->subst.argidx = idx;
 	else
@@ -615,11 +586,7 @@
 
 	if(tail->type == exp_text && mtp->type == exp_text)
 	{
-		char *new_text;
-		new_text = pp_xrealloc(tail->subst.text, strlen(tail->subst.text)+strlen(mtp->subst.text)+1);
-		if(!new_text)
-			return mtp;
-		tail->subst.text = new_text;
+		tail->subst.text = pp_xrealloc(tail->subst.text, strlen(tail->subst.text)+strlen(mtp->subst.text)+1);
 		strcat(tail->subst.text, mtp->subst.text);
 		free(mtp->subst.text);
 		free(mtp);
@@ -683,22 +650,9 @@
 
 static char *merge_text(char *s1, char *s2)
 {
-	int l1;
-	int l2;
-	char *snew;
-	if(!s1)
-		return s2;
-	if(!s2)
-		return s1;
-	l1 = strlen(s1);
-	l2 = strlen(s2);
-	snew = pp_xrealloc(s1, l1+l2+1);
-	if(!snew)
-	{
-		free(s2);
-		return s1;
-	}
-	s1 = snew;
+	int l1 = strlen(s1);
+	int l2 = strlen(s2);
+	s1 = pp_xrealloc(s1, l1+l2+1);
 	memcpy(s1+l1, s2, l2+1);
 	free(s2);
 	return s1;
diff --git a/mingw-w64-tools/widl/src/wpp/preproc.c b/mingw-w64-tools/widl/src/wpp/preproc.c
deleted file mode 100644
index 284704b..0000000
--- a/mingw-w64-tools/widl/src/wpp/preproc.c
+++ /dev/null
@@ -1,718 +0,0 @@
-/*
- * Copyright 1998 Bertho A. Stultiens (BS)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include "config.h"
-#include "wine/port.h"
-
-#include <assert.h>
-#include <ctype.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#include "wine/wpp.h"
-#include "wpp_private.h"
-
-struct pp_status pp_status;
-
-#define HASHKEY		2039
-
-typedef struct pp_def_state
-{
-    struct pp_def_state *next;
-    pp_entry_t          *defines[HASHKEY];
-} pp_def_state_t;
-
-static pp_def_state_t *pp_def_state;
-
-#define MAXIFSTACK	64
-static pp_if_state_t if_stack[MAXIFSTACK];
-static int if_stack_idx = 0;
-
-#if 0
-void pp_print_status(void) __attribute__((destructor));
-void pp_print_status(void)
-{
-	int i;
-	int sum;
-	int total = 0;
-	pp_entry_t *ppp;
-
-	fprintf(stderr, "Defines statistics:\n");
-	for(i = 0; i < HASHKEY; i++)
-	{
-		sum = 0;
-		for(ppp = pp_def_state->defines[i]; ppp; ppp = ppp->next)
-			sum++;
-		total += sum;
-		if (sum) fprintf(stderr, "%4d, %3d\n", i, sum);
-	}
-	fprintf(stderr, "Total defines: %d\n", total);
-}
-#endif
-
-void *pp_xmalloc(size_t size)
-{
-    void *res;
-
-    assert(size > 0);
-    res = malloc(size);
-    if(res == NULL)
-    {
-        /* Set the error flag */
-        pp_status.state = 1;
-    }
-    return res;
-}
-
-void *pp_xrealloc(void *p, size_t size)
-{
-    void *res;
-
-    assert(size > 0);
-    res = realloc(p, size);
-    if(res == NULL)
-    {
-        /* Set the error flag */
-        pp_status.state = 1;
-    }
-    return res;
-}
-
-char *pp_xstrdup(const char *str)
-{
-	char *s;
-	int len;
-
-	assert(str != NULL);
-	len = strlen(str)+1;
-	s = pp_xmalloc(len);
-	if(!s)
-		return NULL;
-	return memcpy(s, str, len);
-}
-
-char *wpp_lookup(const char *name, int type, const char *parent_name,
-                 char **include_path, int include_path_count)
-{
-    char *cpy;
-    char *cptr;
-    char *path;
-    const char *ccptr;
-    int i, fd;
-
-    cpy = pp_xmalloc(strlen(name)+1);
-    if(!cpy)
-        return NULL;
-    cptr = cpy;
-
-    for(ccptr = name; *ccptr; ccptr++)
-    {
-        /* Convert to forward slash */
-        if(*ccptr == '\\') {
-            /* kill double backslash */
-            if(ccptr[1] == '\\')
-                ccptr++;
-            *cptr = '/';
-        }else {
-            *cptr = *ccptr;
-        }
-        cptr++;
-    }
-    *cptr = '\0';
-
-    if(type && parent_name)
-    {
-        /* Search directory of parent include and then -I path */
-        const char *p;
-
-        if ((p = strrchr( parent_name, '/' ))) p++;
-        else p = parent_name;
-        path = pp_xmalloc( (p - parent_name) + strlen(cpy) + 1 );
-        if(!path)
-        {
-            free(cpy);
-            return NULL;
-        }
-        memcpy( path, parent_name, p - parent_name );
-        strcpy( path + (p - parent_name), cpy );
-        fd = open( path, O_RDONLY );
-        if (fd != -1)
-        {
-            close( fd );
-            free( cpy );
-            return path;
-        }
-        free( path );
-    }
-    /* Search -I path */
-    for(i = 0; i < include_path_count; i++)
-    {
-        path = pp_xmalloc(strlen(include_path[i]) + strlen(cpy) + 2);
-        if(!path)
-        {
-            free(cpy);
-            return NULL;
-        }
-        strcpy(path, include_path[i]);
-        strcat(path, "/");
-        strcat(path, cpy);
-        fd = open( path, O_RDONLY );
-        if (fd != -1)
-        {
-            close( fd );
-            free( cpy );
-            return path;
-        }
-        free( path );
-    }
-    free( cpy );
-    return NULL;
-}
-
-/* Don't comment on the hash, it's primitive but functional... */
-static int pphash(const char *str)
-{
-	int sum = 0;
-	while(*str)
-		sum += *str++;
-	return sum % HASHKEY;
-}
-
-pp_entry_t *pplookup(const char *ident)
-{
-	int idx;
-	pp_entry_t *ppp;
-
-	if(!ident)
-		return NULL;
-	idx = pphash(ident);
-	for(ppp = pp_def_state->defines[idx]; ppp; ppp = ppp->next)
-	{
-		if(!strcmp(ident, ppp->ident))
-			return ppp;
-	}
-	return NULL;
-}
-
-static void free_pp_entry( pp_entry_t *ppp, int idx )
-{
-	if(ppp->iep)
-	{
-		if(ppp->iep == pp_includelogiclist)
-		{
-			pp_includelogiclist = ppp->iep->next;
-			if(pp_includelogiclist)
-				pp_includelogiclist->prev = NULL;
-		}
-		else
-		{
-			ppp->iep->prev->next = ppp->iep->next;
-			if(ppp->iep->next)
-				ppp->iep->next->prev = ppp->iep->prev;
-		}
-		free(ppp->iep->filename);
-		free(ppp->iep);
-	}
-
-	if(pp_def_state->defines[idx] == ppp)
-	{
-		pp_def_state->defines[idx] = ppp->next;
-		if(pp_def_state->defines[idx])
-			pp_def_state->defines[idx]->prev = NULL;
-	}
-	else
-	{
-		ppp->prev->next = ppp->next;
-		if(ppp->next)
-			ppp->next->prev = ppp->prev;
-	}
-
-	free(ppp);
-}
-
-/* push a new (empty) define state */
-int pp_push_define_state(void)
-{
-    pp_def_state_t *state = pp_xmalloc( sizeof(*state) );
-    if(!state)
-        return 1;
-
-    memset( state->defines, 0, sizeof(state->defines) );
-    state->next = pp_def_state;
-    pp_def_state = state;
-    return 0;
-}
-
-/* pop the current define state */
-void pp_pop_define_state(void)
-{
-    int i;
-    pp_entry_t *ppp;
-    pp_def_state_t *state;
-
-    for (i = 0; i < HASHKEY; i++)
-    {
-        while ((ppp = pp_def_state->defines[i]) != NULL) pp_del_define( ppp->ident );
-    }
-    state = pp_def_state;
-    pp_def_state = state->next;
-    free( state );
-}
-
-void pp_del_define(const char *name)
-{
-	pp_entry_t *ppp;
-	int idx = pphash(name);
-
-	if((ppp = pplookup(name)) == NULL)
-	{
-		if(pp_status.pedantic)
-			ppy_warning("%s was not defined", name);
-		return;
-	}
-
-	if(pp_status.debug)
-		printf("Deleting (%s, %d) <%s>\n", pp_status.input, pp_status.line_number, name);
-
-	free( ppp->ident );
-	free( ppp->subst.text );
-	free( ppp->filename );
-	free_pp_entry( ppp, idx );
-}
-
-pp_entry_t *pp_add_define(const char *def, const char *text)
-{
-	int len;
-	char *cptr;
-	int idx;
-	pp_entry_t *ppp;
-
-	if(!def)
-		return NULL;
-	idx = pphash(def);
-	if((ppp = pplookup(def)) != NULL)
-	{
-		if(pp_status.pedantic)
-			ppy_warning("Redefinition of %s\n\tPrevious definition: %s:%d", def, ppp->filename, ppp->linenumber);
-		pp_del_define(def);
-	}
-	ppp = pp_xmalloc(sizeof(pp_entry_t));
-	if(!ppp)
-		return NULL;
-	memset( ppp, 0, sizeof(*ppp) );
-	ppp->ident = pp_xstrdup(def);
-	if(!ppp->ident)
-		goto error;
-	ppp->type = def_define;
-	ppp->subst.text = text ? pp_xstrdup(text) : NULL;
-	if(text && !ppp->subst.text)
-		goto error;
-	ppp->filename = pp_xstrdup(pp_status.input ? pp_status.input : "<internal or cmdline>");
-	if(!ppp->filename)
-		goto error;
-	ppp->linenumber = pp_status.input ? pp_status.line_number : 0;
-	ppp->next = pp_def_state->defines[idx];
-	pp_def_state->defines[idx] = ppp;
-	if(ppp->next)
-		ppp->next->prev = ppp;
-	if(ppp->subst.text)
-	{
-		/* Strip trailing white space from subst text */
-		len = strlen(ppp->subst.text);
-		while(len && strchr(" \t\r\n", ppp->subst.text[len-1]))
-		{
-			ppp->subst.text[--len] = '\0';
-		}
-		/* Strip leading white space from subst text */
-		for(cptr = ppp->subst.text; *cptr && strchr(" \t\r", *cptr); cptr++)
-		;
-		if(ppp->subst.text != cptr)
-			memmove(ppp->subst.text, cptr, strlen(cptr)+1);
-	}
-	if(pp_status.debug)
-		printf("Added define (%s, %d) <%s> to <%s>\n", pp_status.input, pp_status.line_number, ppp->ident, ppp->subst.text ? ppp->subst.text : "(null)");
-
-	return ppp;
-
-error:
-	free(ppp->ident);
-	free(ppp->subst.text);
-	free(ppp);
-	return NULL;
-}
-
-pp_entry_t *pp_add_macro(char *id, marg_t *args[], int nargs, mtext_t *exp)
-{
-	int idx;
-	pp_entry_t *ppp;
-
-	if(!id)
-		return NULL;
-	idx = pphash(id);
-	if((ppp = pplookup(id)) != NULL)
-	{
-		if(pp_status.pedantic)
-			ppy_warning("Redefinition of %s\n\tPrevious definition: %s:%d", id, ppp->filename, ppp->linenumber);
-		pp_del_define(id);
-	}
-	ppp = pp_xmalloc(sizeof(pp_entry_t));
-	if(!ppp)
-		return NULL;
-	memset( ppp, 0, sizeof(*ppp) );
-	ppp->ident	= id;
-	ppp->type	= def_macro;
-	ppp->margs	= args;
-	ppp->nargs	= nargs;
-	ppp->subst.mtext= exp;
-	ppp->filename = pp_xstrdup(pp_status.input ? pp_status.input : "<internal or cmdline>");
-	if(!ppp->filename)
-	{
-		free(ppp);
-		return NULL;
-	}
-	ppp->linenumber = pp_status.input ? pp_status.line_number : 0;
-	ppp->next	= pp_def_state->defines[idx];
-	pp_def_state->defines[idx] = ppp;
-	if(ppp->next)
-		ppp->next->prev = ppp;
-
-	if(pp_status.debug)
-	{
-		fprintf(stderr, "Added macro (%s, %d) <%s(%d)> to <", pp_status.input, pp_status.line_number, ppp->ident, nargs);
-		for(; exp; exp = exp->next)
-		{
-			switch(exp->type)
-			{
-			case exp_text:
-				fprintf(stderr, " \"%s\" ", exp->subst.text);
-				break;
-			case exp_stringize:
-				fprintf(stderr, " #(%d) ", exp->subst.argidx);
-				break;
-			case exp_concat:
-				fprintf(stderr, "##");
-				break;
-			case exp_subst:
-				fprintf(stderr, " <%d> ", exp->subst.argidx);
-				break;
-			}
-		}
-		fprintf(stderr, ">\n");
-	}
-	return ppp;
-}
-
-
-/*
- *-------------------------------------------------------------------------
- * Include management
- *-------------------------------------------------------------------------
- */
-#if defined(_WIN32) || defined(__MSDOS__)
-#define INCLUDESEPARATOR	";"
-#else
-#define INCLUDESEPARATOR	":"
-#endif
-
-static char **includepath;
-static int nincludepath = 0;
-
-int wpp_add_include_path(const char *path)
-{
-	char *tok;
-	char *cpy = pp_xstrdup(path);
-	if(!cpy)
-		return 1;
-
-	tok = strtok(cpy, INCLUDESEPARATOR);
-	while(tok)
-	{
-		if(*tok) {
-			char *dir;
-			char *cptr;
-			char **new_path;
-
-			dir = pp_xstrdup(tok);
-			if(!dir)
-			{
-				free(cpy);
-				return 1;
-			}
-			for(cptr = dir; *cptr; cptr++)
-			{
-				/* Convert to forward slash */
-				if(*cptr == '\\')
-					*cptr = '/';
-			}
-			/* Kill eventual trailing '/' */
-			if(*(cptr = dir + strlen(dir)-1) == '/')
-				*cptr = '\0';
-
-			/* Add to list */
-			new_path = pp_xrealloc(includepath, (nincludepath+1) * sizeof(*includepath));
-			if(!new_path)
-			{
-				free(dir);
-				free(cpy);
-				return 1;
-			}
-			includepath = new_path;
-			includepath[nincludepath] = dir;
-			nincludepath++;
-		}
-		tok = strtok(NULL, INCLUDESEPARATOR);
-	}
-	free(cpy);
-	return 0;
-}
-
-char *wpp_find_include(const char *name, const char *parent_name)
-{
-    return wpp_lookup(name, !!parent_name, parent_name, includepath, nincludepath);
-}
-
-void *pp_open_include(const char *name, int type, const char *parent_name, char **newpath)
-{
-    char *path;
-    void *fp;
-
-    if (!(path = wpp_lookup(name, type, parent_name, includepath, nincludepath))) return NULL;
-    fp = fopen(path, "rt");
-
-    if (fp)
-    {
-        if (pp_status.debug)
-            printf("Going to include <%s>\n", path);
-        if (newpath) *newpath = path;
-        else free( path );
-        return fp;
-    }
-    free( path );
-    return NULL;
-}
-
-/*
- *-------------------------------------------------------------------------
- * #if, #ifdef, #ifndef, #else, #elif and #endif state management
- *
- * #if state transitions are made on basis of the current TOS and the next
- * required state. The state transitions are required to housekeep because
- * #if:s can be nested. The ignore case is activated to prevent output from
- * within a false clause.
- * Some special cases come from the fact that the #elif cases are not
- * binary, but three-state. The problem is that all other elif-cases must
- * be false when one true one has been found. A second problem is that the
- * #else clause is a final clause. No extra #else:s may follow.
- *
- * The states mean:
- * if_true	Process input to output
- * if_false	Process input but no output
- * if_ignore	Process input but no output
- * if_elif	Process input but no output
- * if_elsefalse	Process input but no output
- * if_elsettrue	Process input to output
- *
- * The possible state-sequences are [state(stack depth)] (rest can be deduced):
- *	TOS		#if 1		#else			#endif
- *	if_true(n)	if_true(n+1)	if_elsefalse(n+1)
- *	if_false(n)	if_ignore(n+1)	if_ignore(n+1)
- *	if_elsetrue(n)	if_true(n+1)	if_elsefalse(n+1)
- *	if_elsefalse(n)	if_ignore(n+1)	if_ignore(n+1)
- *	if_elif(n)	if_ignore(n+1)	if_ignore(n+1)
- *	if_ignore(n)	if_ignore(n+1)	if_ignore(n+1)
- *
- *	TOS		#if 1		#elif 0		#else		#endif
- *	if_true(n)	if_true(n+1)	if_elif(n+1)	if_elif(n+1)
- *	if_false(n)	if_ignore(n+1)	if_ignore(n+1)	if_ignore(n+1)
- *	if_elsetrue(n)	if_true(n+1)	if_elif(n+1)	if_elif(n+1)
- *	if_elsefalse(n)	if_ignore(n+1)	if_ignore(n+1)	if_ignore(n+1)
- *	if_elif(n)	if_ignore(n+1)	if_ignore(n+1)	if_ignore(n+1)
- *	if_ignore(n)	if_ignore(n+1)	if_ignore(n+1)	if_ignore(n+1)
- *
- *	TOS		#if 0		#elif 1		#else		#endif
- *	if_true(n)	if_false(n+1)	if_true(n+1)	if_elsefalse(n+1)
- *	if_false(n)	if_ignore(n+1)	if_ignore(n+1)	if_ignore(n+1)
- *	if_elsetrue(n)	if_false(n+1)	if_true(n+1)	if_elsefalse(n+1)
- *	if_elsefalse(n)	if_ignore(n+1)	if_ignore(n+1)	if_ignore(n+1)
- *	if_elif(n)	if_ignore(n+1)	if_ignore(n+1)	if_ignore(n+1)
- *	if_ignore(n)	if_ignore(n+1)	if_ignore(n+1)	if_ignore(n+1)
- *
- *-------------------------------------------------------------------------
- */
-static const char * const pp_if_state_str[] = {
-	"if_false",
-	"if_true",
-	"if_elif",
-	"if_elsefalse",
-	"if_elsetrue",
-	"if_ignore"
-};
-
-void pp_push_if(pp_if_state_t s)
-{
-	if(if_stack_idx >= MAXIFSTACK)
-		pp_internal_error(__FILE__, __LINE__, "#if-stack overflow; #{if,ifdef,ifndef} nested too deeply (> %d)", MAXIFSTACK);
-
-	if(pp_flex_debug)
-		fprintf(stderr, "Push if %s:%d: %s(%d) -> %s(%d)\n", pp_status.input, pp_status.line_number, pp_if_state_str[pp_if_state()], if_stack_idx, pp_if_state_str[s], if_stack_idx+1);
-
-	if_stack[if_stack_idx++] = s;
-
-	switch(s)
-	{
-	case if_true:
-	case if_elsetrue:
-		break;
-	case if_false:
-	case if_elsefalse:
-	case if_elif:
-	case if_ignore:
-		pp_push_ignore_state();
-		break;
-	default:
-		pp_internal_error(__FILE__, __LINE__, "Invalid pp_if_state (%d)", (int)pp_if_state());
-	}
-}
-
-pp_if_state_t pp_pop_if(void)
-{
-	if(if_stack_idx <= 0)
-	{
-		ppy_error("#{endif,else,elif} without #{if,ifdef,ifndef} (#if-stack underflow)");
-		return if_error;
-	}
-
-	switch(pp_if_state())
-	{
-	case if_true:
-	case if_elsetrue:
-		break;
-	case if_false:
-	case if_elsefalse:
-	case if_elif:
-	case if_ignore:
-		pp_pop_ignore_state();
-		break;
-	default:
-		pp_internal_error(__FILE__, __LINE__, "Invalid pp_if_state (%d)", (int)pp_if_state());
-	}
-
-	if(pp_flex_debug)
-		fprintf(stderr, "Pop if %s:%d: %s(%d) -> %s(%d)\n",
-				pp_status.input,
-				pp_status.line_number,
-				pp_if_state_str[pp_if_state()],
-				if_stack_idx,
-				pp_if_state_str[if_stack[if_stack_idx <= 1 ? if_true : if_stack_idx-2]],
-				if_stack_idx-1);
-
-	return if_stack[--if_stack_idx];
-}
-
-pp_if_state_t pp_if_state(void)
-{
-	if(!if_stack_idx)
-		return if_true;
-	else
-		return if_stack[if_stack_idx-1];
-}
-
-
-void pp_next_if_state(int i)
-{
-	switch(pp_if_state())
-	{
-	case if_true:
-	case if_elsetrue:
-		pp_push_if(i ? if_true : if_false);
-		break;
-	case if_false:
-	case if_elsefalse:
-	case if_elif:
-	case if_ignore:
-		pp_push_if(if_ignore);
-		break;
-	default:
-		pp_internal_error(__FILE__, __LINE__, "Invalid pp_if_state (%d) in #{if,ifdef,ifndef} directive", (int)pp_if_state());
-	}
-}
-
-int pp_get_if_depth(void)
-{
-	return if_stack_idx;
-}
-
-/* #define WANT_NEAR_INDICATION */
-
-static void generic_msg(const char *s, const char *t, const char *n, va_list ap)
-{
-	fprintf(stderr, "%s:%d:%d: %s: ", pp_status.input ? pp_status.input : "stdin",
-                pp_status.line_number, pp_status.char_number, t);
-	vfprintf(stderr, s, ap);
-#ifdef WANT_NEAR_INDICATION
-	{
-		char *cpy, *p;
-		if(n)
-		{
-			cpy = pp_xstrdup(n);
-			if(!cpy)
-				goto end;
-			for (p = cpy; *p; p++) if(!isprint(*p)) *p = ' ';
-			fprintf(stderr, " near '%s'", cpy);
-			free(cpy);
-		}
-	}
-end:
-#endif
-	fprintf(stderr, "\n");
-}
-
-int ppy_error(const char *s, ...)
-{
-	va_list ap;
-	va_start(ap, s);
-	generic_msg(s, "error", ppy_text, ap);
-	va_end(ap);
-	exit(1);
-}
-
-int ppy_warning(const char *s, ...)
-{
-	va_list ap;
-	va_start(ap, s);
-	generic_msg(s, "warning", ppy_text, ap);
-	va_end(ap);
-	return 0;
-}
-
-void pp_internal_error(const char *file, int line, const char *s, ...)
-{
-	va_list ap;
-	va_start(ap, s);
-	fprintf(stderr, "Internal error (please report) %s %d: ", file, line);
-	vfprintf(stderr, s, ap);
-	fprintf(stderr, "\n");
-	va_end(ap);
-	exit(3);
-}
diff --git a/mingw-w64-tools/widl/src/wpp/wpp.c b/mingw-w64-tools/widl/src/wpp/wpp.c
index 60d6681..0e26121 100644
--- a/mingw-w64-tools/widl/src/wpp/wpp.c
+++ b/mingw-w64-tools/widl/src/wpp/wpp.c
@@ -22,43 +22,587 @@
 #include "config.h"
 #include "wine/port.h"
 
-#include <time.h>
+#include <assert.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <time.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
 
 #include "wpp_private.h"
 #include "wine/wpp.h"
 
+struct pp_status pp_status;
+
+#define HASHKEY		2039
+
+static struct list pp_defines[HASHKEY];
+
+#define MAXIFSTACK	64
+static pp_if_state_t if_stack[MAXIFSTACK];
+static int if_stack_idx = 0;
+
 int ppy_debug, pp_flex_debug;
 
 struct define
 {
-    struct define *next;
+    struct list    entry;
     char          *name;
     char          *value;
 };
 
-static struct define *cmdline_defines;
+static struct list cmdline_defines = LIST_INIT( cmdline_defines );
+
+void *pp_xmalloc(size_t size)
+{
+    void *res;
+
+    assert(size > 0);
+    res = malloc(size);
+    if(res == NULL)
+    {
+        fprintf( stderr, "Virtual memory exhausted\n" );
+        exit(1);
+    }
+    return res;
+}
+
+void *pp_xrealloc(void *p, size_t size)
+{
+    void *res;
+
+    assert(size > 0);
+    res = realloc(p, size);
+    if(res == NULL)
+    {
+        fprintf( stderr, "Virtual memory exhausted\n" );
+        exit(1);
+    }
+    return res;
+}
+
+char *pp_xstrdup(const char *str)
+{
+	int len = strlen(str)+1;
+	return memcpy(pp_xmalloc(len), str, len);
+}
+
+char *wpp_lookup(const char *name, int type, const char *parent_name,
+                 char **include_path, int include_path_count)
+{
+    char *cpy;
+    char *cptr;
+    char *path;
+    const char *ccptr;
+    int i, fd;
+
+    cpy = pp_xmalloc(strlen(name)+1);
+    cptr = cpy;
+
+    for(ccptr = name; *ccptr; ccptr++)
+    {
+        /* Convert to forward slash */
+        if(*ccptr == '\\') {
+            /* kill double backslash */
+            if(ccptr[1] == '\\')
+                ccptr++;
+            *cptr = '/';
+        }else {
+            *cptr = *ccptr;
+        }
+        cptr++;
+    }
+    *cptr = '\0';
+
+    if(type && parent_name)
+    {
+        /* Search directory of parent include and then -I path */
+        const char *p;
+
+        if ((p = strrchr( parent_name, '/' ))) p++;
+        else p = parent_name;
+        path = pp_xmalloc( (p - parent_name) + strlen(cpy) + 1 );
+        memcpy( path, parent_name, p - parent_name );
+        strcpy( path + (p - parent_name), cpy );
+        fd = open( path, O_RDONLY );
+        if (fd != -1)
+        {
+            close( fd );
+            free( cpy );
+            return path;
+        }
+        free( path );
+    }
+    /* Search -I path */
+    for(i = 0; i < include_path_count; i++)
+    {
+        path = pp_xmalloc(strlen(include_path[i]) + strlen(cpy) + 2);
+        strcpy(path, include_path[i]);
+        strcat(path, "/");
+        strcat(path, cpy);
+        fd = open( path, O_RDONLY );
+        if (fd != -1)
+        {
+            close( fd );
+            free( cpy );
+            return path;
+        }
+        free( path );
+    }
+    free( cpy );
+    return NULL;
+}
+
+/* Don't comment on the hash, it's primitive but functional... */
+static int pphash(const char *str)
+{
+	int sum = 0;
+	while(*str)
+		sum += *str++;
+	return sum % HASHKEY;
+}
+
+pp_entry_t *pplookup(const char *ident)
+{
+	int idx;
+	pp_entry_t *ppp;
+
+	if(!ident)
+		return NULL;
+	idx = pphash(ident);
+        LIST_FOR_EACH_ENTRY( ppp, &pp_defines[idx], pp_entry_t, entry )
+	{
+		if(!strcmp(ident, ppp->ident))
+			return ppp;
+	}
+	return NULL;
+}
+
+static void free_pp_entry( pp_entry_t *ppp, int idx )
+{
+	if(ppp->iep)
+	{
+                list_remove( &ppp->iep->entry );
+		free(ppp->iep->filename);
+		free(ppp->iep);
+	}
+        list_remove( &ppp->entry );
+	free(ppp);
+}
+
+/* initialize the define state */
+void pp_init_define_state(void)
+{
+    int i;
+
+    for (i = 0; i < HASHKEY; i++) list_init( &pp_defines[i] );
+}
+
+/* free the current define state */
+void pp_free_define_state(void)
+{
+    int i;
+    pp_entry_t *ppp, *ppp2;
+
+    for (i = 0; i < HASHKEY; i++)
+    {
+        LIST_FOR_EACH_ENTRY_SAFE( ppp, ppp2, &pp_defines[i], pp_entry_t, entry )
+        {
+            free( ppp->ident );
+            free( ppp->subst.text );
+            free( ppp->filename );
+            free_pp_entry( ppp, i );
+        }
+    }
+}
+
+void pp_del_define(const char *name)
+{
+	pp_entry_t *ppp;
+	int idx = pphash(name);
+
+	if((ppp = pplookup(name)) == NULL)
+	{
+		if(pp_status.pedantic)
+			ppy_warning("%s was not defined", name);
+		return;
+	}
+
+	if(pp_status.debug)
+		printf("Deleting (%s, %d) <%s>\n", pp_status.input, pp_status.line_number, name);
+
+	free( ppp->ident );
+	free( ppp->subst.text );
+	free( ppp->filename );
+	free_pp_entry( ppp, idx );
+}
+
+pp_entry_t *pp_add_define(const char *def, const char *text)
+{
+	int len;
+	char *cptr;
+	int idx;
+	pp_entry_t *ppp;
+
+	idx = pphash(def);
+	if((ppp = pplookup(def)) != NULL)
+	{
+		if(pp_status.pedantic)
+			ppy_warning("Redefinition of %s\n\tPrevious definition: %s:%d", def, ppp->filename, ppp->linenumber);
+		pp_del_define(def);
+	}
+	ppp = pp_xmalloc(sizeof(pp_entry_t));
+	memset( ppp, 0, sizeof(*ppp) );
+	ppp->ident = pp_xstrdup(def);
+	ppp->type = def_define;
+	ppp->subst.text = text ? pp_xstrdup(text) : NULL;
+	ppp->filename = pp_xstrdup(pp_status.input ? pp_status.input : "<internal or cmdline>");
+	ppp->linenumber = pp_status.input ? pp_status.line_number : 0;
+        list_add_head( &pp_defines[idx], &ppp->entry );
+	if(ppp->subst.text)
+	{
+		/* Strip trailing white space from subst text */
+		len = strlen(ppp->subst.text);
+		while(len && strchr(" \t\r\n", ppp->subst.text[len-1]))
+		{
+			ppp->subst.text[--len] = '\0';
+		}
+		/* Strip leading white space from subst text */
+		for(cptr = ppp->subst.text; *cptr && strchr(" \t\r", *cptr); cptr++)
+		;
+		if(ppp->subst.text != cptr)
+			memmove(ppp->subst.text, cptr, strlen(cptr)+1);
+	}
+	if(pp_status.debug)
+		printf("Added define (%s, %d) <%s> to <%s>\n", pp_status.input, pp_status.line_number, ppp->ident, ppp->subst.text ? ppp->subst.text : "(null)");
+
+	return ppp;
+}
+
+pp_entry_t *pp_add_macro(char *id, char *args[], int nargs, mtext_t *exp)
+{
+	int idx;
+	pp_entry_t *ppp;
+
+	idx = pphash(id);
+	if((ppp = pplookup(id)) != NULL)
+	{
+		if(pp_status.pedantic)
+			ppy_warning("Redefinition of %s\n\tPrevious definition: %s:%d", id, ppp->filename, ppp->linenumber);
+		pp_del_define(id);
+	}
+	ppp = pp_xmalloc(sizeof(pp_entry_t));
+	memset( ppp, 0, sizeof(*ppp) );
+	ppp->ident	= id;
+	ppp->type	= def_macro;
+	ppp->margs	= args;
+	ppp->nargs	= nargs;
+	ppp->subst.mtext= exp;
+	ppp->filename = pp_xstrdup(pp_status.input ? pp_status.input : "<internal or cmdline>");
+	ppp->linenumber = pp_status.input ? pp_status.line_number : 0;
+        list_add_head( &pp_defines[idx], &ppp->entry );
+	if(pp_status.debug)
+	{
+		fprintf(stderr, "Added macro (%s, %d) <%s(%d)> to <", pp_status.input, pp_status.line_number, ppp->ident, nargs);
+		for(; exp; exp = exp->next)
+		{
+			switch(exp->type)
+			{
+			case exp_text:
+				fprintf(stderr, " \"%s\" ", exp->subst.text);
+				break;
+			case exp_stringize:
+				fprintf(stderr, " #(%d) ", exp->subst.argidx);
+				break;
+			case exp_concat:
+				fprintf(stderr, "##");
+				break;
+			case exp_subst:
+				fprintf(stderr, " <%d> ", exp->subst.argidx);
+				break;
+			}
+		}
+		fprintf(stderr, ">\n");
+	}
+	return ppp;
+}
+
+
+/*
+ *-------------------------------------------------------------------------
+ * Include management
+ *-------------------------------------------------------------------------
+ */
+#if defined(_WIN32) || defined(__MSDOS__)
+#define INCLUDESEPARATOR	";"
+#else
+#define INCLUDESEPARATOR	":"
+#endif
+
+static char **includepath;
+static int nincludepath = 0;
+
+void wpp_add_include_path(const char *path)
+{
+	char *tok;
+	char *cpy = pp_xstrdup(path);
+
+	tok = strtok(cpy, INCLUDESEPARATOR);
+	while(tok)
+	{
+		if(*tok) {
+			char *dir;
+			char *cptr;
+
+			dir = pp_xstrdup(tok);
+			for(cptr = dir; *cptr; cptr++)
+			{
+				/* Convert to forward slash */
+				if(*cptr == '\\')
+					*cptr = '/';
+			}
+			/* Kill eventual trailing '/' */
+			if(*(cptr = dir + strlen(dir)-1) == '/')
+				*cptr = '\0';
+
+			/* Add to list */
+			includepath = pp_xrealloc(includepath, (nincludepath+1) * sizeof(*includepath));
+			includepath[nincludepath] = dir;
+			nincludepath++;
+		}
+		tok = strtok(NULL, INCLUDESEPARATOR);
+	}
+	free(cpy);
+}
+
+char *wpp_find_include(const char *name, const char *parent_name)
+{
+    return wpp_lookup(name, !!parent_name, parent_name, includepath, nincludepath);
+}
+
+void *pp_open_include(const char *name, int type, const char *parent_name, char **newpath)
+{
+    char *path;
+    void *fp;
+
+    if (!(path = wpp_lookup(name, type, parent_name, includepath, nincludepath))) return NULL;
+    fp = fopen(path, "rt");
+
+    if (fp)
+    {
+        if (pp_status.debug)
+            printf("Going to include <%s>\n", path);
+        if (newpath) *newpath = path;
+        else free( path );
+        return fp;
+    }
+    free( path );
+    return NULL;
+}
+
+/*
+ *-------------------------------------------------------------------------
+ * #if, #ifdef, #ifndef, #else, #elif and #endif state management
+ *
+ * #if state transitions are made on basis of the current TOS and the next
+ * required state. The state transitions are required to housekeep because
+ * #if:s can be nested. The ignore case is activated to prevent output from
+ * within a false clause.
+ * Some special cases come from the fact that the #elif cases are not
+ * binary, but three-state. The problem is that all other elif-cases must
+ * be false when one true one has been found. A second problem is that the
+ * #else clause is a final clause. No extra #else:s may follow.
+ *
+ * The states mean:
+ * if_true	Process input to output
+ * if_false	Process input but no output
+ * if_ignore	Process input but no output
+ * if_elif	Process input but no output
+ * if_elsefalse	Process input but no output
+ * if_elsettrue	Process input to output
+ *
+ * The possible state-sequences are [state(stack depth)] (rest can be deduced):
+ *	TOS		#if 1		#else			#endif
+ *	if_true(n)	if_true(n+1)	if_elsefalse(n+1)
+ *	if_false(n)	if_ignore(n+1)	if_ignore(n+1)
+ *	if_elsetrue(n)	if_true(n+1)	if_elsefalse(n+1)
+ *	if_elsefalse(n)	if_ignore(n+1)	if_ignore(n+1)
+ *	if_elif(n)	if_ignore(n+1)	if_ignore(n+1)
+ *	if_ignore(n)	if_ignore(n+1)	if_ignore(n+1)
+ *
+ *	TOS		#if 1		#elif 0		#else		#endif
+ *	if_true(n)	if_true(n+1)	if_elif(n+1)	if_elif(n+1)
+ *	if_false(n)	if_ignore(n+1)	if_ignore(n+1)	if_ignore(n+1)
+ *	if_elsetrue(n)	if_true(n+1)	if_elif(n+1)	if_elif(n+1)
+ *	if_elsefalse(n)	if_ignore(n+1)	if_ignore(n+1)	if_ignore(n+1)
+ *	if_elif(n)	if_ignore(n+1)	if_ignore(n+1)	if_ignore(n+1)
+ *	if_ignore(n)	if_ignore(n+1)	if_ignore(n+1)	if_ignore(n+1)
+ *
+ *	TOS		#if 0		#elif 1		#else		#endif
+ *	if_true(n)	if_false(n+1)	if_true(n+1)	if_elsefalse(n+1)
+ *	if_false(n)	if_ignore(n+1)	if_ignore(n+1)	if_ignore(n+1)
+ *	if_elsetrue(n)	if_false(n+1)	if_true(n+1)	if_elsefalse(n+1)
+ *	if_elsefalse(n)	if_ignore(n+1)	if_ignore(n+1)	if_ignore(n+1)
+ *	if_elif(n)	if_ignore(n+1)	if_ignore(n+1)	if_ignore(n+1)
+ *	if_ignore(n)	if_ignore(n+1)	if_ignore(n+1)	if_ignore(n+1)
+ *
+ *-------------------------------------------------------------------------
+ */
+static const char * const pp_if_state_str[] = {
+	"if_false",
+	"if_true",
+	"if_elif",
+	"if_elsefalse",
+	"if_elsetrue",
+	"if_ignore"
+};
+
+void pp_push_if(pp_if_state_t s)
+{
+	if(if_stack_idx >= MAXIFSTACK)
+		pp_internal_error(__FILE__, __LINE__, "#if-stack overflow; #{if,ifdef,ifndef} nested too deeply (> %d)", MAXIFSTACK);
+
+	if(pp_flex_debug)
+		fprintf(stderr, "Push if %s:%d: %s(%d) -> %s(%d)\n", pp_status.input, pp_status.line_number, pp_if_state_str[pp_if_state()], if_stack_idx, pp_if_state_str[s], if_stack_idx+1);
+
+	if_stack[if_stack_idx++] = s;
+
+	switch(s)
+	{
+	case if_true:
+	case if_elsetrue:
+		break;
+	case if_false:
+	case if_elsefalse:
+	case if_elif:
+	case if_ignore:
+		pp_push_ignore_state();
+		break;
+	default:
+		pp_internal_error(__FILE__, __LINE__, "Invalid pp_if_state (%d)", (int)pp_if_state());
+	}
+}
+
+pp_if_state_t pp_pop_if(void)
+{
+	if(if_stack_idx <= 0)
+	{
+		ppy_error("#{endif,else,elif} without #{if,ifdef,ifndef} (#if-stack underflow)");
+		return if_error;
+	}
+
+	switch(pp_if_state())
+	{
+	case if_true:
+	case if_elsetrue:
+		break;
+	case if_false:
+	case if_elsefalse:
+	case if_elif:
+	case if_ignore:
+		pp_pop_ignore_state();
+		break;
+	default:
+		pp_internal_error(__FILE__, __LINE__, "Invalid pp_if_state (%d)", (int)pp_if_state());
+	}
+
+	if(pp_flex_debug)
+		fprintf(stderr, "Pop if %s:%d: %s(%d) -> %s(%d)\n",
+				pp_status.input,
+				pp_status.line_number,
+				pp_if_state_str[pp_if_state()],
+				if_stack_idx,
+				pp_if_state_str[if_stack[if_stack_idx <= 1 ? if_true : if_stack_idx-2]],
+				if_stack_idx-1);
+
+	return if_stack[--if_stack_idx];
+}
+
+pp_if_state_t pp_if_state(void)
+{
+	if(!if_stack_idx)
+		return if_true;
+	else
+		return if_stack[if_stack_idx-1];
+}
+
+
+void pp_next_if_state(int i)
+{
+	switch(pp_if_state())
+	{
+	case if_true:
+	case if_elsetrue:
+		pp_push_if(i ? if_true : if_false);
+		break;
+	case if_false:
+	case if_elsefalse:
+	case if_elif:
+	case if_ignore:
+		pp_push_if(if_ignore);
+		break;
+	default:
+		pp_internal_error(__FILE__, __LINE__, "Invalid pp_if_state (%d) in #{if,ifdef,ifndef} directive", (int)pp_if_state());
+	}
+}
+
+int pp_get_if_depth(void)
+{
+	return if_stack_idx;
+}
+
+static void generic_msg(const char *s, const char *t, const char *n, va_list ap)
+{
+	fprintf(stderr, "%s:%d:%d: %s: ", pp_status.input ? pp_status.input : "stdin",
+                pp_status.line_number, pp_status.char_number, t);
+	vfprintf(stderr, s, ap);
+	fprintf(stderr, "\n");
+}
+
+int ppy_error(const char *s, ...)
+{
+	va_list ap;
+	va_start(ap, s);
+	generic_msg(s, "error", ppy_text, ap);
+	va_end(ap);
+	exit(1);
+}
+
+int ppy_warning(const char *s, ...)
+{
+	va_list ap;
+	va_start(ap, s);
+	generic_msg(s, "warning", ppy_text, ap);
+	va_end(ap);
+	return 0;
+}
+
+void pp_internal_error(const char *file, int line, const char *s, ...)
+{
+	va_list ap;
+	va_start(ap, s);
+	fprintf(stderr, "Internal error (please report) %s %d: ", file, line);
+	vfprintf(stderr, s, ap);
+	fprintf(stderr, "\n");
+	va_end(ap);
+	exit(3);
+}
 
 static void add_cmdline_defines(void)
 {
     struct define *def;
 
-    for (def = cmdline_defines; def; def = def->next)
+    LIST_FOR_EACH_ENTRY( def, &cmdline_defines, struct define, entry )
     {
         if (def->value) pp_add_define( def->name, def->value );
     }
 }
 
-static void del_cmdline_defines(void)
-{
-    struct define *def;
-
-    for (def = cmdline_defines; def; def = def->next)
-    {
-        if (def->value) pp_del_define( def->name );
-    }
-}
-
 static void add_special_defines(void)
 {
     time_t now = time(NULL);
@@ -72,63 +616,33 @@
     pp_add_define( "__TIME__", buf );
 
     ppp = pp_add_define( "__FILE__", "" );
-    if(ppp)
-        ppp->type = def_special;
+    ppp->type = def_special;
 
     ppp = pp_add_define( "__LINE__", "" );
-    if(ppp)
-        ppp->type = def_special;
+    ppp->type = def_special;
 }
 
-static void del_special_defines(void)
-{
-    pp_del_define( "__DATE__" );
-    pp_del_define( "__TIME__" );
-    pp_del_define( "__FILE__" );
-    pp_del_define( "__LINE__" );
-}
-
-
 /* add a define to the preprocessor list */
-int wpp_add_define( const char *name, const char *value )
+static void wpp_add_define( const char *name, const char *value )
 {
     struct define *def;
 
     if (!value) value = "";
 
-    for (def = cmdline_defines; def; def = def->next)
+    LIST_FOR_EACH_ENTRY( def, &cmdline_defines, struct define, entry )
     {
         if (!strcmp( def->name, name ))
         {
-            char *new_value = pp_xstrdup(value);
-            if(!new_value)
-                return 1;
             free( def->value );
-            def->value = new_value;
-
-            return 0;
+            def->value = pp_xstrdup(value);
+            return;
         }
     }
 
     def = pp_xmalloc( sizeof(*def) );
-    if(!def)
-        return 1;
-    def->next  = cmdline_defines;
     def->name  = pp_xstrdup(name);
-    if(!def->name)
-    {
-        free(def);
-        return 1;
-    }
     def->value = pp_xstrdup(value);
-    if(!def->value)
-    {
-        free(def->name);
-        free(def);
-        return 1;
-    }
-    cmdline_defines = def;
-    return 0;
+    list_add_head( &cmdline_defines, &def->entry );
 }
 
 
@@ -137,7 +651,7 @@
 {
     struct define *def;
 
-    for (def = cmdline_defines; def; def = def->next)
+    LIST_FOR_EACH_ENTRY( def, &cmdline_defines, struct define, entry )
     {
         if (!strcmp( def->name, name ))
         {
@@ -150,17 +664,15 @@
 
 
 /* add a command-line define of the form NAME=VALUE */
-int wpp_add_cmdline_define( const char *value )
+void wpp_add_cmdline_define( const char *value )
 {
     char *p;
     char *str = pp_xstrdup(value);
-    if(!str)
-        return 1;
+
     p = strchr( str, '=' );
     if (p) *p++ = 0;
     wpp_add_define( str, p );
     free( str );
-    return 0;
 }
 
 
@@ -188,23 +700,14 @@
     pp_status.input = NULL;
     pp_status.line_number = 1;
     pp_status.char_number = 1;
-    pp_status.state = 0;
 
-    ret = pp_push_define_state();
-    if(ret)
-        return ret;
+    pp_init_define_state();
     add_cmdline_defines();
     add_special_defines();
 
     if (!input) pp_status.file = stdin;
     else if (!(pp_status.file = fopen(input, "rt")))
-    {
         ppy_error("Could not open %s\n", input);
-        del_special_defines();
-        del_cmdline_defines();
-        pp_pop_define_state();
-        return 2;
-    }
 
     pp_status.input = input ? pp_xstrdup(input) : NULL;
 
@@ -212,8 +715,6 @@
     pp_writestring("# 1 \"%s\" 1\n", input ? input : "");
 
     ret = ppy_parse();
-    /* If there were errors during processing, return an error code */
-    if (!ret && pp_status.state) ret = pp_status.state;
 
     if (input)
     {
@@ -222,8 +723,6 @@
     }
     /* Clean if_stack, it could remain dirty on errors */
     while (pp_get_if_depth()) pp_pop_if();
-    del_special_defines();
-    del_cmdline_defines();
-    pp_pop_define_state();
+    pp_free_define_state();
     return ret;
 }
diff --git a/mingw-w64-tools/widl/src/wpp/wpp_private.h b/mingw-w64-tools/widl/src/wpp/wpp_private.h
index ab4296b..fbcd3c0 100644
--- a/mingw-w64-tools/widl/src/wpp/wpp_private.h
+++ b/mingw-w64-tools/widl/src/wpp/wpp_private.h
@@ -22,6 +22,7 @@
 
 #include <stdio.h>
 #include <string.h>
+#include "wine/list.h"
 
 struct pp_entry;	/* forward */
 /*
@@ -30,27 +31,12 @@
  * are protected in the #ifndef/#endif way.
  */
 typedef struct includelogicentry {
-	struct includelogicentry *next;
-	struct includelogicentry *prev;
+	struct list entry;
 	struct pp_entry	*ppp;		/* The define which protects the file */
 	char		*filename;	/* The filename of the include */
 } includelogicentry_t;
 
 /*
- * The arguments of a macrodefinition
- */
-typedef enum {
-	arg_single,
-	arg_list
-} def_arg_t;
-
-typedef struct marg {
-	def_arg_t	type;	/* Normal or ... argument */
-	char		*arg;	/* The textual argument */
-	int		nnl;	/* Number of newlines in the text to subst */
-} marg_t;
-
-/*
  * The expansiontext of a macro
  */
 typedef enum {
@@ -81,11 +67,10 @@
 } def_type_t;
 
 typedef struct pp_entry {
-	struct pp_entry *next;
-	struct pp_entry *prev;
+	struct list entry;
 	def_type_t	type;		/* Define or macro */
 	char		*ident;		/* The key */
-	marg_t		**margs;	/* Macro arguments array or NULL if none */
+	char		**margs;	/* Macro arguments array or NULL if none */
 	int		nargs;
 	union {
 		mtext_t	*mtext;		/* The substitution sequence or NULL if none */
@@ -132,21 +117,13 @@
     int seen_junk;         /* Set when junk is seen */
 } include_state_t;
 
-#define SIZE_CHAR	1
-#define SIZE_SHORT	2
-#define SIZE_INT	3
-#define SIZE_LONG	4
-#define SIZE_LONGLONG	5
+#define SIZE_INT	1
+#define SIZE_LONG	2
+#define SIZE_LONGLONG	3
 #define SIZE_MASK	0x00ff
 #define FLAG_SIGNED	0x0100
 
 typedef enum {
-#if 0
-	cv_schar  = SIZE_CHAR + FLAG_SIGNED,
-	cv_uchar  = SIZE_CHAR,
-	cv_sshort = SIZE_SHORT + FLAG_SIGNED,
-	cv_ushort = SIZE_SHORT,
-#endif
 	cv_sint   = SIZE_INT + FLAG_SIGNED,
 	cv_uint   = SIZE_INT,
 	cv_slong  = SIZE_LONG + FLAG_SIGNED,
@@ -158,12 +135,6 @@
 typedef struct cval {
 	ctype_t	type;
 	union {
-#if 0
-		signed char	sc;	/* Explicitly signed because compilers are stupid */
-		unsigned char	uc;
-		short		ss;
-		unsigned short	us;
-#endif
 		int		si;
 		unsigned int	ui;
 		long		sl;
@@ -179,10 +150,10 @@
 void *pp_xrealloc(void *, size_t);
 char *pp_xstrdup(const char *str);
 pp_entry_t *pplookup(const char *ident);
-int pp_push_define_state(void);
-void pp_pop_define_state(void);
+void pp_init_define_state(void);
+void pp_free_define_state(void);
 pp_entry_t *pp_add_define(const char *def, const char *text);
-pp_entry_t *pp_add_macro(char *ident, marg_t *args[], int nargs, mtext_t *exp);
+pp_entry_t *pp_add_macro(char *ident, char *args[], int nargs, mtext_t *exp);
 void pp_del_define(const char *name);
 void *pp_open_include(const char *name, int type, const char *parent_name, char **newpath);
 void pp_push_if(pp_if_state_t s);
@@ -197,8 +168,6 @@
 #define __attribute__(x)  /*nothing*/
 #endif
 
-extern const struct wpp_callbacks *wpp_callbacks;
-
 int ppy_error(const char *s, ...) __attribute__((format (printf, 1, 2)));
 int ppy_warning(const char *s, ...) __attribute__((format (printf, 1, 2)));
 void pp_internal_error(const char *file, int line, const char *s, ...) __attribute__((format (printf, 3, 4)));
@@ -208,17 +177,16 @@
 struct pp_status
 {
     char *input;        /* current input file name */
-    void *file;         /* current input file descriptor */
+    FILE *file;         /* current input file descriptor */
     int line_number;    /* current line number */
     int char_number;    /* current char number in line */
-    int state;          /* current error state */
     int pedantic;       /* pedantic option */
     int debug;          /* debug messages flag */
 };
 
 extern struct pp_status pp_status;
 extern include_state_t pp_incl_state;
-extern includelogicentry_t *pp_includelogiclist;
+extern struct list pp_includelogiclist;
 
 /*
  * From ppl.l
diff --git a/mingw-w64-tools/widl/src/write_msft.c b/mingw-w64-tools/widl/src/write_msft.c
index 440bb23..5728f04 100644
--- a/mingw-w64-tools/widl/src/write_msft.c
+++ b/mingw-w64-tools/widl/src/write_msft.c
@@ -1263,19 +1263,27 @@
 static HRESULT set_custdata(msft_typelib_t *typelib, REFGUID guid,
                             int vt, const void *value, int *offset)
 {
-    MSFT_GuidEntry guidentry;
     int guidoffset;
     int custoffset;
     int *custdata;
     int data_out;
+    int hash_key;
 
-    guidentry.guid = *guid;
+    hash_key = ctl2_hash_guid(guid);
+    guidoffset = ctl2_find_guid(typelib, hash_key, guid);
+    if(guidoffset == -1) {
+        /* add GUID that was not already present */
+        MSFT_GuidEntry guidentry;
+        guidentry.guid = *guid;
 
-    guidentry.hreftype = -1;
-    guidentry.next_hash = -1;
+        guidentry.hreftype = -1;
+        guidentry.next_hash = -1;
 
-    guidoffset = ctl2_alloc_guid(typelib, &guidentry);
+        guidoffset = ctl2_alloc_guid(typelib, &guidentry);
+    }
+
     if(vt == VT_BSTR)
+        /* TODO midl appears to share a single reference if the same string is used as custdata in multiple places */
         write_string_value(typelib, &data_out, value);
     else
         write_int_value(typelib, &data_out, vt, *(int*)value);
@@ -1291,6 +1299,25 @@
     return S_OK;
 }
 
+static HRESULT set_custdata_attr(msft_typelib_t *typelib, attr_custdata_t *custdata, int *offset)
+{
+    switch(custdata->pval->type) {
+        case EXPR_STRLIT:
+        case EXPR_WSTRLIT:
+            set_custdata(typelib, &custdata->id, VT_BSTR, custdata->pval->u.sval, offset);
+            break;
+        case EXPR_HEXNUM:
+        case EXPR_NUM:
+            set_custdata(typelib, &custdata->id, VT_I4, &custdata->pval->u.lval, offset);
+            break;
+        default:
+            error("custom() attribute with unknown type\n");
+            break;
+    }
+
+    return S_OK;
+}
+
 static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, var_t *func, int index)
 {
     int offset, name_offset;
@@ -1298,12 +1325,14 @@
     int i, id, next_idx;
     int decoded_size, extra_attr = 0;
     int num_params = 0, num_optional = 0, num_defaults = 0;
+    int has_arg_custdata = 0;
     var_t *arg;
     unsigned char *namedata;
     const attr_t *attr;
     unsigned int funcflags = 0, callconv = 4 /* CC_STDCALL */;
     unsigned int funckind, invokekind = 1 /* INVOKE_FUNC */;
     int help_context = 0, help_string_context = 0, help_string_offset = -1;
+    int func_custdata_offset = -1;
     int entry = -1, entry_is_ord = 0;
     int lcid_retval_count = 0;
 
@@ -1337,6 +1366,8 @@
                 num_defaults++;
             else if(attr->type == ATTR_OPTIONAL)
                 num_optional++;
+            else if(attr->type == ATTR_CUSTOM)
+                has_arg_custdata = 1;
         }
       }
 
@@ -1350,6 +1381,9 @@
         case ATTR_BINDABLE:
             funcflags |= 0x4; /* FUNCFLAG_FBINDABLE */
             break;
+        case ATTR_CUSTOM:
+            set_custdata_attr(typeinfo->typelib, attr->u.pval, &func_custdata_offset);
+            break;
         case ATTR_DEFAULTBIND:
             funcflags |= 0x20; /* FUNCFLAG_FDEFAULTBIND */
             break;
@@ -1430,6 +1464,10 @@
         }
     }
 
+    if(has_arg_custdata || func_custdata_offset != -1) {
+        extra_attr = max(extra_attr, 7 + num_params);
+    }
+
     /* allocate type data space for us */
     typedata_size = 0x18 + extra_attr * sizeof(int) + (num_params * (num_defaults ? 16 : 12));
 
@@ -1476,6 +1514,7 @@
     typedata[2] = funcflags;
     typedata[3] = ((52 /*sizeof(FUNCDESC)*/ + decoded_size) << 16) | typeinfo->typeinfo->cbSizeVft;
     typedata[4] = (next_idx << 16) | (callconv << 8) | (invokekind << 3) | funckind;
+    if(has_arg_custdata || func_custdata_offset != -1) typedata[4] |= 0x0080;
     if(num_defaults) typedata[4] |= 0x1000;
     if(entry_is_ord) typedata[4] |= 0x2000;
     typedata[5] = (num_optional << 16) | num_params;
@@ -1486,6 +1525,10 @@
     typedata[3] += (24 /*sizeof(PARAMDESCEX)*/ * num_defaults) << 16;
 
     switch(extra_attr) {
+    default:
+        if(extra_attr > 7 + num_params) warning("unknown number of optional attrs\n");
+        /* typedata[13..+num_params] = arg_custdata_offset handled in below loop */
+    case 7: typedata[12] = func_custdata_offset;
     case 6: typedata[11] = help_string_context;
     case 5: typedata[10] = -1;
     case 4: typedata[9] = -1;
@@ -1494,8 +1537,6 @@
     case 1: typedata[6] = help_context;
     case 0:
         break;
-    default:
-        warning("unknown number of optional attrs\n");
     }
 
     if (type_function_get_args(func->declspec.type))
@@ -1506,12 +1547,16 @@
         int paramflags = 0;
         int *paramdata = typedata + 6 + extra_attr + (num_defaults ? num_params : 0) + i * 3;
         int *defaultdata = num_defaults ? typedata + 6 + extra_attr + i : NULL;
+        int arg_custdata_offset = -1;
 
         if(defaultdata) *defaultdata = -1;
 
 	    encode_var(typeinfo->typelib, arg->declspec.type, arg, paramdata, &decoded_size);
         if (arg->attrs) LIST_FOR_EACH_ENTRY( attr, arg->attrs, const attr_t, entry ) {
             switch(attr->type) {
+            case ATTR_CUSTOM:
+                set_custdata_attr(typeinfo->typelib, attr->u.pval, &arg_custdata_offset);
+                break;
             case ATTR_DEFAULTVALUE:
               {
                 paramflags |= 0x30; /* PARAMFLAG_FHASDEFAULT | PARAMFLAG_FOPT */
@@ -1539,6 +1584,9 @@
                 chat("unhandled param attr %d\n", attr->type);
                 break;
             }
+            if(extra_attr > 7 + i) {
+                typedata[13+i] = arg_custdata_offset;
+            }
         }
 	paramdata[1] = -1;
 	paramdata[2] = paramflags;
@@ -1621,6 +1669,7 @@
 {
     int offset, id;
     unsigned int typedata_size;
+    int extra_attr = 0;
     INT *typedata;
     unsigned int var_datawidth, var_alignment = 0;
     int var_type_size, var_kind = 0 /* VAR_PERINSTANCE */; 
@@ -1629,6 +1678,7 @@
     const attr_t *attr;
     unsigned char *namedata;
     int var_num = (typeinfo->typeinfo->cElement >> 16) & 0xffff;
+    int var_custdata_offset = -1;
 
     if (!var->name)
         var->name = gen_name();
@@ -1643,6 +1693,10 @@
         case ATTR_BINDABLE:
             varflags |= 0x04; /* VARFLAG_FBINDABLE */
             break;
+        case ATTR_CUSTOM:
+            extra_attr = max(extra_attr,4);
+            set_custdata_attr(typeinfo->typelib, attr->u.pval, &var_custdata_offset);
+            break;
         case ATTR_DEFAULTBIND:
             varflags |= 0x20; /* VARFLAG_FDEFAULTBIND */
             break;
@@ -1686,7 +1740,7 @@
     }
 
     /* allocate type data space for us */
-    typedata_size = 0x14;
+    typedata_size = 0x14 + extra_attr * sizeof(int);
 
     if (!typeinfo->var_data) {
         typeinfo->var_data = xmalloc(0x100);
@@ -1762,6 +1816,18 @@
     /* add type description size to total required allocation */
     typedata[3] += var_type_size << 16 | var_kind;
 
+    switch(extra_attr) {
+    case 5: typedata[9] = -1 /*help_string_context*/;
+    case 4: typedata[8] = var_custdata_offset;
+    case 3: typedata[7] = -1;
+    case 2: typedata[6] = -1 /*help_string_offset*/;
+    case 1: typedata[5] = -1 /*help_context*/;
+    case 0:
+        break;
+    default:
+        warning("unknown number of optional attrs\n");
+    }
+
     /* fix type alignment */
     alignment = (typeinfo->typeinfo->typekind >> 11) & 0x1f;
     if (alignment < var_alignment) {
@@ -1871,7 +1937,9 @@
             if (kind == TKIND_COCLASS)
                 typeinfo->flags |= 0x20; /* TYPEFLAG_FCONTROL */
             break;
-
+        case ATTR_CUSTOM:
+            set_custdata_attr(typelib, attr->u.pval, &typeinfo->oCustData);
+            break;
         case ATTR_DLLNAME:
           {
             int offset = ctl2_alloc_string(typelib, attr->u.pval);
@@ -2700,6 +2768,7 @@
     msft_typelib_t *msft;
     int failed = 0;
     const statement_t *stmt;
+    const attr_t *attr;
     time_t cur_time;
     char *time_override;
     unsigned int version = 7 << 24 | 555; /* 7.00.0555 */
@@ -2747,6 +2816,16 @@
     set_help_string_dll(msft);
     set_help_string_context(msft);
     
+    if (typelib->attrs) LIST_FOR_EACH_ENTRY( attr, typelib->attrs, const attr_t, entry ) {
+        switch(attr->type) {
+        case ATTR_CUSTOM:
+            set_custdata_attr(msft, attr->u.pval, &msft->typelib_header.CustomDataOffset);
+            break;
+        default:
+            break;
+        }
+    }
+
     /* midl adds two sets of custom data to the library: the current unix time
        and midl's version number */
     time_override = getenv( "WIDL_TIME_OVERRIDE");
diff --git a/mingw-w64-tools/widl/wine-import.sh b/mingw-w64-tools/widl/wine-import.sh
index 1566028..49d8854 100755
--- a/mingw-w64-tools/widl/wine-import.sh
+++ b/mingw-w64-tools/widl/wine-import.sh
@@ -21,7 +21,7 @@
 	fi
 done
 
-for f in ppl.l ppl.yy.c ppy.tab.c ppy.tab.h ppy.y preproc.c wpp.c wpp_private.h
+for f in ppl.l ppl.yy.c ppy.tab.c ppy.tab.h ppy.y wpp.c wpp_private.h
 do
 	if [ ! -f $WINE_DIR/libs/wpp/$f ] && [ -f $WINE_BUILD_DIR/libs/wpp/$f ]; then
 		cp $WINE_BUILD_DIR/libs/wpp/$f src/wpp