Update android/support, llvm-libc++ and llvm-libc++abi

Merge fixes done in https://github.com/awong-dev/ndk (*1) during recent
NDK/libc++ Hackathon, plus some local changes for 64-bit.

(*) List of contributors:
  Albert J. Wong <ajwong@google.com>
  Antoine Labour <piman@chromium.org>
  Dana Jansens <danakj@chromium.org>
  David Turner <digit@android.com>
  Egor Pasko <pasko@chromium.org>
  Jonathan Roelofs <jonathan@codesourcery.com>
  Logan Chien <logan.chien@mediatek.com>
  Nico Weber <nicolasweber@gmx.de>
  Philippe Liard <pliard@chromium.org>
  William Chan <willchan@gmail.com>

Change-Id: I652780ae7155545c843edb1172920773287015c1
diff --git a/build/tools/build-cxx-stl.sh b/build/tools/build-cxx-stl.sh
index 006354e..955a3f4 100755
--- a/build/tools/build-cxx-stl.sh
+++ b/build/tools/build-cxx-stl.sh
@@ -129,16 +129,29 @@
 if [ -z "$CXX_STL" ]; then
   panic "Please use --stl=<name> to select a C++ runtime to rebuild."
 fi
-FOUND=
-for STL in $CXX_STL_LIST; do
-  if [ "$STL" = "$CXX_STL" ]; then
-    FOUND=true
-    break
-  fi
-done
-if [ -z "$FOUND" ]; then
-  panic "Invalid --stl value ('$CXX_STL'), please use one of: $CXX_STL_LIST."
-fi
+
+# Derive runtime, and normalize CXX_STL
+CXX_STL_RUNTIME=gabi++
+case $CXX_STL in
+  gabi++)
+    ;;
+  stlport)
+    ;;
+  libc++)
+    CXX_STL_RUNTIME=gabi++  # libc++abi
+    ;;
+  libc++-libc++abi)
+    CXX_STL_RUNTIME=libc++abi
+    CXX_STL=libc++
+    ;;
+  libc++-gabi++)
+    CXX_STL_RUNTIME=gabi++
+    CXX_STL=libc++
+    ;;
+  *)
+    panic "Invalid --stl value ('$CXX_STL'), please use one of: $CXX_STL_LIST."
+    ;;
+esac
 
 if [ -z "$OPTION_BUILD_DIR" ]; then
     BUILD_DIR=$NDK_TMPDIR/build-$CXX_STL
@@ -157,8 +170,13 @@
 GABIXX_SRCDIR=$BUILD_DIR/ndk/$GABIXX_SUBDIR
 STLPORT_SRCDIR=$BUILD_DIR/ndk/$STLPORT_SUBDIR
 LIBCXX_SRCDIR=$BUILD_DIR/ndk/$LIBCXX_SUBDIR
+LIBCXXABI_SRCDIR=$BUILD_DIR/ndk/$LIBCXXABI_SUBDIR
 
-LIBCXX_INCLUDES="-I$LIBCXX_SRCDIR/libcxx/include -I$ANDROID_NDK_ROOT/sources/android/support/include -I$GABIXX_SRCDIR/include"
+if [ "$CXX_STL_RUNTIME" = "gabi++" ]; then
+    LIBCXX_INCLUDES="-I$LIBCXX_SRCDIR/libcxx/include -I$ANDROID_NDK_ROOT/sources/android/support/include -I$GABIXX_SRCDIR/include"
+else
+    LIBCXX_INCLUDES="-I$LIBCXX_SRCDIR/libcxx/include -I$ANDROID_NDK_ROOT/sources/android/support/include -I$LIBCXXABI_SRCDIR/include"
+fi
 
 COMMON_CFLAGS="-fPIC -O2 -ffunction-sections -fdata-sections"
 COMMON_CXXFLAGS="-fexceptions -frtti -fuse-cxa-atexit"
@@ -170,11 +188,13 @@
 # Determine GAbi++ build parameters. Note that GAbi++ is also built as part
 # of STLport and Libc++, in slightly different ways.
 if [ "$CXX_STL" = "libc++" ]; then
-  GABIXX_INCLUDES=$LIBCXX_INCLUDES
-  # Use clang to build libc++ by default
-  if [ "$EXPLICIT_COMPILER_VERSION" != "true" ]; then
-    LLVM_VERSION=$DEFAULT_LLVM_VERSION
-  fi
+    if [ "$CXX_STL_RUNTIME" = "gabi++" ]; then
+        GABIXX_INCLUDES=$LIBCXX_INCLUDES
+    fi
+    # Use clang to build libc++ by default
+    if [ "$EXPLICIT_COMPILER_VERSION" != "true" ]; then
+        LLVM_VERSION=$DEFAULT_LLVM_VERSION
+     fi
 else
   GABIXX_INCLUDES="-I$GABIXX_SRCDIR/include"
 fi
@@ -224,8 +244,10 @@
 src/cxa.c"
 
 # Determine Libc++ build parameters
+LINKER_SCRIPT=export_symbols.txt
 LIBCXX_CFLAGS="$COMMON_CFLAGS $LIBCXX_INCLUDES -Drestrict=__restrict__"
 LIBCXX_CXXFLAGS="$COMMON_CXXFLAGS -DLIBCXXABI=1 -std=c++11"
+LIBCXX_LDFLAGS=-Wl,--version-script,\$_BUILD_SRCDIR/$LINKER_SCRIPT
 LIBCXX_SOURCES=\
 "libcxx/src/algorithm.cpp \
 libcxx/src/bind.cpp \
@@ -256,6 +278,36 @@
 libcxx/src/support/android/locale_android.cpp \
 "
 
+if [ "$CXX_STL_RUNTIME" = "libc++abi" ]; then
+    LIBCXX_SOURCES=\
+"$LIBCXX_SOURCES \
+../llvm-libc++abi/libcxxabi/src/abort_message.cpp \
+../llvm-libc++abi/libcxxabi/src/cxa_aux_runtime.cpp \
+../llvm-libc++abi/libcxxabi/src/cxa_default_handlers.cpp \
+../llvm-libc++abi/libcxxabi/src/cxa_demangle.cpp \
+../llvm-libc++abi/libcxxabi/src/cxa_exception.cpp \
+../llvm-libc++abi/libcxxabi/src/cxa_exception_storage.cpp \
+../llvm-libc++abi/libcxxabi/src/cxa_guard.cpp \
+../llvm-libc++abi/libcxxabi/src/cxa_handlers.cpp \
+../llvm-libc++abi/libcxxabi/src/cxa_new_delete.cpp \
+../llvm-libc++abi/libcxxabi/src/cxa_personality.cpp \
+../llvm-libc++abi/libcxxabi/src/cxa_unexpected.cpp \
+../llvm-libc++abi/libcxxabi/src/cxa_vector.cpp \
+../llvm-libc++abi/libcxxabi/src/cxa_virtual.cpp \
+../llvm-libc++abi/libcxxabi/src/exception.cpp \
+../llvm-libc++abi/libcxxabi/src/private_typeinfo.cpp \
+../llvm-libc++abi/libcxxabi/src/stdexcept.cpp \
+../llvm-libc++abi/libcxxabi/src/typeinfo.cpp \
+../llvm-libc++abi/libcxxabi/src/Unwind/libunwind.cpp \
+../llvm-libc++abi/libcxxabi/src/Unwind/Unwind-arm.cpp \
+../llvm-libc++abi/libcxxabi/src/Unwind/UnwindLevel1.c \
+../llvm-libc++abi/libcxxabi/src/Unwind/UnwindLevel1-gcc-ext.c \
+../llvm-libc++abi/libcxxabi/src/Unwind/UnwindRegistersRestore.S \
+../llvm-libc++abi/libcxxabi/src/Unwind/UnwindRegistersSave.S \
+../llvm-libc++abi/libcxxabi/src/Unwind/Unwind-sjlj.c \
+"
+fi
+
 # android/support files for libc++
 SUPPORT32_SOURCES=\
 "../../android/support/src/locale_support.c \
@@ -345,31 +397,25 @@
 ../../android/support/src/musl-locale/iswxdigit_l.c \
 ../../android/support/src/musl-locale/isxdigit_l.c \
 ../../android/support/src/musl-locale/langinfo.c \
-../../android/support/src/musl-locale/nl_langinfo_l.c \
 ../../android/support/src/musl-locale/strcasecmp_l.c \
 ../../android/support/src/musl-locale/strcoll.c \
-../../android/support/src/musl-locale/strcoll_l.c \
 ../../android/support/src/musl-locale/strerror_l.c \
 ../../android/support/src/musl-locale/strfmon.c \
 ../../android/support/src/musl-locale/strftime_l.c \
 ../../android/support/src/musl-locale/strncasecmp_l.c \
 ../../android/support/src/musl-locale/strxfrm.c \
-../../android/support/src/musl-locale/strxfrm_l.c \
 ../../android/support/src/musl-locale/tolower_l.c \
 ../../android/support/src/musl-locale/toupper_l.c \
 ../../android/support/src/musl-locale/towctrans_l.c \
 ../../android/support/src/musl-locale/towlower_l.c \
 ../../android/support/src/musl-locale/towupper_l.c \
 ../../android/support/src/musl-locale/wcscoll.c \
-../../android/support/src/musl-locale/wcscoll_l.c \
 ../../android/support/src/musl-locale/wcsxfrm.c \
-../../android/support/src/musl-locale/wcsxfrm_l.c \
 ../../android/support/src/musl-locale/wctrans_l.c \
 ../../android/support/src/musl-locale/wctype_l.c \
 ../../android/support/src/musl-math/frexpf.c \
 ../../android/support/src/musl-math/frexpl.c \
 ../../android/support/src/musl-math/frexp.c \
-../../android/support/src/musl-math/s_scalbln.c \
 ../../android/support/src/musl-stdio/swprintf.c \
 ../../android/support/src/musl-stdio/vwprintf.c \
 ../../android/support/src/musl-stdio/wprintf.c \
@@ -378,6 +424,18 @@
 ../../android/support/src/musl-stdio/sprintf.c \
 ../../android/support/src/musl-stdio/vprintf.c \
 ../../android/support/src/musl-stdio/vsprintf.c \
+../../android/support/src/wcstox/intscan.c \
+../../android/support/src/wcstox/floatscan.c \
+../../android/support/src/wcstox/shgetc.c \
+../../android/support/src/wcstox/wcstod.c \
+../../android/support/src/wcstox/wcstol.c \
+"
+# Replaces broken implementations in x86 libm.so
+SUPPORT32_SOURCES_x86=\
+"../../android/support/src/musl-math/scalbln.c \
+../../android/support/src/musl-math/scalblnf.c \
+../../android/support/src/musl-math/scalblnl.c \
+../../android/support/src/musl-math/scalbnl.c \
 "
 
 # android/support files for libc++
@@ -459,9 +517,9 @@
 # By default, all static libraries include hidden ELF symbols, except
 # if one uses the --visible-static option.
 if [ -z "$VISIBLE_STATIC" ]; then
-  STATIC_CXXFLAGS="-fvisibility=hidden -fvisibility-inlines-hidden"
+    STATIC_CXXFLAGS="-fvisibility=hidden -fvisibility-inlines-hidden"
 else
-  STATIC_CXXFLAGS=
+    STATIC_CXXFLAGS=
 fi
 SHARED_CXXFLAGS=
 
@@ -486,19 +544,19 @@
     EXTRA_CFLAGS=""
     EXTRA_LDFLAGS=""
     if [ "$ABI" = "armeabi-v7a-hard" ]; then
-      EXTRA_CFLAGS="-mhard-float -D_NDK_MATH_NO_SOFTFP=1"
-      EXTRA_LDFLAGS="-Wl,--no-warn-mismatch -lm_hard"
-      FLOAT_ABI="hard"
+        EXTRA_CFLAGS="-mhard-float -D_NDK_MATH_NO_SOFTFP=1"
+        EXTRA_LDFLAGS="-Wl,--no-warn-mismatch -lm_hard"
+        FLOAT_ABI="hard"
     fi
 
     if [ -n "$THUMB" ]; then
-      EXTRA_CFLAGS="$EXTRA_CFLAGS -mthumb"
+        EXTRA_CFLAGS="$EXTRA_CFLAGS -mthumb"
     fi
 
     if [ "$TYPE" = "static" -a -z "$VISIBLE_STATIC" ]; then
-      EXTRA_CXXFLAGS="$STATIC_CXXFLAGS"
+        EXTRA_CXXFLAGS="$STATIC_CXXFLAGS"
     else
-      EXTRA_CXXFLAGS="$SHARED_CXXFLAGS"
+        EXTRA_CXXFLAGS="$SHARED_CXXFLAGS"
     fi
 
     DSTDIR=$DSTDIR/$CXX_STL_SUBDIR/libs/$ABI/$THUMB
@@ -524,22 +582,22 @@
     builder_begin_android $ABI "$BUILDDIR" "$GCCVER" "$LLVM_VERSION" "$MAKEFILE"
 
     builder_set_dstdir "$DSTDIR"
-
-    # Always rebuild GAbi++, except for unknown archs.
-    builder_set_srcdir "$GABIXX_SRCDIR"
     builder_reset_cflags DEFAULT_CFLAGS
-    builder_cflags "$DEFAULT_CFLAGS $GABIXX_CFLAGS $EXTRA_CFLAGS"
-
     builder_reset_cxxflags DEFAULT_CXXFLAGS
-    builder_cxxflags "$DEFAULT_CXXFLAGS $GABIXX_CXXFLAGS $EXTRA_CXXFLAGS"
-    builder_ldflags "$GABIXX_LDFLAGS $EXTRA_LDFLAGS"
-    if [ "$(find_ndk_unknown_archs)" != "$ABI" ]; then
-      builder_sources $GABIXX_SOURCES
-    elif [ "$CXX_STL" = "gabi++" ]; then
-      log "Could not build gabi++ with unknown arch!"
-      exit 1
-    else
-      builder_sources src/delete.cc src/new.cc
+
+    if [ "$CXX_STL_RUNTIME" = "gabi++" ]; then
+        builder_set_srcdir "$GABIXX_SRCDIR"
+        builder_cflags "$DEFAULT_CFLAGS $GABIXX_CFLAGS $EXTRA_CFLAGS"
+        builder_cxxflags "$DEFAULT_CXXFLAGS $GABIXX_CXXFLAGS $EXTRA_CXXFLAGS"
+        builder_ldflags "$GABIXX_LDFLAGS $EXTRA_LDFLAGS"
+        if [ "$(find_ndk_unknown_archs)" != "$ABI" ]; then
+            builder_sources $GABIXX_SOURCES
+        elif [ "$CXX_STL" = "gabi++" ]; then
+            log "Could not build gabi++ with unknown arch!"
+            exit 1
+        else
+            builder_sources src/delete.cc src/new.cc
+        fi
     fi
 
     # Build the runtime sources, except if we're only building GAbi++
@@ -553,7 +611,11 @@
       builder_sources $CXX_STL_SOURCES
       if [ "$CXX_STL" = "libc++" ]; then
         if [ "$ABI" = "${ABI%%64*}" ]; then
-          builder_sources $SUPPORT32_SOURCES
+          if [ "$ABI" = "x86" ]; then
+            builder_sources $SUPPORT32_SOURCES $SUPPORT32_SOURCES_x86
+          else
+            builder_sources $SUPPORT32_SOURCES
+	  fi
         else
           builder_sources $SUPPORT64_SOURCES
         fi
diff --git a/build/tools/dev-defaults.sh b/build/tools/dev-defaults.sh
index 80e46db..219faf7 100644
--- a/build/tools/dev-defaults.sh
+++ b/build/tools/dev-defaults.sh
@@ -27,6 +27,9 @@
 # root directory.
 LIBCXX_SUBDIR=sources/cxx-stl/llvm-libc++
 
+# Location of the LLVM libc++abi headers, relative to the NDK # root directory.
+LIBCXXABI_SUBDIR=sources/cxx-stl/llvm-libc++abi/libcxxabi
+
 # Location of the libportable sources, relative to the NDK root directory
 LIBPORTABLE_SUBDIR=sources/android/libportable
 
diff --git a/sources/android/support/Android.mk b/sources/android/support/Android.mk
index d340ba6..bf269e5 100644
--- a/sources/android/support/Android.mk
+++ b/sources/android/support/Android.mk
@@ -57,22 +57,6 @@
     src/msun/e_log2.c \
     src/msun/e_log2f.c \
     src/msun/s_nan.c \
-    src/musl-multibyte/btowc.c \
-    src/musl-multibyte/internal.c \
-    src/musl-multibyte/mblen.c \
-    src/musl-multibyte/mbrlen.c \
-    src/musl-multibyte/mbrtowc.c \
-    src/musl-multibyte/mbsinit.c \
-    src/musl-multibyte/mbsnrtowcs.c \
-    src/musl-multibyte/mbsrtowcs.c \
-    src/musl-multibyte/mbstowcs.c \
-    src/musl-multibyte/mbtowc.c \
-    src/musl-multibyte/wcrtomb.c \
-    src/musl-multibyte/wcsnrtombs.c \
-    src/musl-multibyte/wcsrtombs.c \
-    src/musl-multibyte/wcstombs.c \
-    src/musl-multibyte/wctob.c \
-    src/musl-multibyte/wctomb.c \
     src/musl-ctype/iswalnum.c \
     src/musl-ctype/iswalpha.c \
     src/musl-ctype/iswblank.c \
@@ -121,31 +105,41 @@
     src/musl-locale/iswxdigit_l.c \
     src/musl-locale/isxdigit_l.c \
     src/musl-locale/langinfo.c \
-    src/musl-locale/nl_langinfo_l.c \
     src/musl-locale/strcasecmp_l.c \
     src/musl-locale/strcoll.c \
-    src/musl-locale/strcoll_l.c \
     src/musl-locale/strerror_l.c \
     src/musl-locale/strfmon.c \
     src/musl-locale/strftime_l.c \
     src/musl-locale/strncasecmp_l.c \
     src/musl-locale/strxfrm.c \
-    src/musl-locale/strxfrm_l.c \
     src/musl-locale/tolower_l.c \
     src/musl-locale/toupper_l.c \
     src/musl-locale/towctrans_l.c \
     src/musl-locale/towlower_l.c \
     src/musl-locale/towupper_l.c \
     src/musl-locale/wcscoll.c \
-    src/musl-locale/wcscoll_l.c \
     src/musl-locale/wcsxfrm.c \
-    src/musl-locale/wcsxfrm_l.c \
     src/musl-locale/wctrans_l.c \
     src/musl-locale/wctype_l.c \
     src/musl-math/frexp.c \
     src/musl-math/frexpf.c \
     src/musl-math/frexpl.c \
-    src/musl-math/s_scalbln.c \
+    src/musl-multibyte/btowc.c \
+    src/musl-multibyte/internal.c \
+    src/musl-multibyte/mblen.c \
+    src/musl-multibyte/mbrlen.c \
+    src/musl-multibyte/mbrtowc.c \
+    src/musl-multibyte/mbsinit.c \
+    src/musl-multibyte/mbsnrtowcs.c \
+    src/musl-multibyte/mbsrtowcs.c \
+    src/musl-multibyte/mbstowcs.c \
+    src/musl-multibyte/mbtowc.c \
+    src/musl-multibyte/wcrtomb.c \
+    src/musl-multibyte/wcsnrtombs.c \
+    src/musl-multibyte/wcsrtombs.c \
+    src/musl-multibyte/wcstombs.c \
+    src/musl-multibyte/wctob.c \
+    src/musl-multibyte/wctomb.c \
     src/musl-stdio/printf.c \
     src/musl-stdio/snprintf.c \
     src/musl-stdio/sprintf.c \
@@ -154,8 +148,23 @@
     src/musl-stdio/swprintf.c \
     src/musl-stdio/vwprintf.c \
     src/musl-stdio/wprintf.c \
+    src/wcstox/floatscan.c \
+    src/wcstox/intscan.c \
+    src/wcstox/shgetc.c \
+    src/wcstox/wcstol.c \
+    src/wcstox/wcstod.c \
 
-endif # 64-/32-bit ABIs
+# Replaces broken implementations in x86 libm.so
+ifeq (x86,$(TARGET_ARCH_ABI))
+android_support_sources += \
+    src/musl-math/scalbln.c \
+    src/musl-math/scalblnf.c \
+    src/musl-math/scalblnl.c \
+    src/musl-math/scalbnl.c \
+
+endif
+
+endif  # 64-/32-bit ABIs
 
 # This is only available as a static library for now.
 include $(CLEAR_VARS)
diff --git a/sources/android/support/include/math.h b/sources/android/support/include/math.h
index a59eec6..46398a6 100644
--- a/sources/android/support/include/math.h
+++ b/sources/android/support/include/math.h
@@ -41,7 +41,7 @@
 typedef float       float_t;
 
 // Missing long double functions. Note that 'long double' is the same
-// than 'double' on Android, so this will define stubs.
+// as 'double' on 32-bit Android, so this will define stubs.
 #define LLVM_LIBCXX_LONG_DOUBLE_FUNCTIONS
 
 long double     acosl(long double);
diff --git a/sources/android/support/src/math_support.c b/sources/android/support/src/math_support.c
index d470906..24cdade 100644
--- a/sources/android/support/src/math_support.c
+++ b/sources/android/support/src/math_support.c
@@ -29,20 +29,25 @@
 #include <math.h>
 #include <assert.h>
 
+/* Any 64-bit Android math library should provide these functions,
+ * so these wrappers are only needed for 32-bit systems.
+ */
+#ifndef __LP64__
+
 /*
- * On Android, long double and double are identical, hence nexttoward is the
- * same as nextafter.
+ * On 32-bit Android, long double and double are identical, hence
+ * nexttoward is the same as nextafter.
  */
 
-double nexttoward(double d, long double td) {
+__attribute__((weak)) double nexttoward(double d, long double td) {
   return nextafter(d, (double)td);
 }
 
-float nexttowardf(float f, long double td) {
+__attribute__((weak)) float nexttowardf(float f, long double td) {
   return nextafterf(f, (float)td);
 }
 
-long double nexttowardl(long double ld, long double td) {
+__attribute__((weak)) long double nexttowardl(long double ld, long double td) {
   return nextafter((double)ld, (double)td);
 }
 
@@ -84,3 +89,5 @@
 __attribute__((weak)) long double tgammal(long double x) { return tgamma((double)x); }
 __attribute__((weak)) long double modfl(long double x, long double* y) { return modf((double)x, (double *)y); }
 __attribute__((weak)) long double exp2l(long double x) { return exp2((double)x); }
+
+#endif  // !__LP64__
diff --git a/sources/android/support/src/musl-ctype/iswspace.c b/sources/android/support/src/musl-ctype/iswspace.c
index 99d517e..b0c0ae1 100644
--- a/sources/android/support/src/musl-ctype/iswspace.c
+++ b/sources/android/support/src/musl-ctype/iswspace.c
@@ -14,6 +14,5 @@
 		0x2006, 0x2008, 0x2009, 0x200a,
 		0x2028, 0x2029, 0x205f, 0x3000, 0
 	};
-	if (wcschr(spaces, wc)) return 1;
-	return 0;
+	return wc && wcschr(spaces, wc);
 }
diff --git a/sources/android/support/src/musl-locale/big5.h b/sources/android/support/src/musl-locale/big5.h
new file mode 100644
index 0000000..332ea3b
--- /dev/null
+++ b/sources/android/support/src/musl-locale/big5.h
@@ -0,0 +1,1085 @@
+12288,65292,12289,12290,65294,8231,65307,65306,65311,65281,65072,8230,8229,
+65104,65105,65106,183,65108,65109,65110,65111,65372,8211,65073,8212,65075,
+9588,65076,65103,65288,65289,65077,65078,65371,65373,65079,65080,12308,12309,
+65081,65082,12304,12305,65083,65084,12298,12299,65085,65086,12296,12297,65087,
+65088,12300,12301,65089,65090,12302,12303,65091,65092,65113,65114,65115,65116,
+65117,65118,8216,8217,8220,8221,12317,12318,8245,8242,65283,65286,65290,8251,
+167,12291,9675,9679,9651,9650,9678,9734,9733,9671,9670,9633,9632,9661,9660,
+12963,8453,175,65507,65343,717,65097,65098,65101,65102,65099,65100,65119,
+65120,65121,65291,65293,215,247,177,8730,65308,65310,65309,8806,8807,8800,
+8734,8786,8801,65122,65123,65124,65125,65126,65374,8745,8746,8869,8736,8735,
+8895,13266,13265,8747,8750,8757,8756,9792,9794,8853,8857,8593,8595,8592,8594,
+8598,8599,8601,8600,8741,8739,65295,65340,8725,65128,65284,65509,12306,65504,
+65505,65285,65312,8451,8457,65129,65130,65131,13269,13212,13213,13214,13262,
+13217,13198,13199,13252,176,20825,20827,20830,20829,20833,20835,21991,29929,
+31950,9601,9602,9603,9604,9605,9606,9607,9608,9615,9614,9613,9612,9611,9610,
+9609,9532,9524,9516,9508,9500,9620,9472,9474,9621,9484,9488,9492,9496,9581,
+9582,9584,9583,9552,9566,9578,9569,9698,9699,9701,9700,9585,9586,9587,65296,
+65297,65298,65299,65300,65301,65302,65303,65304,65305,8544,8545,8546,8547,
+8548,8549,8550,8551,8552,8553,12321,
+12322,12323,12324,12325,12326,12327,12328,12329,21313,21316,21317,65313,65314,
+65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,
+65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,
+65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,
+65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,913,914,915,
+916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,
+936,937,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,
+963,964,965,966,967,968,969,12549,12550,12551,12552,12553,12554,12555,12556,
+12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,
+12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,
+12583,12584,12585,729,713,714,711,715,9216,9217,9218,9219,9220,9221,9222,9223,
+9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,
+9239,9240,9241,9242,9243,9244,9245,9246,9247,9249,8364,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19968,20057,19969,19971,20035,20061,20102,
+20108,20154,20799,20837,20843,20960,20992,20993,21147,21269,21313,21340,21448,
+19977,19979,19976,19978,20011,20024,20961,20037,20040,20063,20062,20110,20129,
+20800,20995,21242,21315,21449,21475,22303,
+22763,22805,22823,22899,23376,23377,23379,23544,23567,23586,23608,23665,24029,
+24037,24049,24050,24051,24062,24178,24318,24331,24339,25165,19985,19984,19981,
+20013,20016,20025,20043,23609,20104,20113,20117,20114,20116,20130,20161,20160,
+20163,20166,20167,20173,20170,20171,20164,20803,20801,20839,20845,20846,20844,
+20887,20982,20998,20999,21000,21243,21246,21247,21270,21305,21320,21319,21317,
+21342,21380,21451,21450,21453,22764,22825,22827,22826,22829,23380,23569,23588,
+23610,23663,24052,24187,24319,24340,24341,24515,25096,25142,25163,25166,25903,
+25991,26007,26020,26041,26085,26352,26376,26408,27424,27490,27513,27595,27604,
+27611,27663,27700,28779,29226,29238,29243,29255,29273,29275,29356,29579,19993,
+19990,19989,19988,19992,20027,20045,20047,20046,20197,20184,20180,20181,20182,
+20183,20195,20196,20185,20190,20805,20804,20873,20874,20908,20985,20986,20984,
+21002,21152,21151,21253,21254,21271,21277,20191,21322,21321,21345,21344,21359,
+21358,21435,21487,21476,21491,21484,21486,21481,21480,21500,21496,21493,21483,
+21478,21482,21490,21489,21488,21477,21485,21499,22235,22234,22806,22830,22833,
+22900,22902,23381,23427,23612,24040,24039,24038,24066,24067,24179,24188,24321,
+24344,24343,24517,25098,25171,25172,25170,25169,26021,26086,26414,26412,26410,
+26411,26413,27491,27597,27665,27664,27704,27713,27712,27710,29359,29572,29577,
+29916,29926,29976,29983,29992,29993,30000,30001,30002,30003,30091,30333,30382,
+30399,30446,30683,30690,30707,31034,31166,31348,31435,19998,19999,20050,20051,
+20073,20121,20132,20134,20133,20223,20233,20249,20234,
+20245,20237,20240,20241,20239,20210,20214,20219,20208,20211,20221,20225,20235,
+20809,20807,20806,20808,20840,20849,20877,20912,21015,21009,21010,21006,21014,
+21155,21256,21281,21280,21360,21361,21513,21519,21516,21514,21520,21505,21515,
+21508,21521,21517,21512,21507,21518,21510,21522,22240,22238,22237,22323,22320,
+22312,22317,22316,22319,22313,22809,22810,22839,22840,22916,22904,22915,22909,
+22905,22914,22913,23383,23384,23431,23432,23429,23433,23546,23574,23673,24030,
+24070,24182,24180,24335,24347,24537,24534,25102,25100,25101,25104,25187,25179,
+25176,25910,26089,26088,26092,26093,26354,26355,26377,26429,26420,26417,26421,
+27425,27492,27515,27670,27741,27735,27737,27743,27744,27728,27733,27745,27739,
+27725,27726,28784,29279,29277,30334,31481,31859,31992,32566,32650,32701,32769,
+32771,32780,32786,32819,32895,32905,32907,32908,33251,33258,33267,33276,33292,
+33307,33311,33390,33394,33406,34411,34880,34892,34915,35199,38433,20018,20136,
+20301,20303,20295,20311,20318,20276,20315,20309,20272,20304,20305,20285,20282,
+20280,20291,20308,20284,20294,20323,20316,20320,20271,20302,20278,20313,20317,
+20296,20314,20812,20811,20813,20853,20918,20919,21029,21028,21033,21034,21032,
+21163,21161,21162,21164,21283,21363,21365,21533,21549,21534,21566,21542,21582,
+21543,21574,21571,21555,21576,21570,21531,21545,21578,21561,21563,21560,21550,
+21557,21558,21536,21564,21568,21553,21547,21535,21548,22250,22256,22244,22251,
+22346,22353,22336,22349,22343,22350,22334,22352,22351,22331,22767,22846,22941,
+22930,22952,22942,22947,22937,22934,22925,22948,22931,
+22922,22949,23389,23388,23386,23387,23436,23435,23439,23596,23616,23617,23615,
+23614,23696,23697,23700,23692,24043,24076,24207,24199,24202,24311,24324,24351,
+24420,24418,24439,24441,24536,24524,24535,24525,24561,24555,24568,24554,25106,
+25105,25220,25239,25238,25216,25206,25225,25197,25226,25212,25214,25209,25203,
+25234,25199,25240,25198,25237,25235,25233,25222,25913,25915,25912,26097,26356,
+26463,26446,26447,26448,26449,26460,26454,26462,26441,26438,26464,26451,26455,
+27493,27599,27714,27742,27801,27777,27784,27785,27781,27803,27754,27770,27792,
+27760,27788,27752,27798,27794,27773,27779,27762,27774,27764,27782,27766,27789,
+27796,27800,27778,28790,28796,28797,28792,29282,29281,29280,29380,29378,29590,
+29996,29995,30007,30008,30338,30447,30691,31169,31168,31167,31350,31995,32597,
+32918,32915,32925,32920,32923,32922,32946,33391,33426,33419,33421,35211,35282,
+35328,35895,35910,35925,35997,36196,36208,36275,36523,36554,36763,36784,36802,
+36806,36805,36804,24033,37009,37026,37034,37030,37027,37193,37318,37324,38450,
+38446,38449,38442,38444,20006,20054,20083,20107,20123,20126,20139,20140,20335,
+20381,20365,20339,20351,20332,20379,20363,20358,20355,20336,20341,20360,20329,
+20347,20374,20350,20367,20369,20346,20820,20818,20821,20841,20855,20854,20856,
+20925,20989,21051,21048,21047,21050,21040,21038,21046,21057,21182,21179,21330,
+21332,21331,21329,21350,21367,21368,21369,21462,21460,21463,21619,21621,21654,
+21624,21653,21632,21627,21623,21636,21650,21638,21628,21648,21617,21622,21644,
+21658,21602,21608,21643,21629,21646,22266,22403,22391,
+22378,22377,22369,22374,22372,22396,22812,22857,22855,22856,22852,22868,22974,
+22971,22996,22969,22958,22993,22982,22992,22989,22987,22995,22986,22959,22963,
+22994,22981,23391,23396,23395,23447,23450,23448,23452,23449,23451,23578,23624,
+23621,23622,23735,23713,23736,23721,23723,23729,23731,24088,24090,24086,24085,
+24091,24081,24184,24218,24215,24220,24213,24214,24310,24358,24359,24361,24448,
+24449,24447,24444,24541,24544,24573,24565,24575,24591,24596,24623,24629,24598,
+24618,24597,24609,24615,24617,24619,24603,25110,25109,25151,25150,25152,25215,
+25289,25292,25284,25279,25282,25273,25298,25307,25259,25299,25300,25291,25288,
+25256,25277,25276,25296,25305,25287,25293,25269,25306,25265,25304,25302,25303,
+25286,25260,25294,25918,26023,26044,26106,26132,26131,26124,26118,26114,26126,
+26112,26127,26133,26122,26119,26381,26379,26477,26507,26517,26481,26524,26483,
+26487,26503,26525,26519,26479,26480,26495,26505,26494,26512,26485,26522,26515,
+26492,26474,26482,27427,27494,27495,27519,27667,27675,27875,27880,27891,27825,
+27852,27877,27827,27837,27838,27836,27874,27819,27861,27859,27832,27844,27833,
+27841,27822,27863,27845,27889,27839,27835,27873,27867,27850,27820,27887,27868,
+27862,27872,28821,28814,28818,28810,28825,29228,29229,29240,29256,29287,29289,
+29376,29390,29401,29399,29392,29609,29608,29599,29611,29605,30013,30109,30105,
+30106,30340,30402,30450,30452,30693,30717,31038,31040,31041,31177,31176,31354,
+31353,31482,31998,32596,32652,32651,32773,32954,32933,32930,32945,32929,32939,
+32937,32948,32938,32943,33253,33278,33293,33459,33437,
+33433,33453,33469,33439,33465,33457,33452,33445,33455,33464,33443,33456,33470,
+33463,34382,34417,21021,34920,36555,36814,36820,36817,37045,37048,37041,37046,
+37319,37329,38263,38272,38428,38464,38463,38459,38468,38466,38585,38632,38738,
+38750,20127,20141,20142,20449,20405,20399,20415,20448,20433,20431,20445,20419,
+20406,20440,20447,20426,20439,20398,20432,20420,20418,20442,20430,20446,20407,
+20823,20882,20881,20896,21070,21059,21066,21069,21068,21067,21063,21191,21193,
+21187,21185,21261,21335,21371,21402,21467,21676,21696,21672,21710,21705,21688,
+21670,21683,21703,21698,21693,21674,21697,21700,21704,21679,21675,21681,21691,
+21673,21671,21695,22271,22402,22411,22432,22435,22434,22478,22446,22419,22869,
+22865,22863,22862,22864,23004,23000,23039,23011,23016,23043,23013,23018,23002,
+23014,23041,23035,23401,23459,23462,23460,23458,23461,23553,23630,23631,23629,
+23627,23769,23762,24055,24093,24101,24095,24189,24224,24230,24314,24328,24365,
+24421,24456,24453,24458,24459,24455,24460,24457,24594,24605,24608,24613,24590,
+24616,24653,24688,24680,24674,24646,24643,24684,24683,24682,24676,25153,25308,
+25366,25353,25340,25325,25345,25326,25341,25351,25329,25335,25327,25324,25342,
+25332,25361,25346,25919,25925,26027,26045,26082,26149,26157,26144,26151,26159,
+26143,26152,26161,26148,26359,26623,26579,26609,26580,26576,26604,26550,26543,
+26613,26601,26607,26564,26577,26548,26586,26597,26552,26575,26590,26611,26544,
+26585,26594,26589,26578,27498,27523,27526,27573,27602,27607,27679,27849,27915,
+27954,27946,27969,27941,27916,27953,27934,27927,27963,
+27965,27966,27958,27931,27893,27961,27943,27960,27945,27950,27957,27918,27947,
+28843,28858,28851,28844,28847,28845,28856,28846,28836,29232,29298,29295,29300,
+29417,29408,29409,29623,29642,29627,29618,29645,29632,29619,29978,29997,30031,
+30028,30030,30027,30123,30116,30117,30114,30115,30328,30342,30343,30344,30408,
+30406,30403,30405,30465,30457,30456,30473,30475,30462,30460,30471,30684,30722,
+30740,30732,30733,31046,31049,31048,31047,31161,31162,31185,31186,31179,31359,
+31361,31487,31485,31869,32002,32005,32000,32009,32007,32004,32006,32568,32654,
+32703,32772,32784,32781,32785,32822,32982,32997,32986,32963,32964,32972,32993,
+32987,32974,32990,32996,32989,33268,33314,33511,33539,33541,33507,33499,33510,
+33540,33509,33538,33545,33490,33495,33521,33537,33500,33492,33489,33502,33491,
+33503,33519,33542,34384,34425,34427,34426,34893,34923,35201,35284,35336,35330,
+35331,35998,36000,36212,36211,36276,36557,36556,36848,36838,36834,36842,36837,
+36845,36843,36836,36840,37066,37070,37057,37059,37195,37194,37325,38274,38480,
+38475,38476,38477,38754,38761,38859,38893,38899,38913,39080,39131,39135,39318,
+39321,20056,20147,20492,20493,20515,20463,20518,20517,20472,20521,20502,20486,
+20540,20511,20506,20498,20497,20474,20480,20500,20520,20465,20513,20491,20505,
+20504,20467,20462,20525,20522,20478,20523,20489,20860,20900,20901,20898,20941,
+20940,20934,20939,21078,21084,21076,21083,21085,21290,21375,21407,21405,21471,
+21736,21776,21761,21815,21756,21733,21746,21766,21754,21780,21737,21741,21729,
+21769,21742,21738,21734,21799,21767,21757,21775,22275,
+22276,22466,22484,22475,22467,22537,22799,22871,22872,22874,23057,23064,23068,
+23071,23067,23059,23020,23072,23075,23081,23077,23052,23049,23403,23640,23472,
+23475,23478,23476,23470,23477,23481,23480,23556,23633,23637,23632,23789,23805,
+23803,23786,23784,23792,23798,23809,23796,24046,24109,24107,24235,24237,24231,
+24369,24466,24465,24464,24665,24675,24677,24656,24661,24685,24681,24687,24708,
+24735,24730,24717,24724,24716,24709,24726,25159,25331,25352,25343,25422,25406,
+25391,25429,25410,25414,25423,25417,25402,25424,25405,25386,25387,25384,25421,
+25420,25928,25929,26009,26049,26053,26178,26185,26191,26179,26194,26188,26181,
+26177,26360,26388,26389,26391,26657,26680,26696,26694,26707,26681,26690,26708,
+26665,26803,26647,26700,26705,26685,26612,26704,26688,26684,26691,26666,26693,
+26643,26648,26689,27530,27529,27575,27683,27687,27688,27686,27684,27888,28010,
+28053,28040,28039,28006,28024,28023,27993,28051,28012,28041,28014,27994,28020,
+28009,28044,28042,28025,28037,28005,28052,28874,28888,28900,28889,28872,28879,
+29241,29305,29436,29433,29437,29432,29431,29574,29677,29705,29678,29664,29674,
+29662,30036,30045,30044,30042,30041,30142,30149,30151,30130,30131,30141,30140,
+30137,30146,30136,30347,30384,30410,30413,30414,30505,30495,30496,30504,30697,
+30768,30759,30776,30749,30772,30775,30757,30765,30752,30751,30770,31061,31056,
+31072,31071,31062,31070,31069,31063,31066,31204,31203,31207,31199,31206,31209,
+31192,31364,31368,31449,31494,31505,31881,32033,32023,32011,32010,32032,32034,
+32020,32016,32021,32026,32028,32013,32025,32027,32570,
+32607,32660,32709,32705,32774,32792,32789,32793,32791,32829,32831,33009,33026,
+33008,33029,33005,33012,33030,33016,33011,33032,33021,33034,33020,33007,33261,
+33260,33280,33296,33322,33323,33320,33324,33467,33579,33618,33620,33610,33592,
+33616,33609,33589,33588,33615,33586,33593,33590,33559,33600,33585,33576,33603,
+34388,34442,34474,34451,34468,34473,34444,34467,34460,34928,34935,34945,34946,
+34941,34937,35352,35344,35342,35340,35349,35338,35351,35347,35350,35343,35345,
+35912,35962,35961,36001,36002,36215,36524,36562,36564,36559,36785,36865,36870,
+36855,36864,36858,36852,36867,36861,36869,36856,37013,37089,37085,37090,37202,
+37197,37196,37336,37341,37335,37340,37337,38275,38498,38499,38497,38491,38493,
+38500,38488,38494,38587,39138,39340,39592,39640,39717,39730,39740,20094,20602,
+20605,20572,20551,20547,20556,20570,20553,20581,20598,20558,20565,20597,20596,
+20599,20559,20495,20591,20589,20828,20885,20976,21098,21103,21202,21209,21208,
+21205,21264,21263,21273,21311,21312,21310,21443,26364,21830,21866,21862,21828,
+21854,21857,21827,21834,21809,21846,21839,21845,21807,21860,21816,21806,21852,
+21804,21859,21811,21825,21847,22280,22283,22281,22495,22533,22538,22534,22496,
+22500,22522,22530,22581,22519,22521,22816,22882,23094,23105,23113,23142,23146,
+23104,23100,23138,23130,23110,23114,23408,23495,23493,23492,23490,23487,23494,
+23561,23560,23559,23648,23644,23645,23815,23814,23822,23835,23830,23842,23825,
+23849,23828,23833,23844,23847,23831,24034,24120,24118,24115,24119,24247,24248,
+24246,24245,24254,24373,24375,24407,24428,24425,24427,
+24471,24473,24478,24472,24481,24480,24476,24703,24739,24713,24736,24744,24779,
+24756,24806,24765,24773,24763,24757,24796,24764,24792,24789,24774,24799,24760,
+24794,24775,25114,25115,25160,25504,25511,25458,25494,25506,25509,25463,25447,
+25496,25514,25457,25513,25481,25475,25499,25451,25512,25476,25480,25497,25505,
+25516,25490,25487,25472,25467,25449,25448,25466,25949,25942,25937,25945,25943,
+21855,25935,25944,25941,25940,26012,26011,26028,26063,26059,26060,26062,26205,
+26202,26212,26216,26214,26206,26361,21207,26395,26753,26799,26786,26771,26805,
+26751,26742,26801,26791,26775,26800,26755,26820,26797,26758,26757,26772,26781,
+26792,26783,26785,26754,27442,27578,27627,27628,27691,28046,28092,28147,28121,
+28082,28129,28108,28132,28155,28154,28165,28103,28107,28079,28113,28078,28126,
+28153,28088,28151,28149,28101,28114,28186,28085,28122,28139,28120,28138,28145,
+28142,28136,28102,28100,28074,28140,28095,28134,28921,28937,28938,28925,28911,
+29245,29309,29313,29468,29467,29462,29459,29465,29575,29701,29706,29699,29702,
+29694,29709,29920,29942,29943,29980,29986,30053,30054,30050,30064,30095,30164,
+30165,30133,30154,30157,30350,30420,30418,30427,30519,30526,30524,30518,30520,
+30522,30827,30787,30798,31077,31080,31085,31227,31378,31381,31520,31528,31515,
+31532,31526,31513,31518,31534,31890,31895,31893,32070,32067,32113,32046,32057,
+32060,32064,32048,32051,32068,32047,32066,32050,32049,32573,32670,32666,32716,
+32718,32722,32796,32842,32838,33071,33046,33059,33067,33065,33072,33060,33282,
+33333,33335,33334,33337,33678,33694,33688,33656,33698,
+33686,33725,33707,33682,33674,33683,33673,33696,33655,33659,33660,33670,33703,
+34389,24426,34503,34496,34486,34500,34485,34502,34507,34481,34479,34505,34899,
+34974,34952,34987,34962,34966,34957,34955,35219,35215,35370,35357,35363,35365,
+35377,35373,35359,35355,35362,35913,35930,36009,36012,36011,36008,36010,36007,
+36199,36198,36286,36282,36571,36575,36889,36877,36890,36887,36899,36895,36893,
+36880,36885,36894,36896,36879,36898,36886,36891,36884,37096,37101,37117,37207,
+37326,37365,37350,37347,37351,37357,37353,38281,38506,38517,38515,38520,38512,
+38516,38518,38519,38508,38592,38634,38633,31456,31455,38914,38915,39770,40165,
+40565,40575,40613,40635,20642,20621,20613,20633,20625,20608,20630,20632,20634,
+26368,20977,21106,21108,21109,21097,21214,21213,21211,21338,21413,21883,21888,
+21927,21884,21898,21917,21912,21890,21916,21930,21908,21895,21899,21891,21939,
+21934,21919,21822,21938,21914,21947,21932,21937,21886,21897,21931,21913,22285,
+22575,22570,22580,22564,22576,22577,22561,22557,22560,22777,22778,22880,23159,
+23194,23167,23186,23195,23207,23411,23409,23506,23500,23507,23504,23562,23563,
+23601,23884,23888,23860,23879,24061,24133,24125,24128,24131,24190,24266,24257,
+24258,24260,24380,24429,24489,24490,24488,24785,24801,24754,24758,24800,24860,
+24867,24826,24853,24816,24827,24820,24936,24817,24846,24822,24841,24832,24850,
+25119,25161,25507,25484,25551,25536,25577,25545,25542,25549,25554,25571,25552,
+25569,25558,25581,25582,25462,25588,25578,25563,25682,25562,25593,25950,25958,
+25954,25955,26001,26000,26031,26222,26224,26228,26230,
+26223,26257,26234,26238,26231,26366,26367,26399,26397,26874,26837,26848,26840,
+26839,26885,26847,26869,26862,26855,26873,26834,26866,26851,26827,26829,26893,
+26898,26894,26825,26842,26990,26875,27454,27450,27453,27544,27542,27580,27631,
+27694,27695,27692,28207,28216,28244,28193,28210,28263,28234,28192,28197,28195,
+28187,28251,28248,28196,28246,28270,28205,28198,28271,28212,28237,28218,28204,
+28227,28189,28222,28363,28297,28185,28238,28259,28228,28274,28265,28255,28953,
+28954,28966,28976,28961,28982,29038,28956,29260,29316,29312,29494,29477,29492,
+29481,29754,29738,29747,29730,29733,29749,29750,29748,29743,29723,29734,29736,
+29989,29990,30059,30058,30178,30171,30179,30169,30168,30174,30176,30331,30332,
+30358,30355,30388,30428,30543,30701,30813,30828,30831,31245,31240,31243,31237,
+31232,31384,31383,31382,31461,31459,31561,31574,31558,31568,31570,31572,31565,
+31563,31567,31569,31903,31909,32094,32080,32104,32085,32043,32110,32114,32097,
+32102,32098,32112,32115,21892,32724,32725,32779,32850,32901,33109,33108,33099,
+33105,33102,33081,33094,33086,33100,33107,33140,33298,33308,33769,33795,33784,
+33805,33760,33733,33803,33729,33775,33777,33780,33879,33802,33776,33804,33740,
+33789,33778,33738,33848,33806,33796,33756,33799,33748,33759,34395,34527,34521,
+34541,34516,34523,34532,34512,34526,34903,35009,35010,34993,35203,35222,35387,
+35424,35413,35422,35388,35393,35412,35419,35408,35398,35380,35386,35382,35414,
+35937,35970,36015,36028,36019,36029,36033,36027,36032,36020,36023,36022,36031,
+36024,36234,36229,36225,36302,36317,36299,36314,36305,
+36300,36315,36294,36603,36600,36604,36764,36910,36917,36913,36920,36914,36918,
+37122,37109,37129,37118,37219,37221,37327,37396,37397,37411,37385,37406,37389,
+37392,37383,37393,38292,38287,38283,38289,38291,38290,38286,38538,38542,38539,
+38525,38533,38534,38541,38514,38532,38593,38597,38596,38598,38599,38639,38642,
+38860,38917,38918,38920,39143,39146,39151,39145,39154,39149,39342,39341,40643,
+40653,40657,20098,20653,20661,20658,20659,20677,20670,20652,20663,20667,20655,
+20679,21119,21111,21117,21215,21222,21220,21218,21219,21295,21983,21992,21971,
+21990,21966,21980,21959,21969,21987,21988,21999,21978,21985,21957,21958,21989,
+21961,22290,22291,22622,22609,22616,22615,22618,22612,22635,22604,22637,22602,
+22626,22610,22603,22887,23233,23241,23244,23230,23229,23228,23219,23234,23218,
+23913,23919,24140,24185,24265,24264,24338,24409,24492,24494,24858,24847,24904,
+24863,24819,24859,24825,24833,24840,24910,24908,24900,24909,24894,24884,24871,
+24845,24838,24887,25121,25122,25619,25662,25630,25642,25645,25661,25644,25615,
+25628,25620,25613,25654,25622,25623,25606,25964,26015,26032,26263,26249,26247,
+26248,26262,26244,26264,26253,26371,27028,26989,26970,26999,26976,26964,26997,
+26928,27010,26954,26984,26987,26974,26963,27001,27014,26973,26979,26971,27463,
+27506,27584,27583,27603,27645,28322,28335,28371,28342,28354,28304,28317,28359,
+28357,28325,28312,28348,28346,28331,28369,28310,28316,28356,28372,28330,28327,
+28340,29006,29017,29033,29028,29001,29031,29020,29036,29030,29004,29029,29022,
+28998,29032,29014,29242,29266,29495,29509,29503,29502,
+29807,29786,29781,29791,29790,29761,29759,29785,29787,29788,30070,30072,30208,
+30192,30209,30194,30193,30202,30207,30196,30195,30430,30431,30555,30571,30566,
+30558,30563,30585,30570,30572,30556,30565,30568,30562,30702,30862,30896,30871,
+30872,30860,30857,30844,30865,30867,30847,31098,31103,31105,33836,31165,31260,
+31258,31264,31252,31263,31262,31391,31392,31607,31680,31584,31598,31591,31921,
+31923,31925,32147,32121,32145,32129,32143,32091,32622,32617,32618,32626,32681,
+32680,32676,32854,32856,32902,32900,33137,33136,33144,33125,33134,33139,33131,
+33145,33146,33126,33285,33351,33922,33911,33853,33841,33909,33894,33899,33865,
+33900,33883,33852,33845,33889,33891,33897,33901,33862,34398,34396,34399,34553,
+34579,34568,34567,34560,34558,34555,34562,34563,34566,34570,34905,35039,35028,
+35033,35036,35032,35037,35041,35018,35029,35026,35228,35299,35435,35442,35443,
+35430,35433,35440,35463,35452,35427,35488,35441,35461,35437,35426,35438,35436,
+35449,35451,35390,35432,35938,35978,35977,36042,36039,36040,36036,36018,36035,
+36034,36037,36321,36319,36328,36335,36339,36346,36330,36324,36326,36530,36611,
+36617,36606,36618,36767,36786,36939,36938,36947,36930,36948,36924,36949,36944,
+36935,36943,36942,36941,36945,36926,36929,37138,37143,37228,37226,37225,37321,
+37431,37463,37432,37437,37440,37438,37467,37451,37476,37457,37428,37449,37453,
+37445,37433,37439,37466,38296,38552,38548,38549,38605,38603,38601,38602,38647,
+38651,38649,38646,38742,38772,38774,38928,38929,38931,38922,38930,38924,39164,
+39156,39165,39166,39347,39345,39348,39649,40169,40578,
+40718,40723,40736,20711,20718,20709,20694,20717,20698,20693,20687,20689,20721,
+20686,20713,20834,20979,21123,21122,21297,21421,22014,22016,22043,22039,22013,
+22036,22022,22025,22029,22030,22007,22038,22047,22024,22032,22006,22296,22294,
+22645,22654,22659,22675,22666,22649,22661,22653,22781,22821,22818,22820,22890,
+22889,23265,23270,23273,23255,23254,23256,23267,23413,23518,23527,23521,23525,
+23526,23528,23522,23524,23519,23565,23650,23940,23943,24155,24163,24149,24151,
+24148,24275,24278,24330,24390,24432,24505,24903,24895,24907,24951,24930,24931,
+24927,24922,24920,24949,25130,25735,25688,25684,25764,25720,25695,25722,25681,
+25703,25652,25709,25723,25970,26017,26071,26070,26274,26280,26269,27036,27048,
+27029,27073,27054,27091,27083,27035,27063,27067,27051,27060,27088,27085,27053,
+27084,27046,27075,27043,27465,27468,27699,28467,28436,28414,28435,28404,28457,
+28478,28448,28460,28431,28418,28450,28415,28399,28422,28465,28472,28466,28451,
+28437,28459,28463,28552,28458,28396,28417,28402,28364,28407,29076,29081,29053,
+29066,29060,29074,29246,29330,29334,29508,29520,29796,29795,29802,29808,29805,
+29956,30097,30247,30221,30219,30217,30227,30433,30435,30596,30589,30591,30561,
+30913,30879,30887,30899,30889,30883,31118,31119,31117,31278,31281,31402,31401,
+31469,31471,31649,31637,31627,31605,31639,31645,31636,31631,31672,31623,31620,
+31929,31933,31934,32187,32176,32156,32189,32190,32160,32202,32180,32178,32177,
+32186,32162,32191,32181,32184,32173,32210,32199,32172,32624,32736,32737,32735,
+32862,32858,32903,33104,33152,33167,33160,33162,33151,
+33154,33255,33274,33287,33300,33310,33355,33993,33983,33990,33988,33945,33950,
+33970,33948,33995,33976,33984,34003,33936,33980,34001,33994,34623,34588,34619,
+34594,34597,34612,34584,34645,34615,34601,35059,35074,35060,35065,35064,35069,
+35048,35098,35055,35494,35468,35486,35491,35469,35489,35475,35492,35498,35493,
+35496,35480,35473,35482,35495,35946,35981,35980,36051,36049,36050,36203,36249,
+36245,36348,36628,36626,36629,36627,36771,36960,36952,36956,36963,36953,36958,
+36962,36957,36955,37145,37144,37150,37237,37240,37239,37236,37496,37504,37509,
+37528,37526,37499,37523,37532,37544,37500,37521,38305,38312,38313,38307,38309,
+38308,38553,38556,38555,38604,38610,38656,38780,38789,38902,38935,38936,39087,
+39089,39171,39173,39180,39177,39361,39599,39600,39654,39745,39746,40180,40182,
+40179,40636,40763,40778,20740,20736,20731,20725,20729,20738,20744,20745,20741,
+20956,21127,21128,21129,21133,21130,21232,21426,22062,22075,22073,22066,22079,
+22068,22057,22099,22094,22103,22132,22070,22063,22064,22656,22687,22686,22707,
+22684,22702,22697,22694,22893,23305,23291,23307,23285,23308,23304,23534,23532,
+23529,23531,23652,23653,23965,23956,24162,24159,24161,24290,24282,24287,24285,
+24291,24288,24392,24433,24503,24501,24950,24935,24942,24925,24917,24962,24956,
+24944,24939,24958,24999,24976,25003,24974,25004,24986,24996,24980,25006,25134,
+25705,25711,25721,25758,25778,25736,25744,25776,25765,25747,25749,25769,25746,
+25774,25773,25771,25754,25772,25753,25762,25779,25973,25975,25976,26286,26283,
+26292,26289,27171,27167,27112,27137,27166,27161,27133,
+27169,27155,27146,27123,27138,27141,27117,27153,27472,27470,27556,27589,27590,
+28479,28540,28548,28497,28518,28500,28550,28525,28507,28536,28526,28558,28538,
+28528,28516,28567,28504,28373,28527,28512,28511,29087,29100,29105,29096,29270,
+29339,29518,29527,29801,29835,29827,29822,29824,30079,30240,30249,30239,30244,
+30246,30241,30242,30362,30394,30436,30606,30599,30604,30609,30603,30923,30917,
+30906,30922,30910,30933,30908,30928,31295,31292,31296,31293,31287,31291,31407,
+31406,31661,31665,31684,31668,31686,31687,31681,31648,31692,31946,32224,32244,
+32239,32251,32216,32236,32221,32232,32227,32218,32222,32233,32158,32217,32242,
+32249,32629,32631,32687,32745,32806,33179,33180,33181,33184,33178,33176,34071,
+34109,34074,34030,34092,34093,34067,34065,34083,34081,34068,34028,34085,34047,
+34054,34690,34676,34678,34656,34662,34680,34664,34649,34647,34636,34643,34907,
+34909,35088,35079,35090,35091,35093,35082,35516,35538,35527,35524,35477,35531,
+35576,35506,35529,35522,35519,35504,35542,35533,35510,35513,35547,35916,35918,
+35948,36064,36062,36070,36068,36076,36077,36066,36067,36060,36074,36065,36205,
+36255,36259,36395,36368,36381,36386,36367,36393,36383,36385,36382,36538,36637,
+36635,36639,36649,36646,36650,36636,36638,36645,36969,36974,36968,36973,36983,
+37168,37165,37159,37169,37255,37257,37259,37251,37573,37563,37559,37610,37548,
+37604,37569,37555,37564,37586,37575,37616,37554,38317,38321,38660,38662,38663,
+38665,38752,38797,38795,38799,38945,38955,38940,39091,39178,39187,39186,39192,
+39389,39376,39391,39387,39377,39381,39378,39385,39607,
+39662,39663,39719,39749,39748,39799,39791,40198,40201,40195,40617,40638,40654,
+22696,40786,20754,20760,20756,20752,20757,20864,20906,20957,21137,21139,21235,
+22105,22123,22137,22121,22116,22136,22122,22120,22117,22129,22127,22124,22114,
+22134,22721,22718,22727,22725,22894,23325,23348,23416,23536,23566,24394,25010,
+24977,25001,24970,25037,25014,25022,25034,25032,25136,25797,25793,25803,25787,
+25788,25818,25796,25799,25794,25805,25791,25810,25812,25790,25972,26310,26313,
+26297,26308,26311,26296,27197,27192,27194,27225,27243,27224,27193,27204,27234,
+27233,27211,27207,27189,27231,27208,27481,27511,27653,28610,28593,28577,28611,
+28580,28609,28583,28595,28608,28601,28598,28582,28576,28596,29118,29129,29136,
+29138,29128,29141,29113,29134,29145,29148,29123,29124,29544,29852,29859,29848,
+29855,29854,29922,29964,29965,30260,30264,30266,30439,30437,30624,30622,30623,
+30629,30952,30938,30956,30951,31142,31309,31310,31302,31308,31307,31418,31705,
+31761,31689,31716,31707,31713,31721,31718,31957,31958,32266,32273,32264,32283,
+32291,32286,32285,32265,32272,32633,32690,32752,32753,32750,32808,33203,33193,
+33192,33275,33288,33368,33369,34122,34137,34120,34152,34153,34115,34121,34157,
+34154,34142,34691,34719,34718,34722,34701,34913,35114,35122,35109,35115,35105,
+35242,35238,35558,35578,35563,35569,35584,35548,35559,35566,35582,35585,35586,
+35575,35565,35571,35574,35580,35947,35949,35987,36084,36420,36401,36404,36418,
+36409,36405,36667,36655,36664,36659,36776,36774,36981,36980,36984,36978,36988,
+36986,37172,37266,37664,37686,37624,37683,37679,37666,
+37628,37675,37636,37658,37648,37670,37665,37653,37678,37657,38331,38567,38568,
+38570,38613,38670,38673,38678,38669,38675,38671,38747,38748,38758,38808,38960,
+38968,38971,38967,38957,38969,38948,39184,39208,39198,39195,39201,39194,39405,
+39394,39409,39608,39612,39675,39661,39720,39825,40213,40227,40230,40232,40210,
+40219,40664,40660,40845,40860,20778,20767,20769,20786,21237,22158,22144,22160,
+22149,22151,22159,22741,22739,22737,22734,23344,23338,23332,23418,23607,23656,
+23996,23994,23997,23992,24171,24396,24509,25033,25026,25031,25062,25035,25138,
+25140,25806,25802,25816,25824,25840,25830,25836,25841,25826,25837,25986,25987,
+26329,26326,27264,27284,27268,27298,27292,27355,27299,27262,27287,27280,27296,
+27484,27566,27610,27656,28632,28657,28639,28640,28635,28644,28651,28655,28544,
+28652,28641,28649,28629,28654,28656,29159,29151,29166,29158,29157,29165,29164,
+29172,29152,29237,29254,29552,29554,29865,29872,29862,29864,30278,30274,30284,
+30442,30643,30634,30640,30636,30631,30637,30703,30967,30970,30964,30959,30977,
+31143,31146,31319,31423,31751,31757,31742,31735,31756,31712,31968,31964,31966,
+31970,31967,31961,31965,32302,32318,32326,32311,32306,32323,32299,32317,32305,
+32325,32321,32308,32313,32328,32309,32319,32303,32580,32755,32764,32881,32882,
+32880,32879,32883,33222,33219,33210,33218,33216,33215,33213,33225,33214,33256,
+33289,33393,34218,34180,34174,34204,34193,34196,34223,34203,34183,34216,34186,
+34407,34752,34769,34739,34770,34758,34731,34747,34746,34760,34763,35131,35126,
+35140,35128,35133,35244,35598,35607,35609,35611,35594,
+35616,35613,35588,35600,35905,35903,35955,36090,36093,36092,36088,36091,36264,
+36425,36427,36424,36426,36676,36670,36674,36677,36671,36991,36989,36996,36993,
+36994,36992,37177,37283,37278,37276,37709,37762,37672,37749,37706,37733,37707,
+37656,37758,37740,37723,37744,37722,37716,38346,38347,38348,38344,38342,38577,
+38584,38614,38684,38686,38816,38867,38982,39094,39221,39425,39423,39854,39851,
+39850,39853,40251,40255,40587,40655,40670,40668,40669,40667,40766,40779,21474,
+22165,22190,22745,22744,23352,24413,25059,25139,25844,25842,25854,25862,25850,
+25851,25847,26039,26332,26406,27315,27308,27331,27323,27320,27330,27310,27311,
+27487,27512,27567,28681,28683,28670,28678,28666,28689,28687,29179,29180,29182,
+29176,29559,29557,29863,29887,29973,30294,30296,30290,30653,30655,30651,30652,
+30990,31150,31329,31330,31328,31428,31429,31787,31783,31786,31774,31779,31777,
+31975,32340,32341,32350,32346,32353,32338,32345,32584,32761,32763,32887,32886,
+33229,33231,33290,34255,34217,34253,34256,34249,34224,34234,34233,34214,34799,
+34796,34802,34784,35206,35250,35316,35624,35641,35628,35627,35920,36101,36441,
+36451,36454,36452,36447,36437,36544,36681,36685,36999,36995,37000,37291,37292,
+37328,37780,37770,37782,37794,37811,37806,37804,37808,37784,37786,37783,38356,
+38358,38352,38357,38626,38620,38617,38619,38622,38692,38819,38822,38829,38905,
+38989,38991,38988,38990,38995,39098,39230,39231,39229,39214,39333,39438,39617,
+39683,39686,39759,39758,39757,39882,39881,39933,39880,39872,40273,40285,40288,
+40672,40725,40748,20787,22181,22750,22751,22754,23541,
+40848,24300,25074,25079,25078,25077,25856,25871,26336,26333,27365,27357,27354,
+27347,28699,28703,28712,28698,28701,28693,28696,29190,29197,29272,29346,29560,
+29562,29885,29898,29923,30087,30086,30303,30305,30663,31001,31153,31339,31337,
+31806,31807,31800,31805,31799,31808,32363,32365,32377,32361,32362,32645,32371,
+32694,32697,32696,33240,34281,34269,34282,34261,34276,34277,34295,34811,34821,
+34829,34809,34814,35168,35167,35158,35166,35649,35676,35672,35657,35674,35662,
+35663,35654,35673,36104,36106,36476,36466,36487,36470,36460,36474,36468,36692,
+36686,36781,37002,37003,37297,37294,37857,37841,37855,37827,37832,37852,37853,
+37846,37858,37837,37848,37860,37847,37864,38364,38580,38627,38698,38695,38753,
+38876,38907,39006,39000,39003,39100,39237,39241,39446,39449,39693,39912,39911,
+39894,39899,40329,40289,40306,40298,40300,40594,40599,40595,40628,21240,22184,
+22199,22198,22196,22204,22756,23360,23363,23421,23542,24009,25080,25082,25880,
+25876,25881,26342,26407,27372,28734,28720,28722,29200,29563,29903,30306,30309,
+31014,31018,31020,31019,31431,31478,31820,31811,31821,31983,31984,36782,32381,
+32380,32386,32588,32768,33242,33382,34299,34297,34321,34298,34310,34315,34311,
+34314,34836,34837,35172,35258,35320,35696,35692,35686,35695,35679,35691,36111,
+36109,36489,36481,36485,36482,37300,37323,37912,37891,37885,38369,38704,39108,
+39250,39249,39336,39467,39472,39479,39477,39955,39949,40569,40629,40680,40751,
+40799,40803,40801,20791,20792,22209,22208,22210,22804,23660,24013,25084,25086,
+25885,25884,26005,26345,27387,27396,27386,27570,28748,
+29211,29351,29910,29908,30313,30675,31824,32399,32396,32700,34327,34349,34330,
+34851,34850,34849,34847,35178,35180,35261,35700,35703,35709,36115,36490,36493,
+36491,36703,36783,37306,37934,37939,37941,37946,37944,37938,37931,38370,38712,
+38713,38706,38911,39015,39013,39255,39493,39491,39488,39486,39631,39764,39761,
+39981,39973,40367,40372,40386,40376,40605,40687,40729,40796,40806,40807,20796,
+20795,22216,22218,22217,23423,24020,24018,24398,25087,25892,27402,27489,28753,
+28760,29568,29924,30090,30318,30316,31155,31840,31839,32894,32893,33247,35186,
+35183,35324,35712,36118,36119,36497,36499,36705,37192,37956,37969,37970,38717,
+38718,38851,38849,39019,39253,39509,39501,39634,39706,40009,39985,39998,39995,
+40403,40407,40756,40812,40810,40852,22220,24022,25088,25891,25899,25898,26348,
+27408,29914,31434,31844,31843,31845,32403,32406,32404,33250,34360,34367,34865,
+35722,37008,37007,37987,37984,37988,38760,39023,39260,39514,39515,39511,39635,
+39636,39633,40020,40023,40022,40421,40607,40692,22225,22761,25900,28766,30321,
+30322,30679,32592,32648,34870,34873,34914,35731,35730,35734,33399,36123,37312,
+37994,38722,38728,38724,38854,39024,39519,39714,39768,40031,40441,40442,40572,
+40573,40711,40823,40818,24307,27414,28771,31852,31854,34875,35264,36513,37313,
+38002,38000,39025,39262,39638,39715,40652,28772,30682,35738,38007,38857,39522,
+39525,32412,35740,36522,37317,38013,38014,38012,40055,40056,40695,35924,38015,
+40474,29224,39530,39729,40475,40478,31858,9312,9313,9314,9315,9316,9317,9318,
+9319,9320,9321,9332,9333,9334,9335,9336,
+9337,9338,9339,9340,9341,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,
+20022,20031,20101,20128,20866,20886,20907,21241,21304,21353,21430,22794,23424,
+24027,24186,24191,24308,24400,24417,25908,26080,30098,30326,36789,38582,168,
+710,12541,12542,12445,12446,0,0,12293,12294,12295,12540,65339,65341,10045,
+12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,
+12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,
+12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,
+12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,
+12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,
+12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,
+12431,12432,12433,12434,12435,12449,12450,12451,12452,12453,12454,12455,12456,
+12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,
+12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,
+12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,
+12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,
+12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,
+12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,
+1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,
+1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,
+1069,1070,
+1071,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,
+1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,
+1100,1101,1102,1103,8679,8632,8633,12751,204,20058,138,20994,17553,40880,
+20872,40881,30215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,65506,65508,65287,65282,12849,8470,8481,12443,12444,11904,
+11908,11910,11911,11912,11914,11916,11917,11925,11932,11933,11941,11943,11946,
+11948,11950,11958,11964,11966,11974,11978,11980,11981,11983,11990,11991,11998,
+12003,0,0,0,643,592,603,596,629,339,248,331,650,618,20034,20060,20981,21274,
+21378,19975,19980,20039,20109,22231,64012,23662,24435,19983,20871,19982,20014,
+20115,20162,20169,20168,20888,21244,21356,21433,22304,22787,22828,23568,24063,
+26081,27571,27596,27668,29247,20017,20028,20200,20188,20201,20193,20189,20186,
+21004,21276,21324,22306,22307,22807,22831,23425,23428,23570,23611,23668,23667,
+24068,24192,24194,24521,25097,25168,27669,27702,27715,27711,27707,29358,29360,
+29578,31160,32906,38430,20238,20248,20268,20213,20244,20209,20224,20215,20232,
+20253,20226,20229,20258,20243,20228,20212,20242,20913,21011,21001,21008,21158,
+21282,21279,21325,21386,21511,22241,22239,22318,22314,22324,22844,22912,22908,
+22917,22907,22910,22903,22911,23382,23573,23589,23676,23674,23675,
+23678,24031,24181,24196,24322,24346,24436,24533,24532,24527,25180,25182,25188,
+25185,25190,25186,25177,25184,25178,25189,26095,26094,26430,26425,26424,26427,
+26426,26431,26428,26419,27672,27718,27730,27740,27727,27722,27732,27723,27724,
+28785,29278,29364,29365,29582,29994,30335,31349,32593,33400,33404,33408,33405,
+33407,34381,35198,37017,37015,37016,37019,37012,38434,38436,38432,38435,20310,
+20283,20322,20297,20307,20324,20286,20327,20306,20319,20289,20312,20269,20275,
+20287,20321,20879,20921,21020,21022,21025,21165,21166,21257,21347,21362,21390,
+21391,21552,21559,21546,21588,21573,21529,21532,21541,21528,21565,21583,21569,
+21544,21540,21575,22254,22247,22245,22337,22341,22348,22345,22347,22354,22790,
+22848,22950,22936,22944,22935,22926,22946,22928,22927,22951,22945,23438,23442,
+23592,23594,23693,23695,23688,23691,23689,23698,23690,23686,23699,23701,24032,
+24074,24078,24203,24201,24204,24200,24205,24325,24349,24440,24438,24530,24529,
+24528,24557,24552,24558,24563,24545,24548,24547,24570,24559,24567,24571,24576,
+24564,25146,25219,25228,25230,25231,25236,25223,25201,25211,25210,25200,25217,
+25224,25207,25213,25202,25204,25911,26096,26100,26099,26098,26101,26437,26439,
+26457,26453,26444,26440,26461,26445,26458,26443,27600,27673,27674,27768,27751,
+27755,27780,27787,27791,27761,27759,27753,27802,27757,27783,27797,27804,27750,
+27763,27749,27771,27790,28788,28794,29283,29375,29373,29379,29382,29377,29370,
+29381,29589,29591,29587,29588,29586,30010,30009,30100,30101,30337,31037,32820,
+32917,32921,32912,32914,32924,33424,33423,33413,33422,
+33425,33427,33418,33411,33412,35960,36809,36799,37023,37025,37029,37022,37031,
+37024,38448,38440,38447,38445,20019,20376,20348,20357,20349,20352,20359,20342,
+20340,20361,20356,20343,20300,20375,20330,20378,20345,20353,20344,20368,20380,
+20372,20382,20370,20354,20373,20331,20334,20894,20924,20926,21045,21042,21043,
+21062,21041,21180,21258,21259,21308,21394,21396,21639,21631,21633,21649,21634,
+21640,21611,21626,21630,21605,21612,21620,21606,21645,21615,21601,21600,21656,
+21603,21607,21604,22263,22265,22383,22386,22381,22379,22385,22384,22390,22400,
+22389,22395,22387,22388,22370,22376,22397,22796,22853,22965,22970,22991,22990,
+22962,22988,22977,22966,22972,22979,22998,22961,22973,22976,22984,22964,22983,
+23394,23397,23443,23445,23620,23623,23726,23716,23712,23733,23727,23720,23724,
+23711,23715,23725,23714,23722,23719,23709,23717,23734,23728,23718,24087,24084,
+24089,24360,24354,24355,24356,24404,24450,24446,24445,24542,24549,24621,24614,
+24601,24626,24587,24628,24586,24599,24627,24602,24606,24620,24610,24589,24592,
+24622,24595,24593,24588,24585,24604,25108,25149,25261,25268,25297,25278,25258,
+25270,25290,25262,25267,25263,25275,25257,25264,25272,25917,26024,26043,26121,
+26108,26116,26130,26120,26107,26115,26123,26125,26117,26109,26129,26128,26358,
+26378,26501,26476,26510,26514,26486,26491,26520,26502,26500,26484,26509,26508,
+26490,26527,26513,26521,26499,26493,26497,26488,26489,26516,27429,27520,27518,
+27614,27677,27795,27884,27883,27886,27865,27830,27860,27821,27879,27831,27856,
+27842,27834,27843,27846,27885,27890,27858,27869,27828,
+27786,27805,27776,27870,27840,27952,27853,27847,27824,27897,27855,27881,27857,
+28820,28824,28805,28819,28806,28804,28817,28822,28802,28826,28803,29290,29398,
+29387,29400,29385,29404,29394,29396,29402,29388,29393,29604,29601,29613,29606,
+29602,29600,29612,29597,29917,29928,30015,30016,30014,30092,30104,30383,30451,
+30449,30448,30453,30712,30716,30713,30715,30714,30711,31042,31039,31173,31352,
+31355,31483,31861,31997,32821,32911,32942,32931,32952,32949,32941,33312,33440,
+33472,33451,33434,33432,33435,33461,33447,33454,33468,33438,33466,33460,33448,
+33441,33449,33474,33444,33475,33462,33442,34416,34415,34413,34414,35926,36818,
+36811,36819,36813,36822,36821,36823,37042,37044,37039,37043,37040,38457,38461,
+38460,38458,38467,20429,20421,20435,20402,20425,20427,20417,20436,20444,20441,
+20411,20403,20443,20423,20438,20410,20416,20409,20460,21060,21065,21184,21186,
+21309,21372,21399,21398,21401,21400,21690,21665,21677,21669,21711,21699,33549,
+21687,21678,21718,21686,21701,21702,21664,21616,21692,21666,21694,21618,21726,
+21680,22453,22430,22431,22436,22412,22423,22429,22427,22420,22424,22415,22425,
+22437,22426,22421,22772,22797,22867,23009,23006,23022,23040,23025,23005,23034,
+23037,23036,23030,23012,23026,23031,23003,23017,23027,23029,23008,23038,23028,
+23021,23464,23628,23760,23768,23756,23767,23755,23771,23774,23770,23753,23751,
+23754,23766,23763,23764,23759,23752,23750,23758,23775,23800,24057,24097,24098,
+24099,24096,24100,24240,24228,24226,24219,24227,24229,24327,24366,24406,24454,
+24631,24633,24660,24690,24670,24645,24659,24647,24649,
+24667,24652,24640,24642,24671,24612,24644,24664,24678,24686,25154,25155,25295,
+25357,25355,25333,25358,25347,25323,25337,25359,25356,25336,25334,25344,25363,
+25364,25338,25365,25339,25328,25921,25923,26026,26047,26166,26145,26162,26165,
+26140,26150,26146,26163,26155,26170,26141,26164,26169,26158,26383,26384,26561,
+26610,26568,26554,26588,26555,26616,26584,26560,26551,26565,26603,26596,26591,
+26549,26573,26547,26615,26614,26606,26595,26562,26553,26574,26599,26608,26546,
+26620,26566,26605,26572,26542,26598,26587,26618,26569,26570,26563,26602,26571,
+27432,27522,27524,27574,27606,27608,27616,27680,27681,27944,27956,27949,27935,
+27964,27967,27922,27914,27866,27955,27908,27929,27962,27930,27921,27904,27933,
+27970,27905,27928,27959,27907,27919,27968,27911,27936,27948,27912,27938,27913,
+27920,28855,28831,28862,28849,28848,28833,28852,28853,28841,29249,29257,29258,
+29292,29296,29299,29294,29386,29412,29416,29419,29407,29418,29414,29411,29573,
+29644,29634,29640,29637,29625,29622,29621,29620,29675,29631,29639,29630,29635,
+29638,29624,29643,29932,29934,29998,30023,30024,30119,30122,30329,30404,30472,
+30467,30468,30469,30474,30455,30459,30458,30695,30696,30726,30737,30738,30725,
+30736,30735,30734,30729,30723,30739,31050,31052,31051,31045,31044,31189,31181,
+31183,31190,31182,31360,31358,31441,31488,31489,31866,31864,31865,31871,31872,
+31873,32003,32008,32001,32600,32657,32653,32702,32775,32782,32783,32788,32823,
+32984,32967,32992,32977,32968,32962,32976,32965,32995,32985,32988,32970,32981,
+32969,32975,32983,32998,32973,33279,33313,33428,33497,
+33534,33529,33543,33512,33536,33493,33594,33515,33494,33524,33516,33505,33522,
+33525,33548,33531,33526,33520,33514,33508,33504,33530,33523,33517,34423,34420,
+34428,34419,34881,34894,34919,34922,34921,35283,35332,35335,36210,36835,36833,
+36846,36832,37105,37053,37055,37077,37061,37054,37063,37067,37064,37332,37331,
+38484,38479,38481,38483,38474,38478,20510,20485,20487,20499,20514,20528,20507,
+20469,20468,20531,20535,20524,20470,20471,20503,20508,20512,20519,20533,20527,
+20529,20494,20826,20884,20883,20938,20932,20933,20936,20942,21089,21082,21074,
+21086,21087,21077,21090,21197,21262,21406,21798,21730,21783,21778,21735,21747,
+21732,21786,21759,21764,21768,21739,21777,21765,21745,21770,21755,21751,21752,
+21728,21774,21763,21771,22273,22274,22476,22578,22485,22482,22458,22470,22461,
+22460,22456,22454,22463,22471,22480,22457,22465,22798,22858,23065,23062,23085,
+23086,23061,23055,23063,23050,23070,23091,23404,23463,23469,23468,23555,23638,
+23636,23788,23807,23790,23793,23799,23808,23801,24105,24104,24232,24238,24234,
+24236,24371,24368,24423,24669,24666,24679,24641,24738,24712,24704,24722,24705,
+24733,24707,24725,24731,24727,24711,24732,24718,25113,25158,25330,25360,25430,
+25388,25412,25413,25398,25411,25572,25401,25419,25418,25404,25385,25409,25396,
+25432,25428,25433,25389,25415,25395,25434,25425,25400,25431,25408,25416,25930,
+25926,26054,26051,26052,26050,26186,26207,26183,26193,26386,26387,26655,26650,
+26697,26674,26675,26683,26699,26703,26646,26673,26652,26677,26667,26669,26671,
+26702,26692,26676,26653,26642,26644,26662,26664,26670,
+26701,26682,26661,26656,27436,27439,27437,27441,27444,27501,32898,27528,27622,
+27620,27624,27619,27618,27623,27685,28026,28003,28004,28022,27917,28001,28050,
+27992,28002,28013,28015,28049,28045,28143,28031,28038,27998,28007,28000,28055,
+28016,28028,27999,28034,28056,27951,28008,28043,28030,28032,28036,27926,28035,
+28027,28029,28021,28048,28892,28883,28881,28893,28875,32569,28898,28887,28882,
+28894,28896,28884,28877,28869,28870,28871,28890,28878,28897,29250,29304,29303,
+29302,29440,29434,29428,29438,29430,29427,29435,29441,29651,29657,29669,29654,
+29628,29671,29667,29673,29660,29650,29659,29652,29661,29658,29655,29656,29672,
+29918,29919,29940,29941,29985,30043,30047,30128,30145,30139,30148,30144,30143,
+30134,30138,30346,30409,30493,30491,30480,30483,30482,30499,30481,30485,30489,
+30490,30498,30503,30755,30764,30754,30773,30767,30760,30766,30763,30753,30761,
+30771,30762,30769,31060,31067,31055,31068,31059,31058,31057,31211,31212,31200,
+31214,31213,31210,31196,31198,31197,31366,31369,31365,31371,31372,31370,31367,
+31448,31504,31492,31507,31493,31503,31496,31498,31502,31497,31506,31876,31889,
+31882,31884,31880,31885,31877,32030,32029,32017,32014,32024,32022,32019,32031,
+32018,32015,32012,32604,32609,32606,32608,32605,32603,32662,32658,32707,32706,
+32704,32790,32830,32825,33018,33010,33017,33013,33025,33019,33024,33281,33327,
+33317,33587,33581,33604,33561,33617,33573,33622,33599,33601,33574,33564,33570,
+33602,33614,33563,33578,33544,33596,33613,33558,33572,33568,33591,33583,33577,
+33607,33605,33612,33619,33566,33580,33611,33575,33608,
+34387,34386,34466,34472,34454,34445,34449,34462,34439,34455,34438,34443,34458,
+34437,34469,34457,34465,34471,34453,34456,34446,34461,34448,34452,34883,34884,
+34925,34933,34934,34930,34944,34929,34943,34927,34947,34942,34932,34940,35346,
+35911,35927,35963,36004,36003,36214,36216,36277,36279,36278,36561,36563,36862,
+36853,36866,36863,36859,36868,36860,36854,37078,37088,37081,37082,37091,37087,
+37093,37080,37083,37079,37084,37092,37200,37198,37199,37333,37346,37338,38492,
+38495,38588,39139,39647,39727,20095,20592,20586,20577,20574,20576,20563,20555,
+20573,20594,20552,20557,20545,20571,20554,20578,20501,20549,20575,20585,20587,
+20579,20580,20550,20544,20590,20595,20567,20561,20944,21099,21101,21100,21102,
+21206,21203,21293,21404,21877,21878,21820,21837,21840,21812,21802,21841,21858,
+21814,21813,21808,21842,21829,21772,21810,21861,21838,21817,21832,21805,21819,
+21824,21835,22282,22279,22523,22548,22498,22518,22492,22516,22528,22509,22525,
+22536,22520,22539,22515,22479,22535,22510,22499,22514,22501,22508,22497,22542,
+22524,22544,22503,22529,22540,22513,22505,22512,22541,22532,22876,23136,23128,
+23125,23143,23134,23096,23093,23149,23120,23135,23141,23148,23123,23140,23127,
+23107,23133,23122,23108,23131,23112,23182,23102,23117,23097,23116,23152,23145,
+23111,23121,23126,23106,23132,23410,23406,23489,23488,23641,23838,23819,23837,
+23834,23840,23820,23848,23821,23846,23845,23823,23856,23826,23843,23839,23854,
+24126,24116,24241,24244,24249,24242,24243,24374,24376,24475,24470,24479,24714,
+24720,24710,24766,24752,24762,24787,24788,24783,24804,
+24793,24797,24776,24753,24795,24759,24778,24767,24771,24781,24768,25394,25445,
+25482,25474,25469,25533,25502,25517,25501,25495,25515,25486,25455,25479,25488,
+25454,25519,25461,25500,25453,25518,25468,25508,25403,25503,25464,25477,25473,
+25489,25485,25456,25939,26061,26213,26209,26203,26201,26204,26210,26392,26745,
+26759,26768,26780,26733,26734,26798,26795,26966,26735,26787,26796,26793,26741,
+26740,26802,26767,26743,26770,26748,26731,26738,26794,26752,26737,26750,26779,
+26774,26763,26784,26761,26788,26744,26747,26769,26764,26762,26749,27446,27443,
+27447,27448,27537,27535,27533,27534,27532,27690,28096,28075,28084,28083,28276,
+28076,28137,28130,28087,28150,28116,28160,28104,28128,28127,28118,28094,28133,
+28124,28125,28123,28148,28106,28093,28141,28144,28090,28117,28098,28111,28105,
+28112,28146,28115,28157,28119,28109,28131,28091,28922,28941,28919,28951,28916,
+28940,28912,28932,28915,28944,28924,28927,28934,28947,28928,28920,28918,28939,
+28930,28942,29310,29307,29308,29311,29469,29463,29447,29457,29464,29450,29448,
+29439,29455,29470,29576,29686,29688,29685,29700,29697,29693,29703,29696,29690,
+29692,29695,29708,29707,29684,29704,30052,30051,30158,30162,30159,30155,30156,
+30161,30160,30351,30345,30419,30521,30511,30509,30513,30514,30516,30515,30525,
+30501,30523,30517,30792,30802,30793,30797,30794,30796,30758,30789,30800,31076,
+31079,31081,31082,31075,31083,31073,31163,31226,31224,31222,31223,31375,31380,
+31376,31541,31559,31540,31525,31536,31522,31524,31539,31512,31530,31517,31537,
+31531,31533,31535,31538,31544,31514,31523,31892,31896,
+31894,31907,32053,32061,32056,32054,32058,32069,32044,32041,32065,32071,32062,
+32063,32074,32059,32040,32611,32661,32668,32669,32667,32714,32715,32717,32720,
+32721,32711,32719,32713,32799,32798,32795,32839,32835,32840,33048,33061,33049,
+33051,33069,33055,33068,33054,33057,33045,33063,33053,33058,33297,33336,33331,
+33338,33332,33330,33396,33680,33699,33704,33677,33658,33651,33700,33652,33679,
+33665,33685,33689,33653,33684,33705,33661,33667,33676,33693,33691,33706,33675,
+33662,33701,33711,33672,33687,33712,33663,33702,33671,33710,33654,33690,34393,
+34390,34495,34487,34498,34497,34501,34490,34480,34504,34489,34483,34488,34508,
+34484,34491,34492,34499,34493,34494,34898,34953,34965,34984,34978,34986,34970,
+34961,34977,34975,34968,34983,34969,34971,34967,34980,34988,34956,34963,34958,
+35202,35286,35289,35285,35376,35367,35372,35358,35897,35899,35932,35933,35965,
+36005,36221,36219,36217,36284,36290,36281,36287,36289,36568,36574,36573,36572,
+36567,36576,36577,36900,36875,36881,36892,36876,36897,37103,37098,37104,37108,
+37106,37107,37076,37099,37100,37097,37206,37208,37210,37203,37205,37356,37364,
+37361,37363,37368,37348,37369,37354,37355,37367,37352,37358,38266,38278,38280,
+38524,38509,38507,38513,38511,38591,38762,38916,39141,39319,20635,20629,20628,
+20638,20619,20643,20611,20620,20622,20637,20584,20636,20626,20610,20615,20831,
+20948,21266,21265,21412,21415,21905,21928,21925,21933,21879,22085,21922,21907,
+21896,21903,21941,21889,21923,21906,21924,21885,21900,21926,21887,21909,21921,
+21902,22284,22569,22583,22553,22558,22567,22563,22568,
+22517,22600,22565,22556,22555,22579,22591,22582,22574,22585,22584,22573,22572,
+22587,22881,23215,23188,23199,23162,23202,23198,23160,23206,23164,23205,23212,
+23189,23214,23095,23172,23178,23191,23171,23179,23209,23163,23165,23180,23196,
+23183,23187,23197,23530,23501,23499,23508,23505,23498,23502,23564,23600,23863,
+23875,23915,23873,23883,23871,23861,23889,23886,23893,23859,23866,23890,23869,
+23857,23897,23874,23865,23881,23864,23868,23858,23862,23872,23877,24132,24129,
+24408,24486,24485,24491,24777,24761,24780,24802,24782,24772,24852,24818,24842,
+24854,24837,24821,24851,24824,24828,24830,24769,24835,24856,24861,24848,24831,
+24836,24843,25162,25492,25521,25520,25550,25573,25576,25583,25539,25757,25587,
+25546,25568,25590,25557,25586,25589,25697,25567,25534,25565,25564,25540,25560,
+25555,25538,25543,25548,25547,25544,25584,25559,25561,25906,25959,25962,25956,
+25948,25960,25957,25996,26013,26014,26030,26064,26066,26236,26220,26235,26240,
+26225,26233,26218,26226,26369,26892,26835,26884,26844,26922,26860,26858,26865,
+26895,26838,26871,26859,26852,26870,26899,26896,26867,26849,26887,26828,26888,
+26992,26804,26897,26863,26822,26900,26872,26832,26877,26876,26856,26891,26890,
+26903,26830,26824,26845,26846,26854,26868,26833,26886,26836,26857,26901,26917,
+26823,27449,27451,27455,27452,27540,27543,27545,27541,27581,27632,27634,27635,
+27696,28156,28230,28231,28191,28233,28296,28220,28221,28229,28258,28203,28223,
+28225,28253,28275,28188,28211,28235,28224,28241,28219,28163,28206,28254,28264,
+28252,28257,28209,28200,28256,28273,28267,28217,28194,
+28208,28243,28261,28199,28280,28260,28279,28245,28281,28242,28262,28213,28214,
+28250,28960,28958,28975,28923,28974,28977,28963,28965,28962,28978,28959,28968,
+28986,28955,29259,29274,29320,29321,29318,29317,29323,29458,29451,29488,29474,
+29489,29491,29479,29490,29485,29478,29475,29493,29452,29742,29740,29744,29739,
+29718,29722,29729,29741,29745,29732,29731,29725,29737,29728,29746,29947,29999,
+30063,30060,30183,30170,30177,30182,30173,30175,30180,30167,30357,30354,30426,
+30534,30535,30532,30541,30533,30538,30542,30539,30540,30686,30700,30816,30820,
+30821,30812,30829,30833,30826,30830,30832,30825,30824,30814,30818,31092,31091,
+31090,31088,31234,31242,31235,31244,31236,31385,31462,31460,31562,31547,31556,
+31560,31564,31566,31552,31576,31557,31906,31902,31912,31905,32088,32111,32099,
+32083,32086,32103,32106,32079,32109,32092,32107,32082,32084,32105,32081,32095,
+32078,32574,32575,32613,32614,32674,32672,32673,32727,32849,32847,32848,33022,
+32980,33091,33098,33106,33103,33095,33085,33101,33082,33254,33262,33271,33272,
+33273,33284,33340,33341,33343,33397,33595,33743,33785,33827,33728,33768,33810,
+33767,33764,33788,33782,33808,33734,33736,33771,33763,33727,33793,33757,33765,
+33752,33791,33761,33739,33742,33750,33781,33737,33801,33807,33758,33809,33798,
+33730,33779,33749,33786,33735,33745,33770,33811,33731,33772,33774,33732,33787,
+33751,33762,33819,33755,33790,34520,34530,34534,34515,34531,34522,34538,34525,
+34539,34524,34540,34537,34519,34536,34513,34888,34902,34901,35002,35031,35001,
+35000,35008,35006,34998,35004,34999,35005,34994,35073,
+35017,35221,35224,35223,35293,35290,35291,35406,35405,35385,35417,35392,35415,
+35416,35396,35397,35410,35400,35409,35402,35404,35407,35935,35969,35968,36026,
+36030,36016,36025,36021,36228,36224,36233,36312,36307,36301,36295,36310,36316,
+36303,36309,36313,36296,36311,36293,36591,36599,36602,36601,36582,36590,36581,
+36597,36583,36584,36598,36587,36593,36588,36596,36585,36909,36916,36911,37126,
+37164,37124,37119,37116,37128,37113,37115,37121,37120,37127,37125,37123,37217,
+37220,37215,37218,37216,37377,37386,37413,37379,37402,37414,37391,37388,37376,
+37394,37375,37373,37382,37380,37415,37378,37404,37412,37401,37399,37381,37398,
+38267,38285,38284,38288,38535,38526,38536,38537,38531,38528,38594,38600,38595,
+38641,38640,38764,38768,38766,38919,39081,39147,40166,40697,20099,20100,20150,
+20669,20671,20678,20654,20676,20682,20660,20680,20674,20656,20673,20666,20657,
+20683,20681,20662,20664,20951,21114,21112,21115,21116,21955,21979,21964,21968,
+21963,21962,21981,21952,21972,21956,21993,21951,21970,21901,21967,21973,21986,
+21974,21960,22002,21965,21977,21954,22292,22611,22632,22628,22607,22605,22601,
+22639,22613,22606,22621,22617,22629,22619,22589,22627,22641,22780,23239,23236,
+23243,23226,23224,23217,23221,23216,23231,23240,23227,23238,23223,23232,23242,
+23220,23222,23245,23225,23184,23510,23512,23513,23583,23603,23921,23907,23882,
+23909,23922,23916,23902,23912,23911,23906,24048,24143,24142,24138,24141,24139,
+24261,24268,24262,24267,24263,24384,24495,24493,24823,24905,24906,24875,24901,
+24886,24882,24878,24902,24879,24911,24873,24896,25120,
+37224,25123,25125,25124,25541,25585,25579,25616,25618,25609,25632,25636,25651,
+25667,25631,25621,25624,25657,25655,25634,25635,25612,25638,25648,25640,25665,
+25653,25647,25610,25626,25664,25637,25639,25611,25575,25627,25646,25633,25614,
+25967,26002,26067,26246,26252,26261,26256,26251,26250,26265,26260,26232,26400,
+26982,26975,26936,26958,26978,26993,26943,26949,26986,26937,26946,26967,26969,
+27002,26952,26953,26933,26988,26931,26941,26981,26864,27000,26932,26985,26944,
+26991,26948,26998,26968,26945,26996,26956,26939,26955,26935,26972,26959,26961,
+26930,26962,26927,27003,26940,27462,27461,27459,27458,27464,27457,27547,64013,
+27643,27644,27641,27639,27640,28315,28374,28360,28303,28352,28319,28307,28308,
+28320,28337,28345,28358,28370,28349,28353,28318,28361,28343,28336,28365,28326,
+28367,28338,28350,28355,28380,28376,28313,28306,28302,28301,28324,28321,28351,
+28339,28368,28362,28311,28334,28323,28999,29012,29010,29027,29024,28993,29021,
+29026,29042,29048,29034,29025,28994,29016,28995,29003,29040,29023,29008,29011,
+28996,29005,29018,29263,29325,29324,29329,29328,29326,29500,29506,29499,29498,
+29504,29514,29513,29764,29770,29771,29778,29777,29783,29760,29775,29776,29774,
+29762,29766,29773,29780,29921,29951,29950,29949,29981,30073,30071,27011,30191,
+30223,30211,30199,30206,30204,30201,30200,30224,30203,30198,30189,30197,30205,
+30361,30389,30429,30549,30559,30560,30546,30550,30554,30569,30567,30548,30553,
+30573,30688,30855,30874,30868,30863,30852,30869,30853,30854,30881,30851,30841,
+30873,30848,30870,30843,31100,31106,31101,31097,31249,
+31256,31257,31250,31255,31253,31266,31251,31259,31248,31395,31394,31390,31467,
+31590,31588,31597,31604,31593,31602,31589,31603,31601,31600,31585,31608,31606,
+31587,31922,31924,31919,32136,32134,32128,32141,32127,32133,32122,32142,32123,
+32131,32124,32140,32148,32132,32125,32146,32621,32619,32615,32616,32620,32678,
+32677,32679,32731,32732,32801,33124,33120,33143,33116,33129,33115,33122,33138,
+26401,33118,33142,33127,33135,33092,33121,33309,33353,33348,33344,33346,33349,
+34033,33855,33878,33910,33913,33935,33933,33893,33873,33856,33926,33895,33840,
+33869,33917,33882,33881,33908,33907,33885,34055,33886,33847,33850,33844,33914,
+33859,33912,33842,33861,33833,33753,33867,33839,33858,33837,33887,33904,33849,
+33870,33868,33874,33903,33989,33934,33851,33863,33846,33843,33896,33918,33860,
+33835,33888,33876,33902,33872,34571,34564,34551,34572,34554,34518,34549,34637,
+34552,34574,34569,34561,34550,34573,34565,35030,35019,35021,35022,35038,35035,
+35034,35020,35024,35205,35227,35295,35301,35300,35297,35296,35298,35292,35302,
+35446,35462,35455,35425,35391,35447,35458,35460,35445,35459,35457,35444,35450,
+35900,35915,35914,35941,35940,35942,35974,35972,35973,36044,36200,36201,36241,
+36236,36238,36239,36237,36243,36244,36240,36242,36336,36320,36332,36337,36334,
+36304,36329,36323,36322,36327,36338,36331,36340,36614,36607,36609,36608,36613,
+36615,36616,36610,36619,36946,36927,36932,36937,36925,37136,37133,37135,37137,
+37142,37140,37131,37134,37230,37231,37448,37458,37424,37434,37478,37427,37477,
+37470,37507,37422,37450,37446,37485,37484,37455,37472,
+37479,37487,37430,37473,37488,37425,37460,37475,37456,37490,37454,37459,37452,
+37462,37426,38303,38300,38302,38299,38546,38547,38545,38551,38606,38650,38653,
+38648,38645,38771,38775,38776,38770,38927,38925,38926,39084,39158,39161,39343,
+39346,39344,39349,39597,39595,39771,40170,40173,40167,40576,40701,20710,20692,
+20695,20712,20723,20699,20714,20701,20708,20691,20716,20720,20719,20707,20704,
+20952,21120,21121,21225,21227,21296,21420,22055,22037,22028,22034,22012,22031,
+22044,22017,22035,22018,22010,22045,22020,22015,22009,22665,22652,22672,22680,
+22662,22657,22655,22644,22667,22650,22663,22673,22670,22646,22658,22664,22651,
+22676,22671,22782,22891,23260,23278,23269,23253,23274,23258,23277,23275,23283,
+23266,23264,23259,23276,23262,23261,23257,23272,23263,23415,23520,23523,23651,
+23938,23936,23933,23942,23930,23937,23927,23946,23945,23944,23934,23932,23949,
+23929,23935,24152,24153,24147,24280,24273,24279,24270,24284,24277,24281,24274,
+24276,24388,24387,24431,24502,24876,24872,24897,24926,24945,24947,24914,24915,
+24946,24940,24960,24948,24916,24954,24923,24933,24891,24938,24929,24918,25129,
+25127,25131,25643,25677,25691,25693,25716,25718,25714,25715,25725,25717,25702,
+25766,25678,25730,25694,25692,25675,25683,25696,25680,25727,25663,25708,25707,
+25689,25701,25719,25971,26016,26273,26272,26271,26373,26372,26402,27057,27062,
+27081,27040,27086,27030,27056,27052,27068,27025,27033,27022,27047,27021,27049,
+27070,27055,27071,27076,27069,27044,27092,27065,27082,27034,27087,27059,27027,
+27050,27041,27038,27097,27031,27024,27074,27061,27045,
+27078,27466,27469,27467,27550,27551,27552,27587,27588,27646,28366,28405,28401,
+28419,28453,28408,28471,28411,28462,28425,28494,28441,28442,28455,28440,28475,
+28434,28397,28426,28470,28531,28409,28398,28461,28480,28464,28476,28469,28395,
+28423,28430,28483,28421,28413,28406,28473,28444,28412,28474,28447,28429,28446,
+28424,28449,29063,29072,29065,29056,29061,29058,29071,29051,29062,29057,29079,
+29252,29267,29335,29333,29331,29507,29517,29521,29516,29794,29811,29809,29813,
+29810,29799,29806,29952,29954,29955,30077,30096,30230,30216,30220,30229,30225,
+30218,30228,30392,30593,30588,30597,30594,30574,30592,30575,30590,30595,30898,
+30890,30900,30893,30888,30846,30891,30878,30885,30880,30892,30882,30884,31128,
+31114,31115,31126,31125,31124,31123,31127,31112,31122,31120,31275,31306,31280,
+31279,31272,31270,31400,31403,31404,31470,31624,31644,31626,31633,31632,31638,
+31629,31628,31643,31630,31621,31640,21124,31641,31652,31618,31931,31935,31932,
+31930,32167,32183,32194,32163,32170,32193,32192,32197,32157,32206,32196,32198,
+32203,32204,32175,32185,32150,32188,32159,32166,32174,32169,32161,32201,32627,
+32738,32739,32741,32734,32804,32861,32860,33161,33158,33155,33159,33165,33164,
+33163,33301,33943,33956,33953,33951,33978,33998,33986,33964,33966,33963,33977,
+33972,33985,33997,33962,33946,33969,34000,33949,33959,33979,33954,33940,33991,
+33996,33947,33961,33967,33960,34006,33944,33974,33999,33952,34007,34004,34002,
+34011,33968,33937,34401,34611,34595,34600,34667,34624,34606,34590,34593,34585,
+34587,34627,34604,34625,34622,34630,34592,34610,34602,
+34605,34620,34578,34618,34609,34613,34626,34598,34599,34616,34596,34586,34608,
+34577,35063,35047,35057,35058,35066,35070,35054,35068,35062,35067,35056,35052,
+35051,35229,35233,35231,35230,35305,35307,35304,35499,35481,35467,35474,35471,
+35478,35901,35944,35945,36053,36047,36055,36246,36361,36354,36351,36365,36349,
+36362,36355,36359,36358,36357,36350,36352,36356,36624,36625,36622,36621,37155,
+37148,37152,37154,37151,37149,37146,37156,37153,37147,37242,37234,37241,37235,
+37541,37540,37494,37531,37498,37536,37524,37546,37517,37542,37530,37547,37497,
+37527,37503,37539,37614,37518,37506,37525,37538,37501,37512,37537,37514,37510,
+37516,37529,37543,37502,37511,37545,37533,37515,37421,38558,38561,38655,38744,
+38781,38778,38782,38787,38784,38786,38779,38788,38785,38783,38862,38861,38934,
+39085,39086,39170,39168,39175,39325,39324,39363,39353,39355,39354,39362,39357,
+39367,39601,39651,39655,39742,39743,39776,39777,39775,40177,40178,40181,40615,
+20735,20739,20784,20728,20742,20743,20726,20734,20747,20748,20733,20746,21131,
+21132,21233,21231,22088,22082,22092,22069,22081,22090,22089,22086,22104,22106,
+22080,22067,22077,22060,22078,22072,22058,22074,22298,22699,22685,22705,22688,
+22691,22703,22700,22693,22689,22783,23295,23284,23293,23287,23286,23299,23288,
+23298,23289,23297,23303,23301,23311,23655,23961,23959,23967,23954,23970,23955,
+23957,23968,23964,23969,23962,23966,24169,24157,24160,24156,32243,24283,24286,
+24289,24393,24498,24971,24963,24953,25009,25008,24994,24969,24987,24979,25007,
+25005,24991,24978,25002,24993,24973,24934,25011,25133,
+25710,25712,25750,25760,25733,25751,25756,25743,25739,25738,25740,25763,25759,
+25704,25777,25752,25974,25978,25977,25979,26034,26035,26293,26288,26281,26290,
+26295,26282,26287,27136,27142,27159,27109,27128,27157,27121,27108,27168,27135,
+27116,27106,27163,27165,27134,27175,27122,27118,27156,27127,27111,27200,27144,
+27110,27131,27149,27132,27115,27145,27140,27160,27173,27151,27126,27174,27143,
+27124,27158,27473,27557,27555,27554,27558,27649,27648,27647,27650,28481,28454,
+28542,28551,28614,28562,28557,28553,28556,28514,28495,28549,28506,28566,28534,
+28524,28546,28501,28530,28498,28496,28503,28564,28563,28509,28416,28513,28523,
+28541,28519,28560,28499,28555,28521,28543,28565,28515,28535,28522,28539,29106,
+29103,29083,29104,29088,29082,29097,29109,29085,29093,29086,29092,29089,29098,
+29084,29095,29107,29336,29338,29528,29522,29534,29535,29536,29533,29531,29537,
+29530,29529,29538,29831,29833,29834,29830,29825,29821,29829,29832,29820,29817,
+29960,29959,30078,30245,30238,30233,30237,30236,30243,30234,30248,30235,30364,
+30365,30366,30363,30605,30607,30601,30600,30925,30907,30927,30924,30929,30926,
+30932,30920,30915,30916,30921,31130,31137,31136,31132,31138,31131,27510,31289,
+31410,31412,31411,31671,31691,31678,31660,31694,31663,31673,31690,31669,31941,
+31944,31948,31947,32247,32219,32234,32231,32215,32225,32259,32250,32230,32246,
+32241,32240,32238,32223,32630,32684,32688,32685,32749,32747,32746,32748,32742,
+32744,32868,32871,33187,33183,33182,33173,33186,33177,33175,33302,33359,33363,
+33362,33360,33358,33361,34084,34107,34063,34048,34089,
+34062,34057,34061,34079,34058,34087,34076,34043,34091,34042,34056,34060,34036,
+34090,34034,34069,34039,34027,34035,34044,34066,34026,34025,34070,34046,34088,
+34077,34094,34050,34045,34078,34038,34097,34086,34023,34024,34032,34031,34041,
+34072,34080,34096,34059,34073,34095,34402,34646,34659,34660,34679,34785,34675,
+34648,34644,34651,34642,34657,34650,34641,34654,34669,34666,34640,34638,34655,
+34653,34671,34668,34682,34670,34652,34661,34639,34683,34677,34658,34663,34665,
+34906,35077,35084,35092,35083,35095,35096,35097,35078,35094,35089,35086,35081,
+35234,35236,35235,35309,35312,35308,35535,35526,35512,35539,35537,35540,35541,
+35515,35543,35518,35520,35525,35544,35523,35514,35517,35545,35902,35917,35983,
+36069,36063,36057,36072,36058,36061,36071,36256,36252,36257,36251,36384,36387,
+36389,36388,36398,36373,36379,36374,36369,36377,36390,36391,36372,36370,36376,
+36371,36380,36375,36378,36652,36644,36632,36634,36640,36643,36630,36631,36979,
+36976,36975,36967,36971,37167,37163,37161,37162,37170,37158,37166,37253,37254,
+37258,37249,37250,37252,37248,37584,37571,37572,37568,37593,37558,37583,37617,
+37599,37592,37609,37591,37597,37580,37615,37570,37608,37578,37576,37582,37606,
+37581,37589,37577,37600,37598,37607,37585,37587,37557,37601,37574,37556,38268,
+38316,38315,38318,38320,38564,38562,38611,38661,38664,38658,38746,38794,38798,
+38792,38864,38863,38942,38941,38950,38953,38952,38944,38939,38951,39090,39176,
+39162,39185,39188,39190,39191,39189,39388,39373,39375,39379,39380,39374,39369,
+39382,39384,39371,39383,39372,39603,39660,39659,39667,
+39666,39665,39750,39747,39783,39796,39793,39782,39798,39797,39792,39784,39780,
+39788,40188,40186,40189,40191,40183,40199,40192,40185,40187,40200,40197,40196,
+40579,40659,40719,40720,20764,20755,20759,20762,20753,20958,21300,21473,22128,
+22112,22126,22131,22118,22115,22125,22130,22110,22135,22300,22299,22728,22717,
+22729,22719,22714,22722,22716,22726,23319,23321,23323,23329,23316,23315,23312,
+23318,23336,23322,23328,23326,23535,23980,23985,23977,23975,23989,23984,23982,
+23978,23976,23986,23981,23983,23988,24167,24168,24166,24175,24297,24295,24294,
+24296,24293,24395,24508,24989,25000,24982,25029,25012,25030,25025,25036,25018,
+25023,25016,24972,25815,25814,25808,25807,25801,25789,25737,25795,25819,25843,
+25817,25907,25983,25980,26018,26312,26302,26304,26314,26315,26319,26301,26299,
+26298,26316,26403,27188,27238,27209,27239,27186,27240,27198,27229,27245,27254,
+27227,27217,27176,27226,27195,27199,27201,27242,27236,27216,27215,27220,27247,
+27241,27232,27196,27230,27222,27221,27213,27214,27206,27477,27476,27478,27559,
+27562,27563,27592,27591,27652,27651,27654,28589,28619,28579,28615,28604,28622,
+28616,28510,28612,28605,28574,28618,28584,28676,28581,28590,28602,28588,28586,
+28623,28607,28600,28578,28617,28587,28621,28591,28594,28592,29125,29122,29119,
+29112,29142,29120,29121,29131,29140,29130,29127,29135,29117,29144,29116,29126,
+29146,29147,29341,29342,29545,29542,29543,29548,29541,29547,29546,29823,29850,
+29856,29844,29842,29845,29857,29963,30080,30255,30253,30257,30269,30259,30268,
+30261,30258,30256,30395,30438,30618,30621,30625,30620,
+30619,30626,30627,30613,30617,30615,30941,30953,30949,30954,30942,30947,30939,
+30945,30946,30957,30943,30944,31140,31300,31304,31303,31414,31416,31413,31409,
+31415,31710,31715,31719,31709,31701,31717,31706,31720,31737,31700,31722,31714,
+31708,31723,31704,31711,31954,31956,31959,31952,31953,32274,32289,32279,32268,
+32287,32288,32275,32270,32284,32277,32282,32290,32267,32271,32278,32269,32276,
+32293,32292,32579,32635,32636,32634,32689,32751,32810,32809,32876,33201,33190,
+33198,33209,33205,33195,33200,33196,33204,33202,33207,33191,33266,33365,33366,
+33367,34134,34117,34155,34125,34131,34145,34136,34112,34118,34148,34113,34146,
+34116,34129,34119,34147,34110,34139,34161,34126,34158,34165,34133,34151,34144,
+34188,34150,34141,34132,34149,34156,34403,34405,34404,34715,34703,34711,34707,
+34706,34696,34689,34710,34712,34681,34695,34723,34693,34704,34705,34717,34692,
+34708,34716,34714,34697,35102,35110,35120,35117,35118,35111,35121,35106,35113,
+35107,35119,35116,35103,35313,35552,35554,35570,35572,35573,35549,35604,35556,
+35551,35568,35528,35550,35553,35560,35583,35567,35579,35985,35986,35984,36085,
+36078,36081,36080,36083,36204,36206,36261,36263,36403,36414,36408,36416,36421,
+36406,36412,36413,36417,36400,36415,36541,36662,36654,36661,36658,36665,36663,
+36660,36982,36985,36987,36998,37114,37171,37173,37174,37267,37264,37265,37261,
+37263,37671,37662,37640,37663,37638,37647,37754,37688,37692,37659,37667,37650,
+37633,37702,37677,37646,37645,37579,37661,37626,37669,37651,37625,37623,37684,
+37634,37668,37631,37673,37689,37685,37674,37652,37644,
+37643,37630,37641,37632,37627,37654,38332,38349,38334,38329,38330,38326,38335,
+38325,38333,38569,38612,38667,38674,38672,38809,38807,38804,38896,38904,38965,
+38959,38962,39204,39199,39207,39209,39326,39406,39404,39397,39396,39408,39395,
+39402,39401,39399,39609,39615,39604,39611,39670,39674,39673,39671,39731,39808,
+39813,39815,39804,39806,39803,39810,39827,39826,39824,39802,39829,39805,39816,
+40229,40215,40224,40222,40212,40233,40221,40216,40226,40208,40217,40223,40584,
+40582,40583,40622,40621,40661,40662,40698,40722,40765,20774,20773,20770,20772,
+20768,20777,21236,22163,22156,22157,22150,22148,22147,22142,22146,22143,22145,
+22742,22740,22735,22738,23341,23333,23346,23331,23340,23335,23334,23343,23342,
+23419,23537,23538,23991,24172,24170,24510,24507,25027,25013,25020,25063,25056,
+25061,25060,25064,25054,25839,25833,25827,25835,25828,25832,25985,25984,26038,
+26074,26322,27277,27286,27265,27301,27273,27295,27291,27297,27294,27271,27283,
+27278,27285,27267,27304,27300,27281,27263,27302,27290,27269,27276,27282,27483,
+27565,27657,28620,28585,28660,28628,28643,28636,28653,28647,28646,28638,28658,
+28637,28642,28648,29153,29169,29160,29170,29156,29168,29154,29555,29550,29551,
+29847,29874,29867,29840,29866,29869,29873,29861,29871,29968,29969,29970,29967,
+30084,30275,30280,30281,30279,30372,30441,30645,30635,30642,30647,30646,30644,
+30641,30632,30704,30963,30973,30978,30971,30972,30962,30981,30969,30974,30980,
+31147,31144,31324,31323,31318,31320,31316,31322,31422,31424,31425,31749,31759,
+31730,31744,31743,31739,31758,31732,31755,31731,31746,
+31753,31747,31745,31736,31741,31750,31728,31729,31760,31754,31976,32301,32316,
+32322,32307,38984,32312,32298,32329,32320,32327,32297,32332,32304,32315,32310,
+32324,32314,32581,32639,32638,32637,32756,32754,32812,33211,33220,33228,33226,
+33221,33223,33212,33257,33371,33370,33372,34179,34176,34191,34215,34197,34208,
+34187,34211,34171,34212,34202,34206,34167,34172,34185,34209,34170,34168,34135,
+34190,34198,34182,34189,34201,34205,34177,34210,34178,34184,34181,34169,34166,
+34200,34192,34207,34408,34750,34730,34733,34757,34736,34732,34745,34741,34748,
+34734,34761,34755,34754,34764,34743,34735,34756,34762,34740,34742,34751,34744,
+34749,34782,34738,35125,35123,35132,35134,35137,35154,35127,35138,35245,35247,
+35246,35314,35315,35614,35608,35606,35601,35589,35595,35618,35599,35602,35605,
+35591,35597,35592,35590,35612,35603,35610,35919,35952,35954,35953,35951,35989,
+35988,36089,36207,36430,36429,36435,36432,36428,36423,36675,36672,36997,36990,
+37176,37274,37282,37275,37273,37279,37281,37277,37280,37793,37763,37807,37732,
+37718,37703,37756,37720,37724,37750,37705,37712,37713,37728,37741,37775,37708,
+37738,37753,37719,37717,37714,37711,37745,37751,37755,37729,37726,37731,37735,
+37760,37710,37721,38343,38336,38345,38339,38341,38327,38574,38576,38572,38688,
+38687,38680,38685,38681,38810,38817,38812,38814,38813,38869,38868,38897,38977,
+38980,38986,38985,38981,38979,39205,39211,39212,39210,39219,39218,39215,39213,
+39217,39216,39320,39331,39329,39426,39418,39412,39415,39417,39416,39414,39419,
+39421,39422,39420,39427,39614,39678,39677,39681,39676,
+39752,39834,39848,39838,39835,39846,39841,39845,39844,39814,39842,39840,39855,
+40243,40257,40295,40246,40238,40239,40241,40248,40240,40261,40258,40259,40254,
+40247,40256,40253,32757,40237,40586,40585,40589,40624,40648,40666,40699,40703,
+40740,40739,40738,40788,40864,20785,20781,20782,22168,22172,22167,22170,22173,
+22169,22896,23356,23657,23658,24000,24173,24174,25048,25055,25069,25070,25073,
+25066,25072,25067,25046,25065,25855,25860,25853,25848,25857,25859,25852,26004,
+26075,26330,26331,26328,27333,27321,27325,27361,27334,27322,27318,27319,27335,
+27316,27309,27486,27593,27659,28679,28684,28685,28673,28677,28692,28686,28671,
+28672,28667,28710,28668,28663,28682,29185,29183,29177,29187,29181,29558,29880,
+29888,29877,29889,29886,29878,29883,29890,29972,29971,30300,30308,30297,30288,
+30291,30295,30298,30374,30397,30444,30658,30650,30975,30988,30995,30996,30985,
+30992,30994,30993,31149,31148,31327,31772,31785,31769,31776,31775,31789,31773,
+31782,31784,31778,31781,31792,32348,32336,32342,32355,32344,32354,32351,32337,
+32352,32343,32339,32693,32691,32759,32760,32885,33233,33234,33232,33375,33374,
+34228,34246,34240,34243,34242,34227,34229,34237,34247,34244,34239,34251,34254,
+34248,34245,34225,34230,34258,34340,34232,34231,34238,34409,34791,34790,34786,
+34779,34795,34794,34789,34783,34803,34788,34772,34780,34771,34797,34776,34787,
+34724,34775,34777,34817,34804,34792,34781,35155,35147,35151,35148,35142,35152,
+35153,35145,35626,35623,35619,35635,35632,35637,35655,35631,35644,35646,35633,
+35621,35639,35622,35638,35630,35620,35643,35645,35642,
+35906,35957,35993,35992,35991,36094,36100,36098,36096,36444,36450,36448,36439,
+36438,36446,36453,36455,36443,36442,36449,36445,36457,36436,36678,36679,36680,
+36683,37160,37178,37179,37182,37288,37285,37287,37295,37290,37813,37772,37778,
+37815,37787,37789,37769,37799,37774,37802,37790,37798,37781,37768,37785,37791,
+37773,37809,37777,37810,37796,37800,37812,37795,37797,38354,38355,38353,38579,
+38615,38618,24002,38623,38616,38621,38691,38690,38693,38828,38830,38824,38827,
+38820,38826,38818,38821,38871,38873,38870,38872,38906,38992,38993,38994,39096,
+39233,39228,39226,39439,39435,39433,39437,39428,39441,39434,39429,39431,39430,
+39616,39644,39688,39684,39685,39721,39733,39754,39756,39755,39879,39878,39875,
+39871,39873,39861,39864,39891,39862,39876,39865,39869,40284,40275,40271,40266,
+40283,40267,40281,40278,40268,40279,40274,40276,40287,40280,40282,40590,40588,
+40671,40705,40704,40726,40741,40747,40746,40745,40744,40780,40789,20788,20789,
+21142,21239,21428,22187,22189,22182,22183,22186,22188,22746,22749,22747,22802,
+23357,23358,23359,24003,24176,24511,25083,25863,25872,25869,25865,25868,25870,
+25988,26078,26077,26334,27367,27360,27340,27345,27353,27339,27359,27356,27344,
+27371,27343,27341,27358,27488,27568,27660,28697,28711,28704,28694,28715,28705,
+28706,28707,28713,28695,28708,28700,28714,29196,29194,29191,29186,29189,29349,
+29350,29348,29347,29345,29899,29893,29879,29891,29974,30304,30665,30666,30660,
+30705,31005,31003,31009,31004,30999,31006,31152,31335,31336,31795,31804,31801,
+31788,31803,31980,31978,32374,32373,32376,32368,32375,
+32367,32378,32370,32372,32360,32587,32586,32643,32646,32695,32765,32766,32888,
+33239,33237,33380,33377,33379,34283,34289,34285,34265,34273,34280,34266,34263,
+34284,34290,34296,34264,34271,34275,34268,34257,34288,34278,34287,34270,34274,
+34816,34810,34819,34806,34807,34825,34828,34827,34822,34812,34824,34815,34826,
+34818,35170,35162,35163,35159,35169,35164,35160,35165,35161,35208,35255,35254,
+35318,35664,35656,35658,35648,35667,35670,35668,35659,35669,35665,35650,35666,
+35671,35907,35959,35958,35994,36102,36103,36105,36268,36266,36269,36267,36461,
+36472,36467,36458,36463,36475,36546,36690,36689,36687,36688,36691,36788,37184,
+37183,37296,37293,37854,37831,37839,37826,37850,37840,37881,37868,37836,37849,
+37801,37862,37834,37844,37870,37859,37845,37828,37838,37824,37842,37863,38269,
+38362,38363,38625,38697,38699,38700,38696,38694,38835,38839,38838,38877,38878,
+38879,39004,39001,39005,38999,39103,39101,39099,39102,39240,39239,39235,39334,
+39335,39450,39445,39461,39453,39460,39451,39458,39456,39463,39459,39454,39452,
+39444,39618,39691,39690,39694,39692,39735,39914,39915,39904,39902,39908,39910,
+39906,39920,39892,39895,39916,39900,39897,39909,39893,39905,39898,40311,40321,
+40330,40324,40328,40305,40320,40312,40326,40331,40332,40317,40299,40308,40309,
+40304,40297,40325,40307,40315,40322,40303,40313,40319,40327,40296,40596,40593,
+40640,40700,40749,40768,40769,40781,40790,40791,40792,21303,22194,22197,22195,
+22755,23365,24006,24007,24302,24303,24512,24513,25081,25879,25878,25877,25875,
+26079,26344,26339,26340,27379,27376,27370,27368,27385,
+27377,27374,27375,28732,28725,28719,28727,28724,28721,28738,28728,28735,28730,
+28729,28736,28731,28723,28737,29203,29204,29352,29565,29564,29882,30379,30378,
+30398,30445,30668,30670,30671,30669,30706,31013,31011,31015,31016,31012,31017,
+31154,31342,31340,31341,31479,31817,31816,31818,31815,31813,31982,32379,32382,
+32385,32384,32698,32767,32889,33243,33241,33291,33384,33385,34338,34303,34305,
+34302,34331,34304,34294,34308,34313,34309,34316,34301,34841,34832,34833,34839,
+34835,34838,35171,35174,35257,35319,35680,35690,35677,35688,35683,35685,35687,
+35693,36270,36486,36488,36484,36697,36694,36695,36693,36696,36698,37005,37187,
+37185,37303,37301,37298,37299,37899,37907,37883,37920,37903,37908,37886,37909,
+37904,37928,37913,37901,37877,37888,37879,37895,37902,37910,37906,37882,37897,
+37880,37898,37887,37884,37900,37878,37905,37894,38366,38368,38367,38702,38703,
+38841,38843,38909,38910,39008,39010,39011,39007,39105,39106,39248,39246,39257,
+39244,39243,39251,39474,39476,39473,39468,39466,39478,39465,39470,39480,39469,
+39623,39626,39622,39696,39698,39697,39947,39944,39927,39941,39954,39928,40000,
+39943,39950,39942,39959,39956,39945,40351,40345,40356,40349,40338,40344,40336,
+40347,40352,40340,40348,40362,40343,40353,40346,40354,40360,40350,40355,40383,
+40361,40342,40358,40359,40601,40603,40602,40677,40676,40679,40678,40752,40750,
+40795,40800,40798,40797,40793,40849,20794,20793,21144,21143,22211,22205,22206,
+23368,23367,24011,24015,24305,25085,25883,27394,27388,27395,27384,27392,28739,
+28740,28746,28744,28745,28741,28742,29213,29210,29209,
+29566,29975,30314,30672,31021,31025,31023,31828,31827,31986,32394,32391,32392,
+32395,32390,32397,32589,32699,32816,33245,34328,34346,34342,34335,34339,34332,
+34329,34343,34350,34337,34336,34345,34334,34341,34857,34845,34843,34848,34852,
+34844,34859,34890,35181,35177,35182,35179,35322,35705,35704,35653,35706,35707,
+36112,36116,36271,36494,36492,36702,36699,36701,37190,37188,37189,37305,37951,
+37947,37942,37929,37949,37948,37936,37945,37930,37943,37932,37952,37937,38373,
+38372,38371,38709,38714,38847,38881,39012,39113,39110,39104,39256,39254,39481,
+39485,39494,39492,39490,39489,39482,39487,39629,39701,39703,39704,39702,39738,
+39762,39979,39965,39964,39980,39971,39976,39977,39972,39969,40375,40374,40380,
+40385,40391,40394,40399,40382,40389,40387,40379,40373,40398,40377,40378,40364,
+40392,40369,40365,40396,40371,40397,40370,40570,40604,40683,40686,40685,40731,
+40728,40730,40753,40782,40805,40804,40850,20153,22214,22213,22219,22897,23371,
+23372,24021,24017,24306,25889,25888,25894,25890,27403,27400,27401,27661,28757,
+28758,28759,28754,29214,29215,29353,29567,29912,29909,29913,29911,30317,30381,
+31029,31156,31344,31345,31831,31836,31833,31835,31834,31988,31985,32401,32591,
+32647,33246,33387,34356,34357,34355,34348,34354,34358,34860,34856,34854,34858,
+34853,35185,35263,35262,35323,35710,35716,35714,35718,35717,35711,36117,36501,
+36500,36506,36498,36496,36502,36503,36704,36706,37191,37964,37968,37962,37963,
+37967,37959,37957,37960,37961,37958,38719,38883,39018,39017,39115,39252,39259,
+39502,39507,39508,39500,39503,39496,39498,39497,39506,
+39504,39632,39705,39723,39739,39766,39765,40006,40008,39999,40004,39993,39987,
+40001,39996,39991,39988,39986,39997,39990,40411,40402,40414,40410,40395,40400,
+40412,40401,40415,40425,40409,40408,40406,40437,40405,40413,40630,40688,40757,
+40755,40754,40770,40811,40853,40866,20797,21145,22760,22759,22898,23373,24024,
+34863,24399,25089,25091,25092,25897,25893,26006,26347,27409,27410,27407,27594,
+28763,28762,29218,29570,29569,29571,30320,30676,31847,31846,32405,33388,34362,
+34368,34361,34364,34353,34363,34366,34864,34866,34862,34867,35190,35188,35187,
+35326,35724,35726,35723,35720,35909,36121,36504,36708,36707,37308,37986,37973,
+37981,37975,37982,38852,38853,38912,39510,39513,39710,39711,39712,40018,40024,
+40016,40010,40013,40011,40021,40025,40012,40014,40443,40439,40431,40419,40427,
+40440,40420,40438,40417,40430,40422,40434,40432,40418,40428,40436,40435,40424,
+40429,40642,40656,40690,40691,40710,40732,40760,40759,40758,40771,40783,40817,
+40816,40814,40815,22227,22221,23374,23661,25901,26349,26350,27411,28767,28769,
+28765,28768,29219,29915,29925,30677,31032,31159,31158,31850,32407,32649,33389,
+34371,34872,34871,34869,34891,35732,35733,36510,36511,36512,36509,37310,37309,
+37314,37995,37992,37993,38629,38726,38723,38727,38855,38885,39518,39637,39769,
+40035,40039,40038,40034,40030,40032,40450,40446,40455,40451,40454,40453,40448,
+40449,40457,40447,40445,40452,40608,40734,40774,40820,40821,40822,22228,25902,
+26040,27416,27417,27415,27418,28770,29222,29354,30680,30681,31033,31849,31851,
+31990,32410,32408,32411,32409,33248,33249,34374,34375,
+34376,35193,35194,35196,35195,35327,35736,35737,36517,36516,36515,37998,37997,
+37999,38001,38003,38729,39026,39263,40040,40046,40045,40459,40461,40464,40463,
+40466,40465,40609,40693,40713,40775,40824,40827,40826,40825,22302,28774,31855,
+34876,36274,36518,37315,38004,38008,38006,38005,39520,40052,40051,40049,40053,
+40468,40467,40694,40714,40868,28776,28773,31991,34410,34878,34877,34879,35742,
+35996,36521,36553,38731,39027,39028,39116,39265,39339,39524,39526,39527,39716,
+40469,40471,40776,25095,27422,29223,34380,36520,38018,38016,38017,39529,39528,
+39726,40473,29225,34379,35743,38019,40057,40631,30325,39531,40058,40477,28777,
+28778,40612,40830,40777,40856,30849,37561,35023,22715,24658,31911,23290,9556,
+9574,9559,9568,9580,9571,9562,9577,9565,9554,9572,9557,9566,9578,9569,9560,
+9575,9563,9555,9573,9558,9567,9579,9570,9561,9576,9564,9553,9552,9581,9582,
+9584,9583,9619,
diff --git a/sources/android/support/src/musl-locale/codepages.h b/sources/android/support/src/musl-locale/codepages.h
index 35acd5a..ab146e8 100644
--- a/sources/android/support/src/musl-locale/codepages.h
+++ b/sources/android/support/src/musl-locale/codepages.h
@@ -4,145 +4,148 @@
 
 "iso88592\0"
 "\0\40"
-"\0\124\0\211\22\0\40\1\6\0\0\230\101\206\32\177\0\60\110\40\0\130\40\311\22"
-"\0\44\21\306\43\0\234\121\306\32\200\120\102\210\40\132\0\0\300\4\0\20\161\1\0"
-"\35\0\160\2\0\51\0\0\300\7\41\60\1\5\0\0\130\1\0\0\136\320\1\200\35"
-"\0\0\200\6\0\133\0\0\0\5\0\24\201\1\0\36\0\200\2\0\52\0\0\0\10\42\64\21\5\0"
-"\0\134\1\0\0\137\324\1\300\35\0\0\220\106\44"
+"\0\330\20\313\32\0\244\21\10\0\0\34\122\310\42\240\0\100\212\50\0\334\60\13\33"
+"\0\250\41\10\54\0\40\142\10\43\241\324\122\312\50\173\0\0\0\15\0\224\201\3\0"
+"\76\0\200\4\0\112\0\0\0\20\102\264\21\7\0\0\334\1\0\0\177\124\2\300\45"
+"\0\0\220\10\0\174\0\0\100\15\0\230\221\3\0\77\0\220\4\0\113\0\0\100\20"
+"\103\270\41\7\0\0\340\1\0\0\200\130\2\0\46\0\0\240\210\54"
 
 "iso88593\0"
 "\0\40"
-"\0\324\0\11\0\0\4\60\3\0\0\364\100\106\13\77\0\20\100\40\0\330\0\0\0"
-"\0\0\100\3\0\0\370\120\206\13\100\0\20\200\40\0\0\0\100\0\0\154\220\1\0"
-"\0\0\0\0\0\0\0\0\0\0\1\0\0\0\0\0\274\0\0\0\53\0\0\0\0\0\310\41\6\0\0\0\0\100\0"
-"\0\160\240\1\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\0\0\300\0\0\0\54\0\0\0\0"
-"\0\314\61\106\44"
+"\0\130\21\13\0\0\4\100\5\0\0\170\121\210\23\140\0\20\200\50\0\134\1\0\0"
+"\0\0\120\5\0\0\174\141\310\23\141\0\20\300\50\0\0\0\100\0\0\360\240\3\0"
+"\0\0\0\0\0\0\0\0\0\0\1\0\0\0\0\0\100\1\0\0\114\0\0\0\0\0\114\62\10\0"
+"\0\0\0\100\0\0\364\260\3\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\0\0\104\1\0\0"
+"\115\0\0\0\0\0\120\102\210\54"
 
 "iso88594\0"
 "\0\40"
-"\0\124\60\4\27\0\334\140\4\0\0\230\61\102\14\154\0\60\10\0\0\130\40\111\27"
-"\0\340\160\304\43\0\234\101\202\14\155\110\101\310\24\21\0\0\0\0\0\0\0\300\16"
-"\35\0\160\2\0\45\0\0\100\16\41\70\101\105\20\0\0\0\0\0\0\340\1\0\0\0\270\1\7\0"
-"\22\0\0\0\0\0\0\0\0\17\36\0\200\2\0\46\0\0\200\16\42\74\121\205\20\0\0\0\0\0"
-"\0\344\1\0\0\0\274\21\107\44"
+"\0\330\100\106\37\0\140\161\6\0\0\34\102\204\24\215\0\100\12\0\0\334\60\213\37"
+"\0\144\201\6\54\0\40\122\304\24\216\314\121\12\35\62\0\0\0\0\0\0\0\0\27"
+"\76\0\200\4\0\106\0\0\200\26\102\274\121\207\30\0\0\0\0\0\0\144\2\0\0"
+"\0\74\22\11\0\63\0\0\0\0\0\0\0\100\27\77\0\220\4\0\107\0\0\300\26"
+"\103\300\141\307\30\0\0\0\0\0\0\150\2\0\0\0\100\42\211\54"
 
 "iso88595\0"
 "\0\40"
-"\0\210\63\16\71\345\230\163\16\72\351\250\263\16\73\355\0\340\316\73"
-"\360\304\43\317\74\364\324\143\317\75\370\344\243\317\76\374\364\343\317\77"
-"\0\5\44\320\100\4\25\144\320\101\10\45\244\320\102\14\65\344\320\103"
-"\20\105\44\321\104\24\125\144\321\105\30\145\244\321\106\34\165\344\321\107"
-"\40\205\44\322\110\44\225\144\322\111\50\245\244\322\112\54\265\344\322\113"
-"\65\302\24\223\114\63\321\124\223\115\67\341\224\223\116\73\15\300\123\117"
+"\0\14\104\120\101\6\35\204\120\102\12\55\304\120\103\16\1\360\20\104"
+"\21\111\64\21\105\25\131\164\21\106\31\151\264\21\107\35\171\364\21\110"
+"\41\211\64\22\111\45\231\164\22\112\51\251\264\22\113\55\271\364\22\114"
+"\61\311\64\23\115\65\331\164\23\116\71\351\264\23\117\75\371\364\23\120"
+"\101\11\65\24\121\105\31\165\24\122\111\51\265\24\123\115\71\365\24\124"
+"\127\106\45\325\124\124\125\145\325\125\130\145\245\325\126\134\15\320\225\127"
 
 "iso88596\0"
 "\0\40"
-"\0\4\20\100\0\0\4\20\100\0\1\4\20\100\0\163\1\20\100\0\1\4\20\100\0"
-"\1\4\20\100\0\1\4\20\0\135\1\4\20\100\135\1\330\165\27\136\171\351\265\27\137"
-"\175\371\365\27\140\201\11\66\30\141\205\31\166\30\142\211\51\266\30\143"
-"\215\71\366\130\0\1\4\20\100\0\220\105\46\331\144\224\125\146\331\145"
-"\230\145\246\331\146\234\165\346\331\147\240\205\46\132\0\1\4\20\100\0"
-"\1\4\20\100\0\1\4\20\100\0"
+"\0\4\20\100\0\0\4\20\100\0\1\4\20\100\0\224\1\20\100\0\1\4\20\100\0"
+"\1\4\20\100\0\1\4\20\100\145\1\4\20\200\145\1\134\206\131\146"
+"\232\155\306\131\147\236\175\6\132\150\242\215\106\132\151\246\235\206\132\152"
+"\252\255\306\132\153\256\275\6\133\0\1\4\20\100\0\261\311\66\33\155"
+"\265\331\166\33\156\271\351\266\33\157\275\371\366\33\160\301\11\67\134\0"
+"\1\4\20\100\0\1\4\20\100\0\1\4\20\100\0"
 
 "iso88597\0"
 "\0\40"
-"\0\220\130\42\0\63\322\10\0\0\0\0\240\11\0\0\0\20\200\210\0\0\0\0\0"
-"\233\160\322\11\0\236\174\2\12\0\241\0\40\312\50\244\224\142\312\51"
-"\250\244\242\312\52\254\264\342\312\53\260\304\42\313\54\264\324\22\200\55"
-"\267\340\222\213\56\273\360\322\213\57\277\0\23\214\60\303\20\123\214\61"
-"\307\40\223\214\62\313\60\323\214\63\317\100\23\215\64\323\120\123\215\65"
-"\327\140\223\215\66\333\160\323\215\67\337\200\23\116\0"
+"\0\24\151\44\0\124\126\11\0\0\0\0\260\13\0\0\0\20\300\220\0\0\0\0\0"
+"\274\364\342\13\0\277\0\23\14\0\302\0\60\14\61\305\30\163\14\62"
+"\311\50\263\14\63\315\70\363\14\64\321\110\63\15\65\325\130\23\300\65"
+"\330\144\243\315\66\334\164\343\315\67\340\204\43\316\70\344\224\143\316\71"
+"\350\244\243\316\72\354\264\343\316\73\360\304\43\317\74\364\324\143\317\75"
+"\370\344\243\317\76\374\364\343\317\77\0\5\44\120\0"
 
 "iso88598\0"
 "\0\40"
 "\0\4\0\0\0\0\0\0\0\0\0\0\300\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\360\0\0"
 "\0\0\0\100\0\1\4\20\100\0\1\4\20\100\0\1\4\20\100\0\1\4\20\100\0\1\4\20\100\0"
-"\1\4\20\100\0\1\4\20\100\0\1\4\20\300\210\123\121\125\225\125"
-"\127\141\225\225\126\133\161\325\225\127\137\201\25\226\130"
-"\143\221\125\226\131\147\241\225\226\132\153\261\325\126\0\1\170\370\141\0"
+"\1\4\20\100\0\1\4\20\100\0\1\4\20\0\221\164\325\145\327\135"
+"\170\345\245\327\136\174\365\345\327\137\200\5\46\330\140\204\25\146\330\141"
+"\210\45\246\330\142\214\65\346\130\0\1\374\10\144\0"
 
 "iso88599\0"
 "\0\120"
-"\55\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\364\100\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-"\0\0\0\0\0\56\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\370\120\6\0"
+"\116\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\170\121\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+"\0\0\0\0\0\117\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\174\141\10\0"
 
 "iso885910\0"
 "\0\40"
-"\0\124\60\102\14\71\334\20\4\0\106\204\140\6\33\203\0\0\207\24"
-"\0\130\100\202\14\72\340\40\4\0\107\210\160\106\33\204\210\30\307\24"
-"\21\0\0\0\0\0\0\0\300\16\35\0\160\2\0\45\0\0\0\0\0\70\101\5\0\0\0\0\200\33"
-"\0\340\1\0\0\0\0\0\0\0\22\0\0\0\0\0\0\0\0\17\36\0\200\2\0\46\0\0\0\0"
-"\0\74\121\5\0\0\0\0\300\33\0\344\1\0\0\0\0\0\300\20"
+"\0\330\100\204\24\132\140\41\6\0\147\10\161\110\43\244\0\20\311\34"
+"\0\334\120\304\24\133\144\61\6\0\150\14\201\210\43\245\14\51\11\35\62\0\0\0\0"
+"\0\0\0\0\27\76\0\200\4\0\106\0\0\0\0\0\274\121\7\0\0\0\0\300\43\0\144\2\0\0"
+"\0\0\0\0\0\63\0\0\0\0\0\0\0\100\27\77\0\220\4\0\107\0\0\0\0\0\300\141\7\0"
+"\0\0\0\0\44\0\150\2\0\0\0\0\0\0\31"
 
 "iso885911\0"
 "tis620\0"
 "\0\40"
-"\0\274\6\133\154\262\315\106\133\155\266\335\206\133\156\272\355\306\133\157"
-"\276\375\6\134\160\302\15\107\134\161\306\35\207\134\162\312\55\307\134\163"
-"\316\75\7\135\164\322\115\107\135\165\326\135\207\135\166\332\155\307\135\167"
-"\336\175\7\136\170\342\215\107\136\171\346\235\207\136\0\1\4\20\100\172"
-"\352\255\307\136\173\356\275\7\137\174\362\315\107\137\175\366\335\207\137\176"
-"\372\355\307\137\177\376\375\7\140\200\2\16\110\140\201\1\4\20\100\0"
+"\0\100\27\235\164\323\121\127\235\165\327\141\227\235\166\333\161\327\235\167"
+"\337\201\27\236\170\343\221\127\236\171\347\241\227\236\172"
+"\353\261\327\236\173\357\301\27\237\174\363\321\127\237\175"
+"\367\341\227\237\176\373\361\327\237\177\377\1\30\240\200\3\22\130\240\201"
+"\7\42\230\140\0\1\4\20\200\202\13\62\330\240\203\17\102\30\241\204"
+"\23\122\130\241\205\27\142\230\241\206\33\162\330\241\207\37\202\30\242\210"
+"\43\222\130\242\211\1\4\20\100\0"
 
 "iso885913\0"
 "\0\40"
-"\0\240\10\0\0\0\244\10\0\0\15\0\300\5\0\0\0\0\300\2\0\0\0\0\0\47\2\0\0\0"
-"\20\0\320\5\0\0\0\0\200\3\25\354\20\301\5\0\0\160\302\10\35\0\360\107\11"
-"\61\4\221\203\21\146\60\341\4\0\124\0\0\0\0\170\50\1\6\34\0\4\62\10\0"
-"\26\360\40\1\6\0\0\200\2\11\36\0\0\210\11\62\10\241\303\21\147\64\361\4\0"
-"\125\0\0\0\0\171\54\21\106\34\0\10\102\110\211"
+"\0\44\11\0\0\0\50\11\0\0\15\0\320\7\0\0\0\0\300\2\0\0\0\0\0\110\2\0\0\0"
+"\20\0\340\7\0\0\0\0\200\3\66\160\41\3\16\0\0\200\4\21\76\0\0\212\21"
+"\122\210\241\305\31\207\264\361\6\0\165\0\0\0\0\231\254\21\110\44"
+"\0\210\102\12\0\67\164\61\103\16\0\0\220\104\21\77\0\20\312\21"
+"\123\214\261\5\32\210\270\1\7\0\166\0\0\0\0\232\260\41\210\44"
+"\0\214\122\212\221"
 
 "iso885914\0"
 "\0\40"
-"\0\30\170\40\0\33\160\200\40\0\24\2\140\141\202\32\2\0\200\37\12\56\370\2\14"
-"\14\66\10\200\203\25\76\170\41\204\33\142\230\141\204\0\0\0\0\0\0\0\0\0\0"
-"\0\0\0\0\0\0\0\0\0\0\172\0\0\0\0\0\0\0\200\204\0\0\0\0\0\0\0\300\7\0\0\0\0\0\0"
-"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\173\0\0\0\0\0\0\0\300\204\0\0\0\0\0\0\0\320\7\0"
+"\0\234\210\42\0\74\364\220\42\0\65\2\160\243\212\73\2\0\300\47"
+"\53\262\10\105\24\55\272\10\300\213\66\302\210\143\214\74\346\250\243\214"
+"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\233\0\0\0\0\0\0\0\300\214\0\0\0\0\0"
+"\0\0\320\11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\234\0\0\0\0\0\0\0\0\215"
+"\0\0\0\0\0\0\0\340\11\0"
 
 "iso885915\0"
 "latin9\0"
 "\0\44"
-"\63\2\140\6\0\147\0\0\0\0\0\0\0\0\0\0\0\0\0\0\203\0\0\0\0\204\0\0\0\0"
-"\130\144\341\7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+"\124\2\160\10\0\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\244\0\0\0\0\245\0\0\0\0"
+"\171\350\361\11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
 
 "iso885916\0"
 "\0\40"
-"\0\124\140\201\22\63\246\150\6\0\147\0\240\10\0\177\0\0\110\40\0\0\320\301\22"
-"\203\240\10\0\0\204\170\260\10\0\130\144\341\207\40\0\0\0\300\4\0\134\0\0\0"
-"\0\0\0\0\0\0\0\0\0\0\41\60\1\0\0\0\130\1\0\30\166\0\0\0\0\0\234\300\10\0"
-"\0\0\0\0\5\0\140\0\0\0\0\0\0\0\0\0\0\0\0\0\42\64\1\0\0\0\134\1\100\30"
-"\167\0\0\0\0\0\240\320\10\0"
+"\0\330\160\303\32\124\52\171\10\0\210\0\260\12\0\240\0\20\212\50\0\0\340\3\33"
+"\244\44\11\0\0\245\374\300\12\0\171\350\361\311\50\0\0\0\0\15\0\340\0\0\0"
+"\0\0\0\0\0\0\0\0\0\0\102\264\1\0\0\0\334\1\100\40\227\0\0\0\0\0\40\321\12\0"
+"\0\0\0\100\15\0\344\0\0\0\0\0\0\0\0\0\0\0\0\0\103\270\1\0\0\0\340\1\200\40"
+"\230\0\0\0\0\0\44\341\12\0"
 
 "cp1250\0"
 "windows1250\0"
 "\0\0"
-"\63\6\140\142\0\51\266\250\342\212\1\270\150\306\213\140\250\61\310\37"
-"\1\220\130\342\211\50\262\10\142\210\1\330\170\6\214\141\254\101\10\40"
-"\0\74\2\211\22\0\124\0\0\0\0\0\100\6\0\0\0\0\100\40\0\0\40\311\22\0\0\0\0\0"
-"\0\130\120\6\0\110\120\222\204\40\132\0\0\300\4\0\20\161\1\0\35\0\160\2\0"
-"\51\0\0\300\7\41\60\1\5\0\0\130\1\0\0\136\320\1\200\35\0\0\200\6\0\133\0\0\0\5"
-"\0\24\201\1\0\36\0\200\2\0\52\0\0\0\10\42\64\21\5\0\0\134\1\0\0"
-"\137\324\1\300\35\0\0\220\106\44"
+"\124\6\160\144\0\112\72\271\44\223\1\74\171\10\224\201\54\102\12\50"
+"\1\24\151\44\222\111\66\31\244\220\1\140\211\110\224\202\60\122\112\50"
+"\0\300\22\313\32\0\330\0\0\0\0\0\120\10\0\0\0\0\200\50\0\0\60\13\33\0\0\0\0\0"
+"\0\334\140\10\0\151\324\242\306\50\173\0\0\0\15\0\224\201\3\0\76\0\200\4\0"
+"\112\0\0\0\20\102\264\21\7\0\0\334\1\0\0\177\124\2\300\45\0\0\220\10\0"
+"\174\0\0\100\15\0\230\221\3\0\77\0\220\4\0\113\0\0\100\20\103\270\41\7\0"
+"\0\340\1\0\0\200\130\2\0\46\0\0\240\210\54"
 
 "cp1251\0"
 "windows1251\0"
 "\0\0"
-"\343\220\143\242\114\51\266\250\342\212\63\272\250\316\213\353\264\303\316\73"
-"\61\221\130\342\211\50\262\10\142\210\1\330\210\23\214\71\355\244\123\117"
-"\0\270\303\123\72\0\370\4\0\0\342\0\120\16\0\0\0\0\0\72\0\0\160\116\115"
-"\77\1\0\0\0\60\325\70\23\0\67\231\103\223\115\360\304\43\317\74"
-"\364\324\143\317\75\370\344\243\317\76\374\364\343\317\77\0\5\44\320\100"
-"\4\25\144\320\101\10\45\244\320\102\14\65\344\320\103\20\105\44\321\104"
-"\24\125\144\321\105\30\145\244\321\106\34\165\344\321\107\40\205\44\322\110"
-"\44\225\144\322\111\50\245\244\322\112\54\265\344\322\113"
+"\4\25\164\344\124\112\72\271\44\223\124\76\271\20\224\14\71\324\20\104"
+"\122\25\151\44\222\111\66\31\244\220\1\140\231\125\224\132\161\265\225\127"
+"\0\74\324\225\102\0\174\5\0\0\3\1\140\20\0\0\0\0\100\102\0\0\200\220\125"
+"\140\1\0\0\0\121\135\111\25\0\130\35\124\325\125\21\111\64\21\105"
+"\25\131\164\21\106\31\151\264\21\107\35\171\364\21\110\41\211\64\22\111"
+"\45\231\164\22\112\51\251\264\22\113\55\271\364\22\114\61\311\64\23\115"
+"\65\331\164\23\116\71\351\264\23\117\75\371\364\23\120\101\11\65\24\121"
+"\105\31\165\24\122\111\51\265\24\123\115\71\365\24\124"
 
 "cp1252\0"
 "windows1252\0"
 "\0\0"
-"\63\6\140\142\41\51\266\250\342\212\216\270\150\306\213\130\4\60\110\0"
-"\1\220\130\342\211\50\262\10\142\210\223\330\170\6\214\131\4\100\210\37"
+"\124\6\160\244\51\112\72\271\44\223\257\74\171\10\224\171\4\100\112\0"
+"\1\24\151\44\222\111\66\31\244\220\264\140\211\110\224\172\4\120\312\47"
 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
@@ -151,88 +154,112 @@
 "cp1253\0"
 "windows1253\0"
 "\0\0"
-"\63\6\140\142\41\51\266\250\342\212\1\270\30\300\213\1\4\20\100\0"
-"\1\220\130\342\211\50\262\10\142\210\1\330\30\0\214\1\4\20\100\0"
-"\0\160\322\11\0\0\0\0\0\0\0\0\20\0\0\0\0\0\200\210\0\0\0\0\0\233\0\0\0\0"
-"\236\174\2\12\0\241\0\40\312\50\244\224\142\312\51\250\244\242\312\52"
-"\254\264\342\312\53\260\304\42\313\54\264\324\22\200\55\267\340\222\213\56"
-"\273\360\322\213\57\277\0\23\214\60\303\20\123\214\61\307\40\223\214\62"
-"\313\60\323\214\63\317\100\23\215\64\323\120\123\215\65\327\140\223\215\66"
-"\333\160\323\215\67\337\200\23\116\0"
+"\124\6\160\244\51\112\72\271\44\223\1\74\31\0\224\1\4\20\100\0\1\24\151\44\222"
+"\111\66\31\244\220\1\140\31\100\224\1\4\20\100\0\0\364\342\13\0\0\0\0\0\0"
+"\0\0\20\0\0\0\0\0\300\220\0\0\0\0\0\274\0\0\0\0\277\0\23\14\0\302\0\60\14\61"
+"\305\30\163\14\62\311\50\263\14\63\315\70\363\14\64\321\110\63\15\65"
+"\325\130\23\300\65\330\144\243\315\66\334\164\343\315\67\340\204\43\316\70"
+"\344\224\143\316\71\350\244\243\316\72\354\264\343\316\73\360\304\43\317\74"
+"\364\324\143\317\75\370\344\243\317\76\374\364\343\317\77\0\5\44\120\0"
 
 "cp1254\0"
 "windows1254\0"
 "\0\0"
-"\63\6\140\142\41\51\266\250\342\212\216\270\150\306\213\130\4\20\100\0"
-"\1\220\130\342\211\50\262\10\142\210\223\330\170\6\214\131\4\20\200\37"
+"\124\6\160\244\51\112\72\271\44\223\257\74\171\10\224\171\4\20\100\0"
+"\1\24\151\44\222\111\66\31\244\220\264\140\211\110\224\172\4\20\300\47"
 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\55\0\0\0\0\0\0\0\0\0"
-"\0\0\0\0\0\0\364\100\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\56\0\0\0\0"
-"\0\0\0\0\0\0\0\0\0\0\0\370\120\6\0"
+"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\116\0\0\0\0\0\0\0\0\0"
+"\0\0\0\0\0\0\170\121\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\117\0\0\0\0"
+"\0\0\0\0\0\0\0\0\0\0\0\174\141\10\0"
 
 "cp1255\0"
 "windows1255\0"
 "\0\0"
-"\63\6\140\142\41\51\266\250\342\212\216\270\30\300\213\1\4\20\100\0"
-"\1\220\130\342\211\50\262\10\142\210\223\330\30\0\214\1\4\20\100\0\0\0\0\0\0"
-"\61\2\0\0\0\0\0\300\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\360\0\0\0\0\0\0\0"
-"\100\5\45\324\120\104\25\145\324\121\110\45\25\200\122\113\61\325\224\123"
-"\117\101\25\225\124\156\275\5\127\134\162\5\20\100\0\1\4\20\100\0"
-"\123\121\125\225\125\127\141\225\225\126\133\161\325\225\127"
-"\137\201\25\226\130\143\221\125\226\131\147\241\225\226\132\153\261\325\126\0"
-"\1\170\370\141\0"
+"\124\6\160\244\51\112\72\271\44\223\257\74\31\0\224\1\4\20\100\0"
+"\1\24\151\44\222\111\66\31\244\220\264\140\31\100\224\1\4\20\100\0\0\0\0\0\0"
+"\122\2\0\0\0\0\0\300\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\360\0\0\0\0\0\0\0"
+"\141\211\65\26\131\145\231\165\26\132\151\251\25\300\132\154\265\345\326\133"
+"\160\305\45\327\134\217\101\26\231\144\223\5\20\100\0\1\4\20\100\0"
+"\164\325\145\327\135\170\345\245\327\136\174\365\345\327\137\200\5\46\330\140"
+"\204\25\146\330\141\210\45\246\330\142\214\65\346\130\0\1\374\10\144\0"
 
 "cp1256\0"
 "windows1256\0"
 "\0\0"
-"\63\222\146\142\41\51\266\250\342\212\216\270\70\332\213\130\224\206\232\151"
-"\252\221\130\342\211\50\262\10\142\210\251\331\170\32\214\131\160\330\341\152"
-"\0\314\5\0\0\0\0\0\0\0\0\0\300\32\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\100\27\0"
-"\0\0\0\100\135\255\331\165\27\136\171\351\265\27\137\175\371\365\27\140"
-"\201\11\66\30\141\205\31\166\30\142\211\51\266\30\0\214\65\346\330\143"
-"\220\105\46\331\144\0\120\6\100\145\226\135\206\31\0\0\0\0\0\0\231\151\6\0\0"
-"\233\161\326\231\147\0\174\6\32\0\241\1\40\32\0\0\170\370\241\153"
+"\124\26\167\244\51\112\72\271\44\223\257\74\111\34\224\171\30\227\334\161"
+"\313\25\151\44\222\111\66\31\244\220\312\141\211\134\224\172\364\350\43\163"
+"\0\120\6\0\0\0\0\0\0\0\0\0\320\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\120\31\0"
+"\0\0\0\200\145\316\135\206\131\146\232\155\306\131\147\236\175\6\132\150"
+"\242\215\106\132\151\246\235\206\132\152\252\255\306\32\0\255\271\366\32\154"
+"\261\311\66\33\155\0\324\6\200\155\267\341\226\33\0\0\0\0\0\0\272\355\6\0\0"
+"\274\365\346\333\157\0\0\27\34\0\302\1\60\34\0\0\374\10\344\163"
 
 "cp1257\0"
 "windows1257\0"
 "\0\0"
-"\63\6\140\142\0\51\266\250\342\212\1\270\30\300\213\1\20\360\210\2"
-"\1\220\130\342\211\50\262\10\142\210\1\330\30\0\214\1\30\40\111\0\0\4\0\0\0"
-"\0\4\0\0\0\15\0\300\5\0\0\0\0\300\2\0\0\0\0\0\0\0\0\0\0\20\0\320\5\0"
-"\0\0\0\200\3\25\354\20\301\5\0\0\160\302\10\35\0\360\107\11\61\4\221\203\21"
-"\146\60\341\4\0\124\0\0\0\0\170\50\1\6\34\0\4\62\10\0\26\360\40\1\6"
-"\0\0\200\2\11\36\0\0\210\11\62\10\241\303\21\147\64\361\4\0\125\0\0\0\0"
-"\171\54\21\106\34\0\10\102\110\44"
+"\124\6\160\144\0\112\72\271\44\223\1\74\31\0\224\1\20\0\213\2\1\24\151\44\222"
+"\111\66\31\244\220\1\140\31\100\224\1\30\60\113\0\0\4\0\0\0\0\4\0\0\0"
+"\15\0\320\7\0\0\0\0\300\2\0\0\0\0\0\0\0\0\0\0\20\0\340\7\0\0\0\0\200\3"
+"\66\160\41\3\16\0\0\200\4\21\76\0\0\212\21\122\210\241\305\31\207\264\361\6\0"
+"\165\0\0\0\0\231\254\21\110\44\0\210\102\12\0\67\164\61\103\16\0\0\220\104\21"
+"\77\0\20\312\21\123\214\261\5\32\210\270\1\7\0\166\0\0\0\0\232\260\41\210\44"
+"\0\214\122\212\54"
 
 "cp1258\0"
 "windows1258\0"
 "\0\0"
-"\63\6\140\142\41\51\266\250\342\212\216\270\30\300\213\130\4\20\100\0"
-"\1\220\130\342\211\50\262\10\142\210\223\330\30\0\214\131\4\20\200\37"
+"\124\6\160\244\51\112\72\271\44\223\257\74\31\0\224\171\4\20\100\0"
+"\1\24\151\44\222\111\66\31\244\220\264\140\31\100\224\172\4\20\300\47"
 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-"\0\0\0\0\0\0\0\0\300\4\0\0\0\0\0\0\0\0\0\0\225\0\0\0\0\41\0\200\11\0"
-"\0\30\2\0\0\0\0\0\0\0\0\40\162\11\0\0\0\0\0\5\0\0\0\0\0\0\0\0\0\0\226\0\0\0\0"
-"\42\0\220\11\0\0\34\2\0\0\0\0\0\0\0\0\44\42\43\0"
+"\0\0\0\0\0\0\0\0\0\15\0\0\0\0\0\0\0\0\0\0\266\0\0\0\0\102\0\220\13\0"
+"\0\234\2\0\0\0\0\0\0\0\0\244\202\13\0\0\0\0\100\15\0\0\0\0\0\0\0\0\0\0"
+"\267\0\0\0\0\103\0\240\13\0\0\240\2\0\0\0\0\0\0\0\0\250\62\45\0"
 
 "koi8r\0"
 "\0\0"
-"\76\376\10\144\220\102\16\111\144\221\106\36\211\244\231\147\242\231\246\232"
-"\153\262\331\46\217\156\336\210\143\216\72\356\50\100\217\7\40\220\300\3"
-"\111\52\271\44\114\114\66\351\344\223\120\106\51\345\224\124\126\151\345\225"
-"\130\146\251\245\70\133\162\331\245\227\137\202\31\246\230\143\222\131\146\1"
-"\56\101\24\221\111\24\125\104\322\104\45\141\224\221\106\33\161\324\221\107"
-"\37\275\4\122\110\42\215\144\221\104\54\255\164\21\112\55\245\164\222\112"
-"\16\301\23\217\101\364\324\103\320\74\5\341\223\217\76\373\360\323\217\77"
-"\377\74\4\120\100\2\15\144\217\74\14\55\164\17\102\15\45\164\220\102"
+"\140\206\51\346\230\144\226\151\346\231\150\246\251\46\242\211\52\272\50\243"
+"\215\72\372\250\227\220\146\251\345\226\134\166\51\300\227\7\40\220\300\3"
+"\153\262\331\146\124\156\276\11\147\234\162\316\111\147\235"
+"\166\336\211\147\236\172\356\311\347\100\175\372\371\47\240\201\12\72\50\241"
+"\205\32\172\150\1\117\305\44\323\121\65\331\124\24\115\106\345\244\323\116"
+"\74\365\344\323\117\100\101\25\224\120\103\21\165\323\114\115\61\205\123\122"
+"\116\51\205\324\122\57\105\44\321\111\25\131\124\22\105\46\145\244\321\106"
+"\34\165\344\321\107\40\301\24\222\110\43\221\164\321\104\55\261\204\121\112"
+"\56\251\204\322\112"
 
 "koi8u\0"
 "\0\0"
-"\76\376\10\144\220\102\16\111\144\221\106\36\211\244\231\147\242\231\246\232"
-"\153\262\331\46\217\156\336\210\143\216\72\356\50\100\217\7\40\220\300\3"
-"\111\52\271\44\114\63\65\131\223\115\120\106\51\345\224\124\376\144\345\225"
-"\130\146\251\245\70\345\160\171\16\72\137\202\31\246\230\143\372\124\146\1"
-"\56\101\24\221\111\24\125\104\322\104\45\141\224\221\106\33\161\324\221\107"
-"\37\275\4\122\110\42\215\144\221\104\54\255\164\21\112\55\245\164\222\112"
-"\16\301\23\217\101\364\324\103\320\74\5\341\223\217\76\373\360\323\217\77"
-"\377\74\4\120\100\2\15\144\217\74\14\55\164\17\102\15\45\164\220\102"
+"\140\206\51\346\230\144\226\151\346\231\150\246\251\46\242\211\52\272\50\243"
+"\215\72\372\250\227\220\146\251\345\226\134\166\51\300\227\7\40\220\300\3"
+"\153\262\331\146\124\124\275\151\325\125\162\316\111\147\235"
+"\166\202\205\147\236\172\356\311\347\100\6\371\211\120\102\201\12\72\50\241"
+"\205\176\165\150\1\117\305\44\323\121\65\331\124\24\115\106\345\244\323\116"
+"\74\365\344\323\117\100\101\25\224\120\103\21\165\323\114\115\61\205\123\122"
+"\116\51\205\324\122\57\105\44\321\111\25\131\124\22\105\46\145\244\321\106"
+"\34\165\344\321\107\40\301\24\222\110\43\221\164\321\104\55\261\204\121\112"
+"\56\251\204\322\112"
+
+"cp437\0"
+"\0\0"
+"\27\300\100\202\7\37\164\0\202\10\45\230\60\102\12\50\234\100\101\5"
+"\30\70\260\300\12\54\250\360\202\13\61\144\300\101\4\22\114\140\245\51"
+"\221\106\32\151\244\221\106\32\151\244\221\106\32\151\244\221\106\32\151\244"
+"\215\72\372\150\230\147\362\331\147\234\160\372\311\246\234"
+"\170\336\151\347\230\144\246\211\246\231\140\252\231\247\236"
+"\165\276\111\150\240\173\256\171\250\240\203\376\11\50\235\163\266\351\246\241"
+"\205\226\51\246\242\211\56\312\50\242\345\104\212\14\75\327\334\23\51\76"
+"\332\64\323\15\72\221\352\223\116\244\221\106\332\45\227\136\176\371\300\226"
+"\7\144\231\200\226\221\42\0\251\0"
+
+"cp850\0"
+"\0\0"
+"\27\300\100\202\7\37\164\0\202\10\45\230\60\102\12\50\234\100\101\5"
+"\30\70\260\300\12\54\250\360\202\13\61\144\300\1\4\22\64\300\200\51"
+"\221\106\32\151\244\221\106\32\151\244\221\106\32\151\244\221\106\32\151\244"
+"\215\72\372\150\230\147\106\32\151\244\5\370\311\246\234\170\106\60\301\230"
+"\144\246\211\246\231\140\252\31\151\244\165\276\111\150\240"
+"\173\256\171\150\244\221\106\32\151\244\221\176\21\151\244\221\226\51\246\242"
+"\211\106\32\51\242\221\106\32\151\244\221\106\32\151\244\221\106\32\151\244"
+"\221\106\152\100\244\221\106\112\144\244\221\16\360\200\2\7\20\220\100\244"
+"\221\42\0\251\0"
 
diff --git a/sources/android/support/src/musl-locale/hkscs.h b/sources/android/support/src/musl-locale/hkscs.h
new file mode 100644
index 0000000..d356517
--- /dev/null
+++ b/sources/android/support/src/musl-locale/hkscs.h
@@ -0,0 +1,390 @@
+17392,19506,17923,17830,17784,29287,19831,17843,31921,19682,31941,15253,18230,
+18244,19527,19520,17087,13847,29522,28299,28882,19543,41809,18255,17882,19589,
+31852,19719,19108,18081,27427,29221,23124,6755,15878,16225,26189,22267,0,
+32149,22813,35769,15860,38708,31727,23515,7518,23204,13861,40624,23249,23479,
+23804,26478,34195,39237,29793,29853,14453,7507,13982,24609,16108,22750,15093,
+31484,40855,16737,35085,12778,2698,12894,17162,33924,40854,37935,18736,34323,
+22678,38730,37400,31184,31282,26208,27177,34973,29772,31685,26498,31276,21071,
+36934,13542,29636,23993,29894,40903,22451,18735,21580,16689,13966,22552,31346,
+31589,35727,18094,28296,16769,23961,31662,9404,40904,9409,9417,9420,40905,
+34052,13755,16564,40906,17633,44543,25281,28782,40907,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12736,12737,12738,12739,12740,268,12741,
+209,205,12742,12743,203,8168,12744,202,12745,12746,12747,12748,270,12749,
+12750,256,193,461,192,274,201,282,200,332,211,465,210,56320,7870,56324,7872,
+202,257,225,462,224,593,275,233,283,232,299,237,464,236,333,243,466,242,363,
+250,468,249,470,472,474,476,252,56328,7871,56332,7873,234,609,9178,9179,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41897,4421,0,25866,0,0,20029,28381,
+40270,37343,0,0,30517,25745,20250,20264,20392,20822,20852,20892,20964,21153,
+21160,21307,21326,21457,21464,22242,22768,22788,22791,22834,22836,23398,23454,
+23455,23706,24198,24635,25993,26622,26628,26725,27982,28860,30005,32420,32428,
+32442,32455,32463,32479,32518,32567,33402,33487,33647,35270,35774,35810,36710,
+36711,36718,29713,31996,32205,26950,31433,21031,0,0,0,0,37260,30904,37214,
+32956,0,36107,33014,2535,0,0,32927,40647,19661,40393,40460,19518,40438,28686,
+40458,41267,13761,0,28314,33342,29977,0,18705,39532,39567,40857,31111,33900,
+7626,1488,10982,20004,20097,20096,20103,20159,20203,20279,13388,20413,15944,
+20483,20616,13437,13459,13477,20870,22789,20955,20988,20997,20105,21113,21136,
+21287,13767,21417,13649,21424,13651,21442,21539,13677,13682,13953,21651,21667,
+21684,21689,21712,21743,21784,21795,21800,13720,21823,13733,13759,21975,13765,
+32132,21797,0,3138,3349,20779,21904,11462,14828,833,36422,19896,38117,16467,
+32958,30586,11320,14900,18389,33117,27122,19946,25821,3452,4020,3285,4340,
+25741,36478,3734,3083,3940,11433,33366,17619,0,3398,39501,33001,18420,
+20135,11458,39602,14951,38388,16365,13574,21191,38868,30920,11588,40302,38933,
+0,17369,24741,25780,21731,11596,11210,4215,14843,4207,26330,26390,31136,25834,
+20562,3139,36456,8609,35660,1841,0,18443,425,16378,22643,11661,0,17864,1276,
+24727,3916,3478,21881,16571,17338,0,19124,10854,4253,33194,39157,3484,25465,
+14846,10101,36288,22177,25724,15939,0,42497,3593,10959,11465,0,4296,14786,
+14738,14854,33435,13688,24137,8391,22098,3889,11442,38688,13500,27709,20027,0,
+0,30068,11915,8712,42587,36045,3706,3124,26652,32659,4303,10243,10553,13819,
+20963,3724,3981,3754,16275,3888,3399,4431,3660,0,3755,2985,3400,4288,4413,
+16377,9878,25650,4013,13300,30265,11214,3454,3455,11345,11349,14872,3736,4295,
+3886,42546,27472,36050,36249,36042,38314,21708,33476,21945,0,40643,39974,
+39606,30558,11758,28992,33133,33004,23580,25970,33076,14231,21343,32957,37302,
+3834,3599,3703,3835,13789,19947,13833,3286,22191,10165,4297,3600,3704,4216,
+4424,33287,5205,3705,20048,11684,23124,4125,4126,4341,4342,22428,3601,30356,
+33485,4021,3707,20862,14083,4022,4480,21208,41661,18906,6202,16759,33404,
+22681,21096,13850,22333,31666,23400,18432,19244,40743,18919,39967,39821,23412,
+12605,22011,13810,22153,20008,22786,7105,63608,38737,134,20059,20155,13630,
+23587,24401,24516,14586,25164,25909,27514,27701,27706,28780,29227,20012,29357,
+18665,32594,31035,31993,32595,25194,13505,0,25419,32770,32896,26130,26961,
+21341,34916,35265,30898,35744,36125,38021,38264,38271,38376,
+36367,38886,39029,39118,39134,39267,38928,40060,40479,40644,27503,63751,20023,
+135,38429,25143,38050,0,20539,28158,40051,40870,15817,34959,16718,28791,23797,
+19232,20941,13657,23856,24866,35378,36775,37366,29073,26393,29626,12929,41223,
+15499,6528,19216,30948,29698,20910,34575,16393,27235,41658,16931,34319,2671,
+31274,39239,35562,38741,28749,21284,8318,37876,30425,35299,40871,30685,20131,
+20464,20668,20015,20247,40872,21556,32139,22674,22736,7606,24210,24217,24514,
+10002,25995,13305,26905,27203,15459,27903,0,29184,17669,29580,16091,18963,
+23317,29881,35715,23716,22165,31379,31724,31939,32364,33528,34199,40873,34960,
+40874,36537,40875,36815,34143,39392,37409,40876,36281,5183,16497,17058,23066,
+0,0,0,39016,26475,17014,22333,0,34262,18811,33471,28941,19585,28020,23931,
+27413,28606,40877,40878,23446,40879,26343,32347,28247,31178,15752,17603,12886,
+10134,17306,17718,0,23765,15130,35577,23672,15634,13649,23928,40882,29015,
+17752,16620,7715,19575,14712,13386,420,27713,35532,20404,569,22975,33132,
+38998,39162,24379,2975,0,8641,35181,16642,18107,36985,16135,40883,41397,16632,
+14294,18167,27718,16764,34482,29695,17773,14548,21658,17761,17691,19849,19579,
+19830,17898,16328,19215,13921,17630,17597,16877,23870,23880,23894,15868,14351,
+23972,23993,14368,14392,24130,24253,24357,24451,14600,14612,14655,14669,24791,
+24893,23781,14729,25015,25017,25039,14776,25132,25232,25317,25368,14840,22193,
+14851,25570,25595,25607,25690,14923,25792,23829,22049,40863,14999,25990,15037,
+26111,26195,15090,26258,15138,
+26390,15170,26532,26624,15192,26698,26756,15218,15217,15227,26889,26947,29276,
+26980,27039,27013,15292,27094,15325,27237,27252,27249,27266,15340,27289,15346,
+27307,27317,27348,27382,27521,27585,27626,27765,27818,15563,27906,27910,27942,
+28033,15599,28068,28081,28181,28184,28201,28294,35264,28347,28386,28378,40831,
+28392,28393,28452,28468,15686,16193,28545,28606,15722,15733,29111,23705,15754,
+28716,15761,28752,28756,28783,28799,28809,805,17345,13809,3800,16087,22462,
+28371,28990,22496,13902,27042,35817,23412,31305,22753,38105,31333,31357,22956,
+31419,31408,31426,31427,29137,25741,16842,31450,31453,31466,16879,21682,23553,
+31499,31573,31529,21262,23806,31650,31599,33692,23476,27775,31696,33825,31634,
+0,23840,15789,23653,33938,31738,0,31797,23745,31812,31875,18562,31910,26237,
+17784,31945,31943,31974,31860,31987,31989,0,32359,17693,28228,32093,28374,
+29837,32137,32171,28981,32179,0,16471,24617,32228,15635,32245,6137,32229,
+33645,0,24865,24922,32366,32402,17195,37996,32295,32576,32577,32583,31030,
+25296,39393,32663,25425,32675,5729,104,17756,14182,17667,33594,32762,25737,0,
+32776,32797,0,32815,41095,27843,32827,32828,32865,10004,18825,26150,15843,
+26344,26405,32935,35400,33031,33050,22704,9974,27775,25752,20408,25831,5258,
+33304,6238,27219,19045,19093,17530,33321,2829,27218,15742,20473,5373,34018,
+33634,27402,18855,13616,6003,15864,33450,26907,63892,16859,34123,33488,33562,
+3606,6068,14017,12669,13658,33403,33506,33560,16011,28067,27397,27543,13774,
+15807,33565,21996,33669,17675,28069,33708,
+0,33747,13438,28372,27223,34138,13462,28226,12015,33880,23524,33905,15827,
+17636,27303,33866,15541,31064,0,27542,28279,28227,34014,0,33681,17568,33939,
+34020,23697,16960,23744,17731,34100,23282,28313,17703,34163,17686,26559,34326,
+34341,34363,34241,28808,34306,5506,28877,63922,17770,34344,13896,6306,21495,
+29594,34430,34673,41208,34798,11303,34737,34778,34831,22113,34412,26710,17935,
+34885,34886,30176,15801,30180,34910,34972,18011,34996,34997,25537,35013,30583,
+30479,35207,35210,0,0,35239,35260,35365,35303,31012,31421,35484,30611,37374,
+35472,31321,31465,31546,16271,18195,31544,29052,35596,35615,21552,21861,35647,
+35660,35661,35497,19066,35728,35739,35503,5855,17941,34895,35995,32084,32143,
+63956,14117,32083,36054,32152,32189,36114,36099,6416,36059,28764,36113,19657,
+16080,0,36265,32770,4116,18826,15228,33212,28940,31463,36525,36534,36547,
+37588,36633,36653,33637,33810,36773,37635,41631,2640,36787,18730,35294,34109,
+15803,24312,12898,36857,40980,34492,34049,8997,14720,28375,36919,34108,31422,
+36961,34156,34315,37032,34579,37060,34534,37038,0,37223,15088,37289,37316,
+31916,35123,7817,37390,27807,37441,37474,21945,0,35526,15515,35596,21979,3377,
+37676,37739,35553,35819,28815,23235,35554,35557,18789,37444,35820,35897,35839,
+37747,37979,36540,38277,38310,37926,38304,28662,17081,9850,34520,4732,15918,
+18911,27676,38523,38550,16748,38563,28373,25050,38582,30965,35552,38589,21452,
+18849,27832,628,25616,37039,37093,19153,6421,13066,38705,34370,38710,18959,
+17725,17797,19177,28789,23361,38683,
+0,37333,38743,23370,37355,38751,37925,20688,12471,12476,38793,38815,38833,
+38846,38848,38866,38880,21612,38894,29724,37939,0,38901,37917,31098,19153,
+38964,38963,38987,39014,15118,29045,15697,1584,16732,22278,39114,39095,39112,
+39111,19199,27943,5843,21936,39137,39142,39148,37752,39225,18985,19314,38999,
+39173,39413,39436,39483,39440,39512,22309,14020,37041,39893,39648,39650,39685,
+39668,19470,39700,39725,34304,20532,39732,27048,14531,12413,39760,39744,40254,
+23109,6243,39822,16971,39938,39935,39948,40552,40404,40887,41362,41387,41185,
+41251,41439,40318,40323,41268,40462,26760,40388,8539,41363,41504,6459,41523,
+40249,41145,41652,40592,40597,40606,40610,19764,40618,40623,17252,40641,15200,
+14821,15645,20274,14270,35883,40706,40712,19350,37924,28066,40727,0,40761,
+22175,22154,40773,39352,37003,38898,33919,40802,40809,31452,40846,29206,19390,
+18805,18875,29047,18936,17224,19025,29598,35802,6394,31135,35198,36406,37737,
+37875,35396,37612,37761,37835,35180,17593,29207,16107,30578,31299,28880,17523,
+17400,29054,6127,28835,6334,13721,16071,6277,21551,6136,14114,5883,6201,14049,
+6004,6353,24395,14115,5824,22363,18981,5118,4776,5062,5302,34051,13990,0,
+33877,18836,29029,15921,21852,16123,28754,17652,14062,39325,28454,26617,14131,
+15381,15847,22636,6434,26640,16471,14143,16609,16523,16655,27681,21707,22174,
+26289,22162,4063,2984,3597,37830,35603,37788,20216,20779,14361,17462,20156,
+1125,895,20299,20362,22097,23144,427,971,14745,778,1044,13365,20265,704,36531,
+629,35546,524,20120,20685,
+20749,20386,20227,18958,16010,20290,20526,20588,20609,20428,20453,20568,20732,
+0,0,0,0,28278,13717,15929,16063,28018,6276,16009,20904,20931,1504,17629,1187,
+1170,1169,36218,35484,1806,21081,21156,2163,21217,0,18042,29068,17292,3104,
+18860,4324,27089,3613,0,16094,29849,29716,29782,29592,19342,19132,16525,21456,
+13700,29199,16585,21940,837,21709,3014,22301,37469,38644,37734,22493,22413,
+22399,13886,22731,23193,35398,5882,5999,5904,23084,22968,37519,23166,23247,
+23058,22854,6643,6241,17045,14069,27909,29763,23073,24195,23169,35799,1043,
+37856,29836,4867,28933,18802,37896,35323,37821,14240,23582,23710,24158,24136,
+6550,6524,15086,24269,23375,6403,6404,14081,6304,14045,5886,14035,33066,35399,
+7610,13426,35240,24332,24334,6439,6059,23147,5947,23364,34324,30205,34912,
+24702,10336,9771,24539,16056,9647,9662,37000,28531,25024,62,70,9755,24985,
+24984,24693,11419,11527,18132,37197,25713,18021,11114,14889,11042,13392,39146,
+11896,25399,42075,25782,25393,25553,18915,11623,25252,11425,25659,25963,26994,
+15348,12430,12973,18825,12971,21773,13024,6361,37951,26318,12937,12723,15072,
+16784,21892,35618,21903,5884,21851,21541,30958,12547,6186,12852,13412,12815,
+12674,17097,26254,27940,26219,19347,26160,30832,7659,26211,13010,13025,26142,
+22642,14545,14394,14268,15257,14242,13310,29904,15254,26511,17962,26806,26654,
+15300,27326,14435,14293,17543,27187,27218,27337,27397,6418,25873,26776,27212,
+15319,27258,27479,16320,15514,37792,37618,35818,35531,37513,32798,35292,37991,
+28069,28427,
+18924,0,16255,15759,28164,16444,23101,28170,22599,27940,30786,28987,17178,
+17014,28913,29264,29319,29332,18319,18213,20857,19108,1515,29818,16120,13919,
+19018,18711,24545,16134,16049,19167,35875,16181,24743,16115,29900,29756,37767,
+29751,17567,28138,17745,30083,16227,19673,19718,16216,30037,30323,42438,15129,
+29800,35532,18859,18830,15099,15821,19022,16127,18885,18675,37370,22322,37698,
+35555,6244,20703,21025,20967,30584,12850,30478,30479,30587,18071,14209,14942,
+18672,29752,29851,16063,19130,19143,16584,19094,25006,37639,21889,30750,30861,
+30856,30930,29648,31065,30529,22243,16654,0,33942,31141,27181,16122,31290,
+31220,16750,5862,16690,37429,31217,3404,18828,665,15802,5998,13719,21867,
+13680,13994,468,3085,31458,23129,9973,23215,23196,23053,603,30960,23082,23494,
+31486,16889,31837,31853,16913,23475,24252,24230,31949,18937,6064,31886,31868,
+31918,27314,32220,32263,32211,32590,25185,24924,31560,32151,24194,17002,27509,
+2326,26582,78,13775,22468,25618,25592,18786,32733,31527,2092,23273,23875,
+31500,24078,39398,34373,39523,27164,13375,14818,18935,26029,39455,26016,33920,
+28967,27857,17642,33079,17410,32966,33033,33090,26548,39107,27202,33378,33381,
+27217,33875,28071,34320,29211,23174,16767,6208,23339,6305,23268,6360,34464,
+63932,15759,34861,29730,23042,34926,20293,34951,35007,35046,35173,35149,22147,
+35156,30597,30596,35829,35801,35740,35321,16045,33955,18165,18127,14322,35389,
+35356,37960,24397,37419,17028,26068,28969,28868,6213,40301,35999,36073,32220,
+22938,30659,23024,17262,14036,36394,36519,19465,
+36656,36682,17140,27736,28603,8993,18587,28537,28299,6106,39913,14005,18735,
+37051,0,21873,18694,37307,37892,35403,16482,35580,37927,35869,35899,34021,
+35371,38297,38311,38295,38294,36148,29765,16066,18687,19010,17386,16103,12837,
+38543,36583,36454,36453,16076,18925,19064,16366,29714,29803,16124,38721,37040,
+26695,18973,37011,22495,0,37736,35209,35878,35631,25534,37562,23313,35689,
+18748,29689,16923,38811,38769,39224,3878,24001,35781,19122,38943,38106,37622,
+38359,37349,17600,35664,19047,35684,39132,35397,16128,37418,18725,33812,39227,
+39245,31494,15869,39323,19311,39338,39516,35685,22728,27279,39457,23294,39471,
+39153,19344,39240,39356,19389,19351,37757,22642,4866,22562,18872,5352,30788,
+10015,15800,26821,15741,37976,14631,24912,10113,10603,24839,40015,40019,40059,
+39989,39952,39807,39887,40493,39839,41461,41214,40225,19630,16644,40472,19632,
+40204,41396,41197,41203,39215,40357,33981,28178,28639,27522,34300,17715,28068,
+28292,28144,33824,34286,28160,14295,24676,31202,13724,13888,18733,18910,15714,
+37851,37566,37704,703,30905,37495,37965,20452,13376,36964,21853,30781,30804,
+30902,30795,5975,12745,18753,13978,20338,28634,28633,0,28702,21524,16821,
+22459,22771,22410,40214,22487,28980,13487,16812,29163,27712,20375,0,6069,
+35401,24844,23246,23051,17084,17544,14124,19323,35324,37819,37816,6358,3869,
+33906,27840,5139,17146,11302,17345,22932,15799,26433,32168,24923,24740,18873,
+18827,35322,37605,29666,16105,29876,35683,6303,16097,19123,27352,29683,29691,
+16086,19006,19092,6105,19046,935,5156,18917,29768,
+18710,28837,18806,37508,29670,37727,1278,37681,35534,35350,37766,35815,21973,
+18741,35458,29035,18755,3327,22180,1562,3051,3256,21762,31172,6138,32254,5826,
+19024,6226,17710,37889,14090,35520,18861,22960,6335,6275,29828,23201,14050,
+15707,14000,37471,23161,35457,6242,37748,15565,2740,19094,14730,20724,15721,
+15692,5020,29045,17147,33304,28175,37092,17643,27991,32335,28775,27823,15574,
+16365,15917,28162,28428,15727,1013,30033,14012,13512,18048,16090,18545,22980,
+37486,18750,36673,35868,27584,22546,22472,14038,5202,28926,17250,19057,12259,
+4784,9149,26809,26983,5016,13541,31732,14047,35459,14294,13306,19615,27162,
+13997,27831,33854,17631,17614,27942,27985,27778,28638,28439,28937,33597,5946,
+33773,27776,28755,6107,22921,23170,6067,23137,23153,6405,16892,14125,23023,
+5948,14023,29070,37776,26266,17061,23150,23083,17043,27179,16121,30518,17499,
+17098,28957,16985,35297,20400,27944,23746,17614,32333,17341,27148,16982,4868,
+28838,28979,17385,15781,27871,63525,19023,32357,23019,23855,15859,24412,19037,
+6111,32164,33830,21637,15098,13056,532,22398,2261,1561,16357,8094,41654,28675,
+37211,23920,29583,31955,35417,37920,20424,32743,29389,29456,31476,29496,29497,
+22262,29505,29512,16041,31512,36972,29173,18674,29665,33270,16074,30476,16081,
+27810,22269,29721,29726,29727,16098,16112,16116,16122,29907,16142,16211,30018,
+30061,30066,30093,16252,30152,30172,16320,30285,16343,30324,16348,30330,20316,
+29064,22051,35200,22633,16413,30531,16441,26465,16453,13787,30616,16490,16495,
+23646,30654,30667,22770,30744,28857,30748,
+16552,30777,30791,30801,30822,33864,21813,31027,26627,31026,16643,16649,31121,
+31129,36795,31238,36796,16743,31377,16818,31420,33401,16836,31439,31451,16847,
+20001,31586,31596,31611,31762,31771,16992,17018,31867,31900,17036,31928,17044,
+31981,36755,28864,3279,32207,32212,32208,32253,32686,32692,29343,17303,32800,
+32805,31545,32814,32817,32852,15820,22452,28832,32951,33001,17389,33036,29482,
+33038,33042,30048,33044,17409,15161,33110,33113,33114,17427,22586,33148,33156,
+17445,33171,17453,33189,22511,33217,33252,33364,17551,33446,33398,33482,33496,
+33535,17584,33623,38505,27018,33797,28917,33892,24803,33928,17668,33982,34017,
+34040,34064,34104,34130,17723,34159,34160,34272,17783,34418,34450,34482,34543,
+38469,34699,17926,17943,34990,35071,35108,35143,35217,31079,35369,35384,35476,
+35508,35921,36052,36082,36124,18328,22623,36291,18413,20206,36410,21976,22356,
+36465,22005,36528,18487,36558,36578,36580,36589,36594,36791,36801,36810,36812,
+36915,39364,18605,39136,37395,18718,37416,37464,37483,37553,37550,37567,37603,
+37611,37619,37620,37629,37699,37764,37805,18757,18769,40639,37911,21249,37917,
+37933,37950,18794,37972,38009,38189,38306,18855,38388,38451,18917,26528,18980,
+38720,18997,38834,38850,22100,19172,24808,39097,19225,39153,22596,39182,39193,
+20916,39196,39223,39234,39261,39266,19312,39365,19357,39484,39695,31363,39785,
+39809,39901,39921,39924,19565,39968,14191,7106,40265,39994,40702,22096,40339,
+40381,40384,40444,38134,36790,40571,40620,40625,40637,40646,38108,40674,40689,
+40696,31432,40772,148,695,928,26906,38083,22956,
+1239,22592,38081,14265,1493,1557,1654,5818,22359,29043,2754,2765,3007,21610,
+63547,3019,21662,3067,3131,3155,3173,3196,24807,3213,22138,3253,3293,3309,
+3439,3506,3528,26965,39983,34725,3588,3598,3799,3984,3885,3699,23584,4028,
+24075,4188,4175,4214,26398,4219,4232,4246,13895,4287,4307,4399,4411,21348,
+33965,4835,4981,4918,35713,5495,5657,6083,6087,20088,28859,6189,6506,6701,
+6725,7210,7280,7340,7880,25283,7893,7957,29080,26709,8261,27113,14024,8828,
+9175,9210,10026,10353,10575,33533,10599,10643,10965,35237,10984,36768,11022,
+38840,11071,38983,39613,11340,0,11400,11447,23528,11528,11538,11703,11669,
+11842,12148,12236,12339,12390,13087,13278,24497,26184,26303,31353,13671,13811,
+0,18874,0,13850,14102,0,838,22709,26382,26904,15015,30295,24546,15889,16057,
+30206,8346,18640,19128,16665,35482,17134,17165,16443,17204,17302,19013,1482,
+20946,1553,22943,7848,15294,15615,17412,17622,22408,18036,14747,18223,34280,
+39369,14178,8643,35678,35662,0,18450,18683,18965,29193,19136,3192,22885,20133,
+20358,1913,36570,20524,21135,22335,29041,21145,21529,16202,19111,21948,21574,
+21614,27474,0,13427,21823,30258,21854,18200,21858,21862,22471,18751,22621,
+20582,13563,13260,0,22787,18300,35144,23214,23433,23558,7568,22433,29009,0,
+24834,31762,36950,25010,20378,35682,25602,25674,23899,27639,0,25732,6428,
+35562,18934,25736,16367,25874,19392,26047,26293,10011,37989,22497,24981,23079,
+63693,0,22201,17697,26364,20074,18740,38486,28047,27837,13848,35191,
+26521,26734,25617,26718,0,26823,31554,37056,2577,26918,0,26937,31301,0,27130,
+39462,27181,13919,25705,33,31107,27188,27483,23852,13593,0,27549,18128,27812,
+30011,34917,28078,22710,14108,9613,28747,29133,15444,29312,29317,37505,8570,
+29323,37680,29414,18896,27705,38047,29776,3832,34855,35061,10534,33907,6065,
+28344,18986,6176,14756,14009,0,0,17727,26294,40109,39076,35139,30668,30808,
+22230,16607,5642,14753,14127,33000,5061,29101,33638,31197,37288,0,19639,28847,
+35243,31229,31242,31499,32102,16762,31555,31102,32777,28597,41695,27139,33560,
+21410,28167,37823,26678,38749,33135,32803,27061,5101,12847,32840,23941,35888,
+32899,22293,38947,35145,23979,18824,26046,27093,21458,19109,16257,15377,26422,
+32912,33012,33070,8097,33103,33161,33199,33306,33542,33583,33674,13770,33896,
+34474,18682,25574,35158,30728,37461,35256,17394,35303,17375,35304,35654,35796,
+23032,35849,0,36805,37100,0,37136,37180,15863,37214,19146,36816,29327,22155,
+38119,38377,38320,38328,38706,39121,39241,39274,39363,39464,39694,40282,40347,
+32415,40696,40739,19620,38215,41619,29090,41727,19857,36882,42443,19868,3228,
+36798,21953,36794,9392,36793,19091,17673,32383,28502,27313,20202,13540,35628,
+30877,14138,36480,6133,32804,35692,35737,31294,26287,15851,30293,15543,22069,
+22870,20122,24193,25176,22207,3693,36366,23405,16008,19614,25566,0,6134,6267,
+25904,22061,23626,21530,21265,15814,40344,19581,22050,22046,32585,24280,22901,
+15680,34672,19996,4074,3401,14010,33047,40286,36120,30267,40005,30286,30649,
+37701,21554,
+33096,33527,22053,33074,33816,32957,21994,31074,22083,21526,3741,13774,22021,
+22001,26353,33506,13869,30004,22000,21946,21655,21874,3137,3222,24272,20808,
+3702,11362,3746,40619,32090,21982,4213,25245,38765,21652,36045,29174,37238,
+25596,25529,25598,21865,11075,40050,11955,20890,13535,3495,20903,21581,21790,
+21779,30310,36397,26762,30129,32950,34820,34694,35015,33206,33820,4289,17644,
+29444,18182,23440,33547,26771,22139,9972,32047,16803,32115,28368,29366,37232,
+4569,37384,15612,42665,3756,3833,29286,7330,18254,20418,32761,4075,16634,
+40029,25887,11680,18675,18400,40316,4076,3594,0,30115,4077,0,24648,4487,29091,
+32398,40272,19994,19972,13687,23309,27826,21351,13996,14812,21373,13989,17944,
+22682,19310,33325,21579,22442,23189,2425,0,14930,9317,29556,40620,19721,39917,
+15614,40752,19547,20393,38302,40926,33884,15798,29362,26547,14112,25390,32037,
+16119,15916,14890,36872,21196,15988,13946,17897,1166,30272,23280,3766,30842,
+32558,22695,16575,22140,39819,23924,30292,42036,40581,19681,0,14331,24857,
+12506,17394,0,22109,4777,22439,18787,40454,21044,28846,13741,0,40316,31830,
+39737,22494,5996,23635,25811,38096,25397,29028,34477,3368,27938,19170,3441,0,
+20990,7951,23950,38659,7633,40577,36940,31519,39682,23761,31651,25192,25397,
+39679,31695,39722,31870,0,31810,31878,39957,31740,39689,0,39963,18750,40794,
+21875,23491,20477,40600,20466,21088,15878,21201,22375,20566,22967,24082,38856,
+40363,36700,21609,38836,39232,38842,21292,24880,26924,21466,39946,40194,19515,
+38465,27008,20646,
+30022,5997,39386,21107,0,37209,38529,37212,0,37201,36503,25471,27939,27338,
+22033,37262,30074,25221,1020,29519,31856,23585,15613,0,18713,30422,39837,
+20010,3284,33726,34882,0,23626,27072,0,22394,21023,24053,20174,27697,498,
+20281,21660,21722,21146,36226,13822,0,13811,0,27474,37244,40869,39831,38958,
+39092,39610,40616,40580,29050,31508,0,27642,34840,32632,0,22048,42570,36471,
+40787,0,36308,36431,40476,36353,25218,33661,36392,36469,31443,19063,31294,
+30936,27882,35431,30215,35418,40742,27854,34774,30147,41650,30803,63552,36108,
+29410,29553,35629,29442,29937,36075,19131,34351,24506,34976,17591,0,6203,
+28165,0,35454,9499,0,24829,30311,39639,40260,37742,39823,34805,0,0,36087,
+29484,38689,39856,13782,29362,19463,31825,39242,24921,24921,19460,40598,24957,
+0,22367,24943,25254,25145,0,14940,25058,21418,13301,25444,26626,13778,23895,
+35778,36826,36409,0,20697,7494,30982,21298,38456,3899,16485,0,30718,0,31938,
+24346,31962,31277,32870,32867,32077,29957,29938,35220,33306,26380,32866,29830,
+32859,29936,33027,30500,35209,26572,30035,28369,34729,34766,33224,34700,35401,
+36013,35651,30507,29944,34010,13877,27058,36262,0,35241,0,28089,34753,16401,
+29927,15835,29046,24740,24988,15569,0,24695,0,32625,35629,0,24809,19326,21024,
+15384,15559,24279,30294,21809,6468,4862,39171,28124,28845,23745,25005,35343,
+13943,238,26694,20238,17762,23327,25420,40784,40614,25195,1351,37595,1503,
+16325,34124,17077,29679,20917,13897,18754,35300,37700,6619,
+33518,15560,30780,26436,25311,18739,35242,672,27571,4869,20395,9453,20488,
+27945,31364,13824,19121,9491,0,894,24484,896,839,28379,1055,0,20737,13434,
+20750,39020,14147,33814,18852,1159,20832,13236,20842,3071,8444,741,9520,1422,
+12851,6531,23426,34685,1459,15513,20914,20920,40244,20937,20943,20945,15580,
+20947,19110,20915,20962,21314,20973,33741,26942,14125,24443,21003,21030,21052,
+21173,21079,21140,21177,21189,31765,34114,21216,34317,27411,0,35550,21833,
+28377,16256,2388,16364,21299,0,3042,27851,5926,26651,29653,24650,16042,14540,
+5864,29149,17570,21357,21364,34475,21374,0,5526,5651,30694,21395,35483,21408,
+21419,21422,29607,22386,16217,29596,21441,21445,27721,20041,22526,21465,15019,
+2959,21472,16363,11683,21494,3191,21523,28793,21803,26199,27995,21613,27475,
+3444,21853,21647,21668,18342,5901,3805,15796,3405,35260,9880,21831,19693,
+21551,29719,21894,21929,0,6359,16442,17746,17461,26291,4276,22071,26317,12938,
+26276,26285,22093,22095,30961,22257,38791,21502,22272,22255,22253,35686,13859,
+4687,22342,16805,27758,28811,22338,14001,27774,22502,5142,22531,5204,17251,
+22566,19445,22620,22698,13665,22752,22748,4668,22779,23551,22339,41296,17016,
+37843,13729,22815,26790,14019,28249,5694,23076,21843,5778,34053,22985,3406,
+27777,27946,6108,23001,6139,6066,28070,28017,6184,5845,23033,28229,23211,
+23139,14054,18857,0,14088,23190,29797,23251,28577,9556,15749,6417,14130,5816,
+24195,21200,23414,25992,23420,31246,16388,18525,516,23509,24928,6708,22988,
+1445,23539,
+23453,19728,23557,6980,23571,29646,23572,7333,27432,23625,18653,23685,23785,
+23791,23947,7673,7735,23824,23832,23878,7844,23738,24023,33532,14381,18689,
+8265,8563,33415,14390,15298,24110,27274,0,24186,17596,3283,21414,20151,0,
+21416,6001,24073,24308,33922,24313,24315,14496,24316,26686,37915,24333,449,
+63636,15070,18606,4922,24378,26760,9168,0,9329,24419,38845,28270,24434,37696,
+35382,24487,23990,15711,21072,8042,28920,9832,37334,670,35369,24625,26245,
+6263,14691,15815,13881,22416,10164,31089,15936,24734,0,24755,18818,18831,
+31315,29860,20705,23200,24932,33828,24898,63654,28370,24961,20980,1622,24967,
+23466,16311,10335,25043,35741,39261,25040,14642,10624,10433,24611,24924,25886,
+25483,280,25285,6000,25301,11789,25452,18911,14871,25656,25592,5006,6140,0,
+28554,11830,38932,16524,22301,25825,25829,38011,14950,25658,14935,25933,28438,
+18984,18979,25989,25965,25951,12414,26037,18752,19255,26065,16600,6185,26080,
+26083,24543,13312,26136,12791,12792,26180,12708,12709,26187,3701,26215,20966,
+26227,0,7741,12849,34292,12744,21267,30661,10487,39332,26370,17308,18977,
+15147,27130,14274,0,26471,26466,16845,37101,26583,17641,26658,28240,37436,
+26625,13286,28064,26717,13423,27105,27147,35551,26995,26819,13773,26881,26880,
+15666,14849,13884,15232,26540,26977,35402,17148,26934,27032,15265,969,33635,
+20624,27129,13913,8490,27205,14083,27293,15347,26545,27336,37276,15373,27421,
+2339,24798,27445,27508,10189,28341,15067,949,6488,14144,21537,15194,27617,
+16124,27612,27703,9355,18673,27473,
+27738,33318,27769,15804,17605,15805,16804,18700,18688,15561,14053,15595,3378,
+39811,12793,9361,32655,26679,27941,28065,28139,28054,27996,28284,28420,18815,
+16517,28274,34099,28532,20935,0,0,33838,35617,0,15919,29779,16258,31180,28239,
+23185,12363,28664,14093,28573,15920,28410,5271,16445,17749,37872,28484,28508,
+15694,28532,37232,15675,28575,16708,28627,16529,16725,16441,16368,16308,16703,
+20959,16726,16727,16704,25053,28747,28798,28839,28801,28876,28885,28886,28895,
+16644,15848,29108,29078,17015,28971,28997,23176,29002,0,23708,17253,29007,
+37730,17089,28972,17498,18983,18978,29114,35816,28861,29198,37954,29205,22801,
+37955,29220,37697,22021,29230,29248,18804,26813,29269,29271,15957,12356,26637,
+28477,29314,0,29483,18467,34859,18669,34820,29480,29486,29647,29610,3130,
+27182,29641,29769,16866,5863,18980,26147,14021,18871,18829,18939,29687,29717,
+26883,18982,29753,1475,16087,0,10413,29792,36530,29767,29668,29814,33721,
+29804,14128,29812,37873,27180,29826,18771,19084,16735,19065,35727,23366,35843,
+6302,29896,6536,29966,0,29982,36569,6731,23511,36524,37765,30029,30026,30055,
+30062,20354,16132,19731,30094,29789,30110,30132,30210,30252,30289,30287,30319,
+30326,25589,30352,33263,14328,26897,26894,30369,30373,30391,30412,28575,33890,
+20637,20861,7708,30494,30502,30528,25775,21024,30552,12972,30639,35172,35176,
+5825,30708,0,4982,18962,26826,30895,30919,30931,38565,31022,21984,30935,31028,
+30897,30220,36792,34948,35627,24707,9756,31110,35072,26882,31104,22615,31133,
+31545,31036,31145,28202,28966,
+16040,31174,37133,31188,1312,17503,21007,47234,248,16384,43296,1102,0,0,2868,
+1,0,0,0,0,0,0,0,3072,64,0,0,0,1024,88,60,0,0,23680,56493,48115,17353,60910,
+4004,49446,30363,61426,64478,63482,12815,44868,61438,65277,24593,176,8448,
+33049,4128,43144,8544,9321,17408,50313,0,16387,53,33859,20785,26771,514,0,0,0,
+0,0,16384,256,44160,33380,35904,37025,20484,54368,53760,6186,26781,38709,
+55375,8440,33476,10268,30082,660,16440,41376,4293,19825,3524,47512,23390,
+17153,39327,30723,57888,2079,393,16585,775,39437,21136,20433,892,8450,49184,
+4974,46467,62939,30693,20368,39447,5942,12,47726,12041,21600,7680,26744,28706,
+40534,62245,46990,2839,59119,6007,7003,4289,36248,6162,53174,12545,6770,11355,
+49334,57888,23747,7042,56032,34254,16598,21673,53259,18447,16452,2320,16596,
+15278,7780,11076,2071,33414,6198,35232,40167,2139,900,55810,60560,34779,49029,
+44450,36509,39069,9504,70,40774,58239,51669,62596,19926,58118,6326,2322,0,
+1024,0,32,0,512,0,0,0,0,8192,0,0,0,0,0,0,8,36352,28280,16223,56702,63293,
+39932,44796,65490,27535,59377,47807,28334,61207,42972,46654,30645,37577,42455,
+19126,39790,33209,26445,21758,39921,65122,21103,14039,49150,17705,63873,26045,
+17062,57,16896,36704,37888,16448,45010,53719,219,39072,31666,20998,38944,
+51222,2365,0,1,0,2561,2226,128,0,34820,5152,19472,0,4,17569,16,321,
+2048,61504,20447,22582,62961,32949,26613,16512,20480,16718,33992,23040,55392,
+11009,20481,5793,16580,28402,44049,14624,49348,1800,2316,38552,39876,7184,
+27800,10886,422,4422,58733,50379,37568,8464,4630,29341,27124,5902,41514,62593,
+123,41992,36875,11280,14796,330,5872,2571,3136,59933,17420,17678,2,
diff --git a/sources/android/support/src/musl-locale/iconv.c b/sources/android/support/src/musl-locale/iconv.c
index 570084c..0dc54a4 100644
--- a/sources/android/support/src/musl-locale/iconv.c
+++ b/sources/android/support/src/musl-locale/iconv.c
@@ -20,6 +20,8 @@
 #define GB18030     0330
 #define GBK         0331
 #define GB2312      0332
+#define BIG5        0340
+#define EUC_KR      0350
 
 /* FIXME: these are not implemented yet
  * EUC:   A1-FE A1-FE
@@ -47,6 +49,8 @@
 "gb18030\0\0\330"
 "gbk\0\0\331"
 "gb2312\0\0\332"
+"big5\0bigfive\0cp950\0big5hkscs\0\0\340"
+"euckr\0ksc5601\0ksx1001\0cp949\0\0\350"
 #include "codepages.h"
 ;
 
@@ -62,6 +66,18 @@
 #include "gb18030.h"
 };
 
+static const unsigned short big5[89][157] = {
+#include "big5.h"
+};
+
+static const unsigned short hkscs[] = {
+#include "hkscs.h"
+};
+
+static const unsigned short ksc[93][94] = {
+#include "ksc.h"
+};
+
 static int fuzzycmp(const unsigned char *a, const unsigned char *b)
 {
 	for (; *a && *b; a++, b++) {
@@ -265,7 +281,7 @@
 				c += 128;
 				for (d=0; d<=c; ) {
 					k = 0;
-                                      int i, j;
+                                       int i, j;
 					for (i=0; i<126; i++)
 						for (j=0; j<190; j++)
 							if (gb18030[i][j]-d <= c-d)
@@ -279,6 +295,76 @@
 			if (d>63) d--;
 			c = gb18030[c][d];
 			break;
+		case BIG5:
+			l = 2;
+			if (*inb < 2) goto starved;
+			d = *((unsigned char *)*in + 1);
+			if (d-0x40>=0xff-0x40 || d-0x7f<0xa1-0x7f) goto ilseq;
+			d -= 0x40;
+			if (d > 0x3e) d -= 0x22;
+			if (c-0xa1>=0xfa-0xa1) {
+				if (c-0x87>=0xff-0x87) goto ilseq;
+				if (c < 0xa1) c -= 0x87;
+				else c -= 0x87 + (0xfa-0xa1);
+				c = (hkscs[4867+(c*157+d)/16]>>(c*157+d)%16)%2<<17
+					| hkscs[c*157+d];
+				/* A few HKSCS characters map to pairs of UCS
+				 * characters. These are mapped to surrogate
+				 * range in the hkscs table then hard-coded
+				 * here. Ugly, yes. */
+				if (c/256 == 0xdc) {
+					if (totype-0300U > 8) k = 2;
+					else k = "\10\4\4\10\4\4\10\2\4"[totype-0300];
+					if (k > *outb) goto toobig;
+					x += iconv((iconv_t)(uintptr_t)to,
+						&(char *){"\303\212\314\204"
+						"\303\212\314\214"
+						"\303\252\314\204"
+						"\303\252\314\214"
+						+c%256}, &(size_t){4},
+						out, outb);
+					continue;
+				}
+				if (!c) goto ilseq;
+				break;
+			}
+			c -= 0xa1;
+			c = big5[c][d]|(c==0x27&&(d==0x3a||d==0x3c||d==0x42))<<17;
+			if (!c) goto ilseq;
+			break;
+		case EUC_KR:
+			l = 2;
+			if (*inb < 2) goto starved;
+			d = *((unsigned char *)*in + 1);
+			c -= 0xa1;
+			d -= 0xa1;
+			if (c >= 93 || d >= 94) {
+				c += (0xa1-0x81);
+				d += 0xa1;
+				if (c >= 93 || c>=0xc6-0x81 && d>0x52)
+					goto ilseq;
+				if (d-'A'<26) d = d-'A';
+				else if (d-'a'<26) d = d-'a'+26;
+				else if (d-0x81<0xff-0x81) d = d-0x81+52;
+				else goto ilseq;
+				if (c < 0x20) c = 178*c + d;
+				else c = 178*0x20 + 84*(c-0x20) + d;
+				c += 0xac00;
+				for (d=0xac00; d<=c; ) {
+					k = 0;
+                                       int i, j;
+					for (i=0; i<93; i++)
+						for (j=0; j<94; j++)
+							if (ksc[i][j]-d <= c-d)
+								k++;
+					d = c+1;
+					c += k;
+				}
+				break;
+			}
+			c = ksc[c][d];
+			if (!c) goto ilseq;
+			break;
 		default:
 			if (c < 128+type) break;
 			c -= 128+type;
@@ -317,8 +403,8 @@
 			}
 			d = c;
 			for (c=0; c<128-totype; c++) {
-				if (d == legacy_chars[ map[c*5/4]>>2*c%8 |
-					map[c*5/4+1]<<8-2*c%8 & 1023 ]) {
+				if (d == legacy_chars[ tomap[c*5/4]>>2*c%8 |
+					tomap[c*5/4+1]<<8-2*c%8 & 1023 ]) {
 					c += 128;
 					goto revout;
 				}
diff --git a/sources/android/support/src/musl-locale/iswctype_l.c b/sources/android/support/src/musl-locale/iswctype_l.c
index 1dccef6..13dfb1e 100644
--- a/sources/android/support/src/musl-locale/iswctype_l.c
+++ b/sources/android/support/src/musl-locale/iswctype_l.c
@@ -1,6 +1,9 @@
 #include <wctype.h>
+#include "libc.h"
 
 int iswctype_l(wint_t c, wctype_t t, locale_t l)
 {
 	return iswctype(c, t);
 }
+
+weak_alias(iswctype_l, __iswctype_l);
diff --git a/sources/android/support/src/musl-locale/ksc.h b/sources/android/support/src/musl-locale/ksc.h
new file mode 100644
index 0000000..8f6eca4
--- /dev/null
+++ b/sources/android/support/src/musl-locale/ksc.h
@@ -0,0 +1,640 @@
+12288,12289,12290,183,8229,8230,168,12291,173,8213,8741,65340,8764,8216,8217,
+8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12304,
+12305,177,215,247,8800,8804,8805,8734,8756,176,8242,8243,8451,8491,65504,
+65505,65509,9794,9792,8736,8869,8978,8706,8711,8801,8786,167,8251,9734,9733,
+9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8594,8592,8593,8595,
+8596,12307,8810,8811,8730,8765,8733,8757,8747,8748,8712,8715,8838,8839,8834,
+8835,8746,8745,8743,8744,65506,8658,8660,8704,8707,180,65374,711,728,733,730,
+729,184,731,161,191,720,8750,8721,8719,164,8457,8240,9665,9664,9655,9654,9828,
+9824,9825,9829,9831,9827,8857,9672,9635,9680,9681,9618,9636,9637,9640,9639,
+9638,9641,9832,9743,9742,9756,9758,182,8224,8225,8597,8599,8601,8598,8600,
+9837,9833,9834,9836,12927,12828,8470,13255,8482,13250,13272,8481,8364,174,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65281,65282,65283,65284,65285,65286,
+65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,
+65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,
+65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,
+65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,
+65339,65510,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,
+65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,
+65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,12593,12594,12595,
+12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,
+12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,
+12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,
+12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,
+12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,
+12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,
+12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,
+8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,0,0,0,0,0,8544,8545,8546,
+8547,8548,8549,8550,8551,8552,8553,0,0,0,0,0,0,0,913,914,915,916,917,918,919,
+920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,0,0,0,0,0,
+0,0,0,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,
+964,965,966,967,968,969,0,0,0,0,0,0,9472,9474,9484,9488,9496,9492,9500,9516,
+9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,
+9519,9512,9527,9535,9501,9520,9509,9528,9538,9490,9489,9498,9497,9494,9493,
+9486,9485,9502,9503,9505,9506,9510,9511,9513,9514,9517,9518,9521,9522,9525,
+9526,9529,9530,9533,9534,9536,9537,9539,9540,9541,9542,9543,9544,9545,9546,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13205,13206,13207,8467,
+13208,13252,13219,13220,13221,13222,13209,13210,13211,13212,13213,13214,13215,
+13216,13217,13218,13258,13197,13198,13199,13263,13192,13193,13256,13223,13224,
+13232,13233,13234,13235,13236,13237,13238,13239,13240,13241,13184,13185,13186,
+13187,13188,13242,13243,13244,13245,13246,13247,13200,13201,13202,13203,13204,
+8486,13248,13249,13194,13195,13196,13270,13253,13229,13230,13231,13275,13225,
+13226,13227,13228,13277,13264,13267,13251,13257,13276,13254,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,198,208,170,294,0,306,0,319,321,216,338,186,222,358,330,0,12896,
+12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,
+12910,12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,
+12923,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,
+9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,9312,9313,9314,
+9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,189,8531,8532,188,
+190,8539,8540,8541,8542,230,273,240,295,305,307,312,320,322,248,339,223,254,
+359,331,329,12800,12801,12802,12803,12804,12805,12806,12807,12808,12809,12810,
+12811,12812,12813,12814,12815,12816,12817,12818,12819,12820,12821,12822,12823,
+12824,12825,12826,12827,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,
+9382,9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,
+9397,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,
+9346,185,178,179,8308,8319,8321,8322,8323,8324,12353,12354,12355,12356,12357,
+12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,
+12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,
+12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,
+12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,
+12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,
+12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,
+0,0,0,0,0,0,0,0,0,0,0,12449,12450,12451,12452,12453,12454,12455,12456,12457,
+12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,
+12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,
+12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,
+12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,
+12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,
+12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,0,0,0,
+0,0,0,0,0,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,
+1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,
+1067,1068,1069,1070,1071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1072,1073,1074,1075,
+1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,
+1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44032,44033,44036,44039,44040,44041,44042,
+44048,44049,44050,44051,44052,44053,44054,44055,44057,44058,44059,44060,44061,
+44064,44068,44076,44077,44079,44080,44081,44088,44089,44092,44096,44107,44109,
+44116,44120,44124,44144,44145,44148,44151,44152,44154,44160,44161,44163,44164,
+44165,44166,44169,44170,44171,44172,44176,44180,44188,44189,44191,44192,44193,
+44200,44201,44202,44204,44207,44208,44216,44217,44219,44220,44221,44225,44228,
+44232,44236,44245,44247,44256,44257,44260,44263,44264,44266,44268,44271,44272,
+44273,44275,44277,44278,44284,44285,44288,44292,44294,44300,44301,44303,44305,
+44312,44316,44320,44329,44332,44333,44340,44341,44344,44348,44356,44357,44359,
+44361,44368,44372,44376,44385,44387,44396,44397,44400,44403,44404,44405,44406,
+44411,44412,44413,44415,44417,44418,44424,44425,44428,44432,44444,44445,44452,
+44471,44480,44481,44484,44488,44496,44497,44499,44508,44512,44516,44536,44537,
+44540,44543,44544,44545,44552,44553,44555,44557,44564,44592,44593,44596,44599,
+44600,44602,44608,44609,44611,44613,44614,44618,44620,44621,44622,44624,44628,
+44630,44636,44637,44639,44640,44641,44645,44648,44649,44652,44656,44664,44665,
+44667,44668,44669,44676,44677,44684,44732,44733,44734,44736,44740,44748,44749,
+44751,44752,44753,44760,44761,44764,44776,44779,44781,44788,44792,44796,44807,
+44808,44813,44816,44844,44845,44848,44850,44852,44860,44861,44863,44865,44866,
+44867,44872,44873,44880,44892,44893,44900,44901,44921,44928,44932,44936,44944,
+44945,44949,44956,44984,44985,44988,44992,44999,45000,45001,45003,45005,45006,
+45012,45020,45032,45033,45040,45041,45044,45048,45056,45057,45060,45068,45072,
+45076,45084,45085,45096,45124,45125,45128,45130,45132,45134,45139,45140,45141,
+45143,45145,45149,45180,45181,45184,45188,45196,45197,45199,45201,45208,45209,
+45210,45212,45215,45216,45217,45218,45224,45225,45227,45228,45229,45230,45231,
+45233,45235,45236,45237,45240,45244,45252,45253,45255,45256,45257,45264,45265,
+45268,45272,45280,45285,45320,45321,45323,45324,45328,45330,45331,45336,45337,
+45339,45340,45341,45347,45348,45349,45352,45356,45364,45365,45367,45368,45369,
+45376,45377,45380,45384,45392,45393,45396,45397,45400,45404,45408,45432,45433,
+45436,45440,45442,45448,45449,45451,45453,45458,45459,45460,45464,45468,45480,
+45516,45520,45524,45532,45533,45535,45544,45545,45548,45552,45561,45563,45565,
+45572,45573,45576,45579,45580,45588,45589,45591,45593,45600,45620,45628,45656,
+45660,45664,45672,45673,45684,45685,45692,45700,45701,45705,45712,45713,45716,
+45720,45721,45722,45728,45729,45731,45733,45734,45738,45740,45744,45748,45768,
+45769,45772,45776,45778,45784,45785,45787,45789,45794,45796,45797,45798,45800,
+45803,45804,45805,45806,45807,45811,45812,45813,45815,45816,45817,45818,45819,
+45823,45824,45825,45828,45832,45840,45841,45843,45844,45845,45852,45908,45909,
+45910,45912,45915,45916,45918,45919,45924,45925,45927,45929,45931,45934,45936,
+45937,45940,45944,45952,45953,45955,45956,45957,45964,45968,45972,45984,45985,
+45992,45996,46020,46021,46024,46027,46028,46030,46032,46036,46037,46039,46041,
+46043,46045,46048,46052,46056,46076,46096,46104,46108,46112,46120,46121,46123,
+46132,46160,46161,46164,46168,46176,46177,46179,46181,46188,46208,46216,46237,
+46244,46248,46252,46261,46263,46265,46272,46276,46280,46288,46293,46300,46301,
+46304,46307,46308,46310,46316,46317,46319,46321,46328,46356,46357,46360,46363,
+46364,46372,46373,46375,46376,46377,46378,46384,46385,46388,46392,46400,46401,
+46403,46404,46405,46411,46412,46413,46416,46420,46428,46429,46431,46432,46433,
+46496,46497,46500,46504,46506,46507,46512,46513,46515,46516,46517,46523,46524,
+46525,46528,46532,46540,46541,46543,46544,46545,46552,46572,46608,46609,46612,
+46616,46629,46636,46644,46664,46692,46696,46748,46749,46752,46756,46763,46764,
+46769,46804,46832,46836,46840,46848,46849,46853,46888,46889,46892,46895,46896,
+46904,46905,46907,46916,46920,46924,46932,46933,46944,46948,46952,46960,46961,
+46963,46965,46972,46973,46976,46980,46988,46989,46991,46992,46993,46994,46998,
+46999,47000,47001,47004,47008,47016,47017,47019,47020,47021,47028,47029,47032,
+47047,47049,47084,47085,47088,47092,47100,47101,47103,47104,47105,47111,47112,
+47113,47116,47120,47128,47129,47131,47133,47140,47141,47144,47148,47156,47157,
+47159,47160,47161,47168,47172,47185,47187,47196,47197,47200,47204,47212,47213,
+47215,47217,47224,47228,47245,47272,47280,47284,47288,47296,47297,47299,47301,
+47308,47312,47316,47325,47327,47329,47336,47337,47340,47344,47352,47353,47355,
+47357,47364,47384,47392,47420,47421,47424,47428,47436,47439,47441,47448,47449,
+47452,47456,47464,47465,47467,47469,47476,47477,47480,47484,47492,47493,47495,
+47497,47498,47501,47502,47532,47533,47536,47540,47548,47549,47551,47553,47560,
+47561,47564,47566,47567,47568,47569,47570,47576,47577,47579,47581,47582,47585,
+47587,47588,47589,47592,47596,47604,47605,47607,47608,47609,47610,47616,47617,
+47624,47637,47672,47673,47676,47680,47682,47688,47689,47691,47693,47694,47699,
+47700,47701,47704,47708,47716,47717,47719,47720,47721,47728,47729,47732,47736,
+47747,47748,47749,47751,47756,47784,47785,47787,47788,47792,47794,47800,47801,
+47803,47805,47812,47816,47832,47833,47868,47872,47876,47885,47887,47889,47896,
+47900,47904,47913,47915,47924,47925,47926,47928,47931,47932,47933,47934,47940,
+47941,47943,47945,47949,47951,47952,47956,47960,47969,47971,47980,48008,48012,
+48016,48036,48040,48044,48052,48055,48064,48068,48072,48080,48083,48120,48121,
+48124,48127,48128,48130,48136,48137,48139,48140,48141,48143,48145,48148,48149,
+48150,48151,48152,48155,48156,48157,48158,48159,48164,48165,48167,48169,48173,
+48176,48177,48180,48184,48192,48193,48195,48196,48197,48201,48204,48205,48208,
+48221,48260,48261,48264,48267,48268,48270,48276,48277,48279,48281,48282,48288,
+48289,48292,48295,48296,48304,48305,48307,48308,48309,48316,48317,48320,48324,
+48333,48335,48336,48337,48341,48344,48348,48372,48373,48374,48376,48380,48388,
+48389,48391,48393,48400,48404,48420,48428,48448,48456,48457,48460,48464,48472,
+48473,48484,48488,48512,48513,48516,48519,48520,48521,48522,48528,48529,48531,
+48533,48537,48538,48540,48548,48560,48568,48596,48597,48600,48604,48617,48624,
+48628,48632,48640,48643,48645,48652,48653,48656,48660,48668,48669,48671,48708,
+48709,48712,48716,48718,48724,48725,48727,48729,48730,48731,48736,48737,48740,
+48744,48746,48752,48753,48755,48756,48757,48763,48764,48765,48768,48772,48780,
+48781,48783,48784,48785,48792,48793,48808,48848,48849,48852,48855,48856,48864,
+48867,48868,48869,48876,48897,48904,48905,48920,48921,48923,48924,48925,48960,
+48961,48964,48968,48976,48977,48981,49044,49072,49093,49100,49101,49104,49108,
+49116,49119,49121,49212,49233,49240,49244,49248,49256,49257,49296,49297,49300,
+49304,49312,49313,49315,49317,49324,49325,49327,49328,49331,49332,49333,49334,
+49340,49341,49343,49344,49345,49349,49352,49353,49356,49360,49368,49369,49371,
+49372,49373,49380,49381,49384,49388,49396,49397,49399,49401,49408,49412,49416,
+49424,49429,49436,49437,49438,49439,49440,49443,49444,49446,49447,49452,49453,
+49455,49456,49457,49462,49464,49465,49468,49472,49480,49481,49483,49484,49485,
+49492,49493,49496,49500,49508,49509,49511,49512,49513,49520,49524,49528,49541,
+49548,49549,49550,49552,49556,49558,49564,49565,49567,49569,49573,49576,49577,
+49580,49584,49597,49604,49608,49612,49620,49623,49624,49632,49636,49640,49648,
+49649,49651,49660,49661,49664,49668,49676,49677,49679,49681,49688,49689,49692,
+49695,49696,49704,49705,49707,49709,49711,49713,49714,49716,49736,49744,49745,
+49748,49752,49760,49765,49772,49773,49776,49780,49788,49789,49791,49793,49800,
+49801,49808,49816,49819,49821,49828,49829,49832,49836,49837,49844,49845,49847,
+49849,49884,49885,49888,49891,49892,49899,49900,49901,49903,49905,49910,49912,
+49913,49915,49916,49920,49928,49929,49932,49933,49939,49940,49941,49944,49948,
+49956,49957,49960,49961,49989,50024,50025,50028,50032,50034,50040,50041,50044,
+50045,50052,50056,50060,50112,50136,50137,50140,50143,50144,50146,50152,50153,
+50157,50164,50165,50168,50184,50192,50212,50220,50224,50228,50236,50237,50248,
+50276,50277,50280,50284,50292,50293,50297,50304,50324,50332,50360,50364,50409,
+50416,50417,50420,50424,50426,50431,50432,50433,50444,50448,50452,50460,50472,
+50473,50476,50480,50488,50489,50491,50493,50500,50501,50504,50505,50506,50508,
+50509,50510,50515,50516,50517,50519,50520,50521,50525,50526,50528,50529,50532,
+50536,50544,50545,50547,50548,50549,50556,50557,50560,50564,50567,50572,50573,
+50575,50577,50581,50583,50584,50588,50592,50601,50612,50613,50616,50617,50619,
+50620,50621,50622,50628,50629,50630,50631,50632,50633,50634,50636,50638,50640,
+50641,50644,50648,50656,50657,50659,50661,50668,50669,50670,50672,50676,50678,
+50679,50684,50685,50686,50687,50688,50689,50693,50694,50695,50696,50700,50704,
+50712,50713,50715,50716,50724,50725,50728,50732,50733,50734,50736,50739,50740,
+50741,50743,50745,50747,50752,50753,50756,50760,50768,50769,50771,50772,50773,
+50780,50781,50784,50796,50799,50801,50808,50809,50812,50816,50824,50825,50827,
+50829,50836,50837,50840,50844,50852,50853,50855,50857,50864,50865,50868,50872,
+50873,50874,50880,50881,50883,50885,50892,50893,50896,50900,50908,50909,50912,
+50913,50920,50921,50924,50928,50936,50937,50941,50948,50949,50952,50956,50964,
+50965,50967,50969,50976,50977,50980,50984,50992,50993,50995,50997,50999,51004,
+51005,51008,51012,51018,51020,51021,51023,51025,51026,51027,51028,51029,51030,
+51031,51032,51036,51040,51048,51051,51060,51061,51064,51068,51069,51070,51075,
+51076,51077,51079,51080,51081,51082,51086,51088,51089,51092,51094,51095,51096,
+51098,51104,51105,51107,51108,51109,51110,51116,51117,51120,51124,51132,51133,
+51135,51136,51137,51144,51145,51148,51150,51152,51160,51165,51172,51176,51180,
+51200,51201,51204,51208,51210,51216,51217,51219,51221,51222,51228,51229,51232,
+51236,51244,51245,51247,51249,51256,51260,51264,51272,51273,51276,51277,51284,
+51312,51313,51316,51320,51322,51328,51329,51331,51333,51334,51335,51339,51340,
+51341,51348,51357,51359,51361,51368,51388,51389,51396,51400,51404,51412,51413,
+51415,51417,51424,51425,51428,51445,51452,51453,51456,51460,51461,51462,51468,
+51469,51471,51473,51480,51500,51508,51536,51537,51540,51544,51552,51553,51555,
+51564,51568,51572,51580,51592,51593,51596,51600,51608,51609,51611,51613,51648,
+51649,51652,51655,51656,51658,51664,51665,51667,51669,51670,51673,51674,51676,
+51677,51680,51682,51684,51687,51692,51693,51695,51696,51697,51704,51705,51708,
+51712,51720,51721,51723,51724,51725,51732,51736,51753,51788,51789,51792,51796,
+51804,51805,51807,51808,51809,51816,51837,51844,51864,51900,51901,51904,51908,
+51916,51917,51919,51921,51923,51928,51929,51936,51948,51956,51976,51984,51988,
+51992,52000,52001,52033,52040,52041,52044,52048,52056,52057,52061,52068,52088,
+52089,52124,52152,52180,52196,52199,52201,52236,52237,52240,52244,52252,52253,
+52257,52258,52263,52264,52265,52268,52270,52272,52280,52281,52283,52284,52285,
+52286,52292,52293,52296,52300,52308,52309,52311,52312,52313,52320,52324,52326,
+52328,52336,52341,52376,52377,52380,52384,52392,52393,52395,52396,52397,52404,
+52405,52408,52412,52420,52421,52423,52425,52432,52436,52452,52460,52464,52481,
+52488,52489,52492,52496,52504,52505,52507,52509,52516,52520,52524,52537,52572,
+52576,52580,52588,52589,52591,52593,52600,52616,52628,52629,52632,52636,52644,
+52645,52647,52649,52656,52676,52684,52688,52712,52716,52720,52728,52729,52731,
+52733,52740,52744,52748,52756,52761,52768,52769,52772,52776,52784,52785,52787,
+52789,52824,52825,52828,52831,52832,52833,52840,52841,52843,52845,52852,52853,
+52856,52860,52868,52869,52871,52873,52880,52881,52884,52888,52896,52897,52899,
+52900,52901,52908,52909,52929,52964,52965,52968,52971,52972,52980,52981,52983,
+52984,52985,52992,52993,52996,53000,53008,53009,53011,53013,53020,53024,53028,
+53036,53037,53039,53040,53041,53048,53076,53077,53080,53084,53092,53093,53095,
+53097,53104,53105,53108,53112,53120,53125,53132,53153,53160,53168,53188,53216,
+53217,53220,53224,53232,53233,53235,53237,53244,53248,53252,53265,53272,53293,
+53300,53301,53304,53308,53316,53317,53319,53321,53328,53332,53336,53344,53356,
+53357,53360,53364,53372,53373,53377,53412,53413,53416,53420,53428,53429,53431,
+53433,53440,53441,53444,53448,53449,53456,53457,53459,53460,53461,53468,53469,
+53472,53476,53484,53485,53487,53488,53489,53496,53517,53552,53553,53556,53560,
+53562,53568,53569,53571,53572,53573,53580,53581,53584,53588,53596,53597,53599,
+53601,53608,53612,53628,53636,53640,53664,53665,53668,53672,53680,53681,53683,
+53685,53690,53692,53696,53720,53748,53752,53767,53769,53776,53804,53805,53808,
+53812,53820,53821,53823,53825,53832,53852,53860,53888,53889,53892,53896,53904,
+53905,53909,53916,53920,53924,53932,53937,53944,53945,53948,53951,53952,53954,
+53960,53961,53963,53972,53976,53980,53988,53989,54000,54001,54004,54008,54016,
+54017,54019,54021,54028,54029,54030,54032,54036,54038,54044,54045,54047,54048,
+54049,54053,54056,54057,54060,54064,54072,54073,54075,54076,54077,54084,54085,
+54140,54141,54144,54148,54156,54157,54159,54160,54161,54168,54169,54172,54176,
+54184,54185,54187,54189,54196,54200,54204,54212,54213,54216,54217,54224,54232,
+54241,54243,54252,54253,54256,54260,54268,54269,54271,54273,54280,54301,54336,
+54340,54364,54368,54372,54381,54383,54392,54393,54396,54399,54400,54402,54408,
+54409,54411,54413,54420,54441,54476,54480,54484,54492,54495,54504,54508,54512,
+54520,54523,54525,54532,54536,54540,54548,54549,54551,54588,54589,54592,54596,
+54604,54605,54607,54609,54616,54617,54620,54624,54629,54632,54633,54635,54637,
+54644,54645,54648,54652,54660,54661,54663,54664,54665,54672,54693,54728,54729,
+54732,54736,54738,54744,54745,54747,54749,54756,54757,54760,54764,54772,54773,
+54775,54777,54784,54785,54788,54792,54800,54801,54803,54804,54805,54812,54816,
+54820,54829,54840,54841,54844,54848,54853,54856,54857,54859,54861,54865,54868,
+54869,54872,54876,54887,54889,54896,54897,54900,54915,54917,54924,54925,54928,
+54932,54941,54943,54945,54952,54956,54960,54969,54971,54980,54981,54984,54988,
+54993,54996,54999,55001,55008,55012,55016,55024,55029,55036,55037,55040,55044,
+55057,55064,55065,55068,55072,55080,55081,55083,55085,55092,55093,55096,55100,
+55108,55111,55113,55120,55121,55124,55126,55127,55128,55129,55136,55137,55139,
+55141,55145,55148,55152,55156,55164,55165,55169,55176,55177,55180,55184,55192,
+55193,55195,55197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20285,20339,20551,20729,
+21152,21487,21621,21733,22025,23233,23478,26247,26550,26551,26607,27468,29634,
+30146,31292,33499,33540,34903,34952,35382,36040,36303,36603,36838,39381,21051,
+21364,21508,24682,24932,27580,29647,33050,35258,35282,38307,20355,21002,22718,
+22904,23014,24178,24185,25031,25536,26438,26604,26751,28567,30286,30475,30965,
+31240,31487,31777,32925,33390,33393,35563,38291,20075,21917,26359,28212,30883,
+31469,33883,35088,34638,38824,21208,22350,22570,23884,24863,25022,25121,25954,
+26577,27204,28187,29976,30131,30435,30640,32058,37039,37969,37970,40853,21283,
+23724,30002,32987,37440,38296,21083,22536,23004,23713,23831,24247,24378,24394,
+24951,27743,30074,30086,31968,32115,32177,32652,33108,33313,34193,35137,35611,
+37628,38477,40007,20171,20215,20491,20977,22607,24887,24894,24936,25913,27114,
+28433,30117,30342,30422,31623,33445,33995,63744,37799,38283,21888,23458,22353,
+63745,31923,32697,37301,20520,21435,23621,24040,25298,25454,25818,25831,28192,
+28844,31067,36317,36382,63746,36989,37445,37624,20094,20214,20581,24062,24314,
+24838,26967,33137,34388,36423,37749,39467,20062,20625,26480,26688,20745,21133,
+21138,27298,30652,37392,40660,21163,24623,36850,20552,25001,25581,25802,26684,
+27268,28608,33160,35233,38548,22533,29309,29356,29956,32121,32365,32937,35211,
+35700,36963,40273,25225,27770,28500,32080,32570,35363,20860,24906,31645,35609,
+37463,37772,20140,20435,20510,20670,20742,21185,21197,21375,22384,22659,24218,
+24465,24950,25004,25806,25964,26223,26299,26356,26775,28039,28805,28913,29855,
+29861,29898,30169,30828,30956,31455,31478,32069,32147,32789,32831,33051,33686,
+35686,36629,36885,37857,38915,38968,39514,39912,20418,21843,22586,22865,23395,
+23622,24760,25106,26690,26800,26856,28330,30028,30328,30926,31293,31995,32363,
+32380,35336,35489,35903,38542,40388,21476,21481,21578,21617,22266,22993,23396,
+23611,24235,25335,25911,25925,25970,26272,26543,27073,27837,30204,30352,30590,
+31295,32660,32771,32929,33167,33510,33533,33776,34241,34865,34996,35493,63747,
+36764,37678,38599,39015,39640,40723,21741,26011,26354,26767,31296,35895,40288,
+22256,22372,23825,26118,26801,26829,28414,29736,34974,39908,27752,63748,39592,
+20379,20844,20849,21151,23380,24037,24656,24685,25329,25511,25915,29657,31354,
+34467,36002,38799,20018,23521,25096,26524,29916,31185,33747,35463,35506,36328,
+36942,37707,38982,24275,27112,34303,37101,63749,20896,23448,23532,24931,26874,
+27454,28748,29743,29912,31649,32592,33733,35264,36011,38364,39208,21038,24669,
+25324,36866,20362,20809,21281,22745,24291,26336,27960,28826,29378,29654,31568,
+33009,37979,21350,25499,32619,20054,20608,22602,22750,24618,24871,25296,27088,
+39745,23439,32024,32945,36703,20132,20689,21676,21932,23308,23968,24039,25898,
+25934,26657,27211,29409,30350,30703,32094,32761,33184,34126,34527,36611,36686,
+37066,39171,39509,39851,19992,20037,20061,20167,20465,20855,21246,21312,21475,
+21477,21646,22036,22389,22434,23495,23943,24272,25084,25304,25937,26552,26601,
+27083,27472,27590,27628,27714,28317,28792,29399,29590,29699,30655,30697,31350,
+32127,32777,33276,33285,33290,33503,34914,35635,36092,36544,36881,37041,37476,
+37558,39378,39493,40169,40407,40860,22283,23616,33738,38816,38827,40628,21531,
+31384,32676,35033,36557,37089,22528,23624,25496,31391,23470,24339,31353,31406,
+33422,36524,20518,21048,21240,21367,22280,25331,25458,27402,28099,30519,21413,
+29527,34152,36470,38357,26426,27331,28528,35437,36556,39243,63750,26231,27512,
+36020,39740,63751,21483,22317,22862,25542,27131,29674,30789,31418,31429,31998,
+33909,35215,36211,36917,38312,21243,22343,30023,31584,33740,37406,63752,27224,
+20811,21067,21127,25119,26840,26997,38553,20677,21156,21220,25027,26020,26681,
+27135,29822,31563,33465,33771,35250,35641,36817,39241,63753,20170,22935,25810,
+26129,27278,29748,31105,31165,33449,34942,34943,35167,63754,37670,20235,21450,
+24613,25201,27762,32026,32102,20120,20834,30684,32943,20225,20238,20854,20864,
+21980,22120,22331,22522,22524,22804,22855,22931,23492,23696,23822,24049,24190,
+24524,25216,26071,26083,26398,26399,26462,26827,26820,27231,27450,27683,27773,
+27778,28103,29592,29734,29738,29826,29859,30072,30079,30849,30959,31041,31047,
+31048,31098,31637,32000,32186,32648,32774,32813,32908,35352,35663,35912,36215,
+37665,37668,39138,39249,39438,39439,39525,40594,32202,20342,21513,25326,26708,
+37329,21931,20794,63755,63756,23068,25062,63757,25295,25343,63758,63759,63760,
+63761,63762,63763,37027,63764,63765,63766,63767,63768,35582,63769,63770,63771,
+63772,26262,63773,29014,63774,63775,38627,63776,25423,25466,21335,63777,26511,
+26976,28275,63778,30007,63779,63780,63781,32013,63782,63783,34930,22218,23064,
+63784,63785,63786,63787,63788,20035,63789,20839,22856,26608,32784,63790,22899,
+24180,25754,31178,24565,24684,25288,25467,23527,23511,21162,63791,22900,24361,
+24594,63792,63793,63794,29785,63795,63796,63797,63798,63799,63800,39377,63801,
+63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,28611,63812,63813,
+33215,36786,24817,63814,63815,33126,63816,63817,23615,63818,63819,63820,63821,
+63822,63823,63824,63825,23273,35365,26491,32016,63826,63827,63828,63829,63830,
+63831,33021,63832,63833,23612,27877,21311,28346,22810,33590,20025,20150,20294,
+21934,22296,22727,24406,26039,26086,27264,27573,28237,30701,31471,31774,32222,
+34507,34962,37170,37723,25787,28606,29562,30136,36948,21846,22349,25018,25812,
+26311,28129,28251,28525,28601,30192,32835,33213,34113,35203,35527,35674,37663,
+27795,30035,31572,36367,36957,21776,22530,22616,24162,25095,25758,26848,30070,
+31958,34739,40680,20195,22408,22382,22823,23565,23729,24118,24453,25140,25825,
+29619,33274,34955,36024,38538,40667,23429,24503,24755,20498,20992,21040,22294,
+22581,22615,23566,23648,23798,23947,24230,24466,24764,25361,25481,25623,26691,
+26873,27330,28120,28193,28372,28644,29182,30428,30585,31153,31291,33796,35241,
+36077,36339,36424,36867,36884,36947,37117,37709,38518,38876,27602,28678,29272,
+29346,29544,30563,31167,31716,32411,35712,22697,24775,25958,26109,26302,27788,
+28958,29129,35930,38931,20077,31361,20189,20908,20941,21205,21516,24999,26481,
+26704,26847,27934,28540,30140,30643,31461,33012,33891,37509,20828,26007,26460,
+26515,30168,31431,33651,63834,35910,36887,38957,23663,33216,33434,36929,36975,
+37389,24471,23965,27225,29128,30331,31561,34276,35588,37159,39472,21895,25078,
+63835,30313,32645,34367,34746,35064,37007,63836,27931,28889,29662,32097,33853,
+63837,37226,39409,63838,20098,21365,27396,27410,28734,29211,34349,40478,21068,
+36771,23888,25829,25900,27414,28651,31811,32412,34253,35172,35261,25289,33240,
+34847,24266,26391,28010,29436,29701,29807,34690,37086,20358,23821,24480,33802,
+20919,25504,30053,20142,20486,20841,20937,26753,27153,31918,31921,31975,33391,
+35538,36635,37327,20406,20791,21237,21570,24300,24942,25150,26053,27354,28670,
+31018,34268,34851,38317,39522,39530,40599,40654,21147,26310,27511,28701,31019,
+36706,38722,24976,25088,25891,28451,29001,29833,32244,32879,34030,36646,36899,
+37706,20925,21015,21155,27916,28872,35010,24265,25986,27566,28610,31806,29557,
+20196,20278,22265,63839,23738,23994,24604,29618,31533,32666,32718,32838,36894,
+37428,38646,38728,38936,40801,20363,28583,31150,37300,38583,21214,63840,25736,
+25796,27347,28510,28696,29200,30439,32769,34310,34396,36335,36613,38706,39791,
+40442,40565,30860,31103,32160,33737,37636,40575,40595,35542,22751,24324,26407,
+28711,29903,31840,32894,20769,28712,29282,30922,36034,36058,36084,38647,20102,
+20698,23534,24278,26009,29134,30274,30637,32842,34044,36988,39719,40845,22744,
+23105,23650,27155,28122,28431,30267,32047,32311,34078,35128,37860,38475,21129,
+26066,26611,27060,27969,28316,28687,29705,29792,30041,30244,30827,35628,39006,
+20845,25134,38520,20374,20523,23833,28138,32184,36650,24459,24900,26647,63841,
+38534,21202,32907,20956,20940,26974,31260,32190,33777,38517,20442,21033,21400,
+21519,21774,23653,24743,26446,26792,28012,29313,29432,29702,29827,63842,30178,
+31852,32633,32696,33673,35023,35041,37324,37328,38626,39881,21533,28542,29136,
+29848,34298,36522,38563,40023,40607,26519,28107,29747,33256,38678,30764,31435,
+31520,31890,25705,29802,30194,30908,30952,39340,39764,40635,23518,24149,28448,
+33180,33707,37000,19975,21325,23081,24018,24398,24930,25405,26217,26364,28415,
+28459,28771,30622,33836,34067,34875,36627,39237,39995,21788,25273,26411,27819,
+33545,35178,38778,20129,22916,24536,24537,26395,32178,32596,33426,33579,33725,
+36638,37017,22475,22969,23186,23504,26151,26522,26757,27599,29028,32629,36023,
+36067,36993,39749,33032,35978,38476,39488,40613,23391,27667,29467,30450,30431,
+33804,20906,35219,20813,20885,21193,26825,27796,30468,30496,32191,32236,38754,
+40629,28357,34065,20901,21517,21629,26126,26269,26919,28319,30399,30609,33559,
+33986,34719,37225,37528,40180,34946,20398,20882,21215,22982,24125,24917,25720,
+25721,26286,26576,27169,27597,27611,29279,29281,29761,30520,30683,32791,33468,
+33541,35584,35624,35980,26408,27792,29287,30446,30566,31302,40361,27519,27794,
+22818,26406,33945,21359,22675,22937,24287,25551,26164,26483,28218,29483,31447,
+33495,37672,21209,24043,25006,25035,25098,25287,25771,26080,26969,27494,27595,
+28961,29687,30045,32326,33310,33538,34154,35491,36031,38695,40289,22696,40664,
+20497,21006,21563,21839,25991,27766,32010,32011,32862,34442,38272,38639,21247,
+27797,29289,21619,23194,23614,23883,24396,24494,26410,26806,26979,28220,28228,
+30473,31859,32654,34183,35598,36855,38753,40692,23735,24758,24845,25003,25935,
+26107,26108,27665,27887,29599,29641,32225,38292,23494,34588,35600,21085,21338,
+25293,25615,25778,26420,27192,27850,29632,29854,31636,31893,32283,33162,33334,
+34180,36843,38649,39361,20276,21322,21453,21467,25292,25644,25856,26001,27075,
+27886,28504,29677,30036,30242,30436,30460,30928,30971,31020,32070,33324,34784,
+36820,38930,39151,21187,25300,25765,28196,28497,30332,36299,37297,37474,39662,
+39747,20515,20621,22346,22952,23592,24135,24439,25151,25918,26041,26049,26121,
+26507,27036,28354,30917,32033,32938,33152,33323,33459,33953,34444,35370,35607,
+37030,38450,40848,20493,20467,63843,22521,24472,25308,25490,26479,28227,28953,
+30403,32972,32986,35060,35061,35097,36064,36649,37197,38506,20271,20336,24091,
+26575,26658,30333,30334,39748,24161,27146,29033,29140,30058,63844,32321,34115,
+34281,39132,20240,31567,32624,38309,20961,24070,26805,27710,27726,27867,29359,
+31684,33539,27861,29754,20731,21128,22721,25816,27287,29863,30294,30887,34327,
+38370,38713,63845,21342,24321,35722,36776,36783,37002,21029,30629,40009,40712,
+19993,20482,20853,23643,24183,26142,26170,26564,26821,28851,29953,30149,31177,
+31453,36647,39200,39432,20445,22561,22577,23542,26222,27493,27921,28282,28541,
+29668,29995,33769,35036,35091,35676,36628,20239,20693,21264,21340,23443,24489,
+26381,31119,33145,33583,34068,35079,35206,36665,36667,39333,39954,26412,20086,
+20472,22857,23553,23791,23792,25447,26834,28925,29090,29739,32299,34028,34562,
+36898,37586,40179,19981,20184,20463,20613,21078,21103,21542,21648,22496,22827,
+23142,23386,23413,23500,24220,63846,25206,25975,26023,28014,28325,29238,31526,
+31807,32566,33104,33105,33178,33344,33433,33705,35331,36000,36070,36091,36212,
+36282,37096,37340,38428,38468,39385,40167,21271,20998,21545,22132,22707,22868,
+22894,24575,24996,25198,26128,27774,28954,30406,31881,31966,32027,33452,36033,
+38640,63847,20315,24343,24447,25282,23849,26379,26842,30844,32323,40300,19989,
+20633,21269,21290,21329,22915,23138,24199,24754,24970,25161,25209,26000,26503,
+27047,27604,27606,27607,27608,27832,63848,29749,30202,30738,30865,31189,31192,
+31875,32203,32737,32933,33086,33218,33778,34586,35048,35513,35692,36027,37145,
+38750,39131,40763,22188,23338,24428,25996,27315,27567,27996,28657,28693,29277,
+29613,36007,36051,38971,24977,27703,32856,39425,20045,20107,20123,20181,20282,
+20284,20351,20447,20735,21490,21496,21766,21987,22235,22763,22882,23057,23531,
+23546,23556,24051,24107,24473,24605,25448,26012,26031,26614,26619,26797,27515,
+27801,27863,28195,28681,29509,30722,31038,31040,31072,31169,31721,32023,32114,
+32902,33293,33678,34001,34503,35039,35408,35422,35613,36060,36198,36781,37034,
+39164,39391,40605,21066,63849,26388,63850,20632,21034,23665,25955,27733,29642,
+29987,30109,31639,33948,37240,38704,20087,25746,27578,29022,34217,19977,63851,
+26441,26862,28183,33439,34072,34923,25591,28545,37394,39087,19978,20663,20687,
+20767,21830,21930,22039,23360,23577,23776,24120,24202,24224,24258,24819,26705,
+27233,28248,29245,29248,29376,30456,31077,31665,32724,35059,35316,35443,35937,
+36062,38684,22622,29885,36093,21959,63852,31329,32034,33394,29298,29983,29989,
+63853,31513,22661,22779,23996,24207,24246,24464,24661,25234,25471,25933,26257,
+26329,26360,26646,26866,29312,29790,31598,32110,32214,32626,32997,33298,34223,
+35199,35475,36893,37604,40653,40736,22805,22893,24109,24796,26132,26227,26512,
+27728,28101,28511,30707,30889,33990,37323,37675,20185,20682,20808,21892,23307,
+23459,25159,25982,26059,28210,29053,29697,29764,29831,29887,30316,31146,32218,
+32341,32680,33146,33203,33337,34330,34796,35445,36323,36984,37521,37925,39245,
+39854,21352,23633,26964,27844,27945,28203,33292,34203,35131,35373,35498,38634,
+40807,21089,26297,27570,32406,34814,36109,38275,38493,25885,28041,29166,63854,
+22478,22995,23468,24615,24826,25104,26143,26207,29481,29689,30427,30465,31596,
+32854,32882,33125,35488,37266,19990,21218,27506,27927,31237,31545,32048,63855,
+36016,21484,22063,22609,23477,23567,23569,24034,25152,25475,25620,26157,26803,
+27836,28040,28335,28703,28836,29138,29990,30095,30094,30233,31505,31712,31787,
+32032,32057,34092,34157,34311,35380,36877,36961,37045,37559,38902,39479,20439,
+23660,26463,28049,31903,32396,35606,36118,36895,23403,24061,25613,33984,36956,
+39137,29575,23435,24730,26494,28126,35359,35494,36865,38924,21047,63856,28753,
+30862,37782,34928,37335,20462,21463,22013,22234,22402,22781,23234,23432,23723,
+23744,24101,24833,25101,25163,25480,25628,25910,25976,27193,27530,27700,27929,
+28465,29159,29417,29560,29703,29874,30246,30561,31168,31319,31466,31929,32143,
+32172,32353,32670,33065,33585,33936,34010,34282,34966,35504,35728,36664,36930,
+36995,37228,37526,37561,38539,38567,38568,38614,38656,38920,39318,39635,39706,
+21460,22654,22809,23408,23487,28113,28506,29087,29729,29881,32901,33789,24033,
+24455,24490,24642,26092,26642,26991,27219,27529,27957,28147,29667,30462,30636,
+31565,32020,33059,33308,33600,34036,34147,35426,35524,37255,37662,38918,39348,
+25100,34899,36848,37477,23815,23847,23913,29791,33181,34664,28629,25342,32722,
+35126,35186,19998,20056,20711,21213,21319,25215,26119,32361,34821,38494,20365,
+21273,22070,22987,23204,23608,23630,23629,24066,24337,24643,26045,26159,26178,
+26558,26612,29468,30690,31034,32709,33940,33997,35222,35430,35433,35553,35925,
+35962,22516,23508,24335,24687,25325,26893,27542,28252,29060,31698,34645,35672,
+36606,39135,39166,20280,20353,20449,21627,23072,23480,24892,26032,26216,29180,
+30003,31070,32051,33102,33251,33688,34218,34254,34563,35338,36523,36763,63857,
+36805,22833,23460,23526,24713,23529,23563,24515,27777,63858,28145,28683,29978,
+33455,35574,20160,21313,63859,38617,27663,20126,20420,20818,21854,23077,23784,
+25105,29273,33469,33706,34558,34905,35357,38463,38597,39187,40201,40285,22538,
+23731,23997,24132,24801,24853,25569,27138,28197,37122,37716,38990,39952,40823,
+23433,23736,25353,26191,26696,30524,38593,38797,38996,39839,26017,35585,36555,
+38332,21813,23721,24022,24245,26263,30284,33780,38343,22739,25276,29390,40232,
+20208,22830,24591,26171,27523,31207,40230,21395,21696,22467,23830,24859,26326,
+28079,30861,33406,38552,38724,21380,25212,25494,28082,32266,33099,38989,27387,
+32588,40367,40474,20063,20539,20918,22812,24825,25590,26928,29242,32822,63860,
+37326,24369,63861,63862,32004,33509,33903,33979,34277,36493,63863,20335,63864,
+63865,22756,23363,24665,25562,25880,25965,26264,63866,26954,27171,27915,28673,
+29036,30162,30221,31155,31344,63867,32650,63868,35140,63869,35731,37312,38525,
+63870,39178,22276,24481,26044,28417,30208,31142,35486,39341,39770,40812,20740,
+25014,25233,27277,33222,20547,22576,24422,28937,35328,35578,23420,34326,20474,
+20796,22196,22852,25513,28153,23978,26989,20870,20104,20313,63871,63872,63873,
+22914,63874,63875,27487,27741,63876,29877,30998,63877,33287,33349,33593,36671,
+36701,63878,39192,63879,63880,63881,20134,63882,22495,24441,26131,63883,63884,
+30123,32377,35695,63885,36870,39515,22181,22567,23032,23071,23476,63886,24310,
+63887,63888,25424,25403,63889,26941,27783,27839,28046,28051,28149,28436,63890,
+28895,28982,29017,63891,29123,29141,63892,30799,30831,63893,31605,32227,63894,
+32303,63895,34893,36575,63896,63897,63898,37467,63899,40182,63900,63901,63902,
+24709,28037,63903,29105,63904,63905,38321,21421,63906,63907,63908,26579,63909,
+28814,28976,29744,33398,33490,63910,38331,39653,40573,26308,63911,29121,33865,
+63912,63913,22603,63914,63915,23992,24433,63916,26144,26254,27001,27054,27704,
+27891,28214,28481,28634,28699,28719,29008,29151,29552,63917,29787,63918,29908,
+30408,31310,32403,63919,63920,33521,35424,36814,63921,37704,63922,38681,63923,
+63924,20034,20522,63925,21000,21473,26355,27757,28618,29450,30591,31330,33454,
+34269,34306,63926,35028,35427,35709,35947,63927,37555,63928,38675,38928,20116,
+20237,20425,20658,21320,21566,21555,21978,22626,22714,22887,23067,23524,24735,
+63929,25034,25942,26111,26212,26791,27738,28595,28879,29100,29522,31613,34568,
+35492,39986,40711,23627,27779,29508,29577,37434,28331,29797,30239,31337,32277,
+34314,20800,22725,25793,29934,29973,30320,32705,37013,38605,39252,28198,29926,
+31401,31402,33253,34521,34680,35355,23113,23436,23451,26785,26880,28003,29609,
+29715,29740,30871,32233,32747,33048,33109,33694,35916,38446,38929,26352,24448,
+26106,26505,27754,29579,20525,23043,27498,30702,22806,23916,24013,29477,30031,
+63930,63931,20709,20985,22575,22829,22934,23002,23525,63932,63933,23970,25303,
+25622,25747,25854,63934,26332,63935,27208,63936,29183,29796,63937,31368,31407,
+32327,32350,32768,33136,63938,34799,35201,35616,36953,63939,36992,39250,24958,
+27442,28020,32287,35109,36785,20433,20653,20887,21191,22471,22665,23481,24248,
+24898,27029,28044,28263,28342,29076,29794,29992,29996,32883,33592,33993,36362,
+37780,37854,63940,20110,20305,20598,20778,21448,21451,21491,23431,23507,23588,
+24858,24962,26100,29275,29591,29760,30402,31056,31121,31161,32006,32701,33419,
+34261,34398,36802,36935,37109,37354,38533,38632,38633,21206,24423,26093,26161,
+26671,29020,31286,37057,38922,20113,63941,27218,27550,28560,29065,32792,33464,
+34131,36939,38549,38642,38907,34074,39729,20112,29066,38596,20803,21407,21729,
+22291,22290,22435,23195,23236,23491,24616,24895,25588,27781,27961,28274,28304,
+29232,29503,29783,33489,34945,36677,36960,63942,38498,39000,40219,26376,36234,
+37470,20301,20553,20702,21361,22285,22996,23041,23561,24944,26256,28205,29234,
+29771,32239,32963,33806,33894,34111,34655,34907,35096,35586,36949,38859,39759,
+20083,20369,20754,20842,63943,21807,21929,23418,23461,24188,24189,24254,24736,
+24799,24840,24841,25540,25912,26377,63944,26580,26586,63945,26977,26978,27833,
+27943,63946,28216,63947,28641,29494,29495,63948,29788,30001,63949,30290,63950,
+63951,32173,33278,33848,35029,35480,35547,35565,36400,36418,36938,36926,36986,
+37193,37321,37742,63952,63953,22537,63954,27603,32905,32946,63955,63956,20801,
+22891,23609,63957,63958,28516,29607,32996,36103,63959,37399,38287,63960,63961,
+63962,63963,32895,25102,28700,32104,34701,63964,22432,24681,24903,27575,35518,
+37504,38577,20057,21535,28139,34093,38512,38899,39150,25558,27875,37009,20957,
+25033,33210,40441,20381,20506,20736,23452,24847,25087,25836,26885,27589,30097,
+30691,32681,33380,34191,34811,34915,35516,35696,37291,20108,20197,20234,63965,
+63966,22839,23016,63967,24050,24347,24411,24609,63968,63969,63970,63971,29246,
+29669,63972,30064,30157,63973,31227,63974,32780,32819,32900,33505,33617,63975,
+63976,36029,36019,36999,63977,63978,39156,39180,63979,63980,28727,30410,32714,
+32716,32764,35610,20154,20161,20995,21360,63981,21693,22240,23035,23493,24341,
+24525,28270,63982,63983,32106,33589,63984,34451,35469,63985,38765,38775,63986,
+63987,19968,20314,20350,22777,26085,28322,36920,37808,39353,20219,22764,22922,
+23001,24641,63988,63989,31252,63990,33615,36035,20837,21316,63991,63992,63993,
+20173,21097,23381,33471,20180,21050,21672,22985,23039,23376,23383,23388,24675,
+24904,28363,28825,29038,29574,29943,30133,30913,32043,32773,33258,33576,34071,
+34249,35566,36039,38604,20316,21242,22204,26027,26152,28796,28856,29237,32189,
+33421,37196,38592,40306,23409,26855,27544,28538,30430,23697,26283,28507,31668,
+31786,34870,38620,19976,20183,21280,22580,22715,22767,22892,23559,24115,24196,
+24373,25484,26290,26454,27167,27299,27404,28479,29254,63994,29520,29835,31456,
+31911,33144,33247,33255,33674,33900,34083,34196,34255,35037,36115,37292,38263,
+38556,20877,21705,22312,23472,25165,26448,26685,26771,28221,28371,28797,32289,
+35009,36001,36617,40779,40782,29229,31631,35533,37658,20295,20302,20786,21632,
+22992,24213,25269,26485,26990,27159,27822,28186,29401,29482,30141,31672,32053,
+33511,33785,33879,34295,35419,36015,36487,36889,37048,38606,40799,21219,21514,
+23265,23490,25688,25973,28404,29380,63995,30340,31309,31515,31821,32318,32735,
+33659,35627,36042,36196,36321,36447,36842,36857,36969,37841,20291,20346,20659,
+20840,20856,21069,21098,22625,22652,22880,23560,23637,24283,24731,25136,26643,
+27583,27656,28593,29006,29728,30000,30008,30033,30322,31564,31627,31661,31686,
+32399,35438,36670,36681,37439,37523,37666,37931,38651,39002,39019,39198,20999,
+25130,25240,27993,30308,31434,31680,32118,21344,23742,24215,28472,28857,31896,
+38673,39822,40670,25509,25722,34678,19969,20117,20141,20572,20597,21576,22979,
+23450,24128,24237,24311,24449,24773,25402,25919,25972,26060,26230,26232,26622,
+26984,27273,27491,27712,28096,28136,28191,28254,28702,28833,29582,29693,30010,
+30555,30855,31118,31243,31357,31934,32142,33351,35330,35562,35998,37165,37194,
+37336,37478,37580,37664,38662,38742,38748,38914,40718,21046,21137,21884,22564,
+24093,24351,24716,25552,26799,28639,31085,31532,33229,34234,35069,35576,36420,
+37261,38500,38555,38717,38988,40778,20430,20806,20939,21161,22066,24340,24427,
+25514,25805,26089,26177,26362,26361,26397,26781,26839,27133,28437,28526,29031,
+29157,29226,29866,30522,31062,31066,31199,31264,31381,31895,31967,32068,32368,
+32903,34299,34468,35412,35519,36249,36481,36896,36973,37347,38459,38613,40165,
+26063,31751,36275,37827,23384,23562,21330,25305,29469,20519,23447,24478,24752,
+24939,26837,28121,29742,31278,32066,32156,32305,33131,36394,36405,37758,37912,
+20304,22352,24038,24231,25387,32618,20027,20303,20367,20570,23005,32964,21610,
+21608,22014,22863,23449,24030,24282,26205,26417,26609,26666,27880,27954,28234,
+28557,28855,29664,30087,31820,32002,32044,32162,33311,34523,35387,35461,36208,
+36490,36659,36913,37198,37202,37956,39376,31481,31909,20426,20737,20934,22472,
+23535,23803,26201,27197,27994,28310,28652,28940,30063,31459,34850,36897,36981,
+38603,39423,33537,20013,20210,34886,37325,21373,27355,26987,27713,33914,22686,
+24974,26366,25327,28893,29969,30151,32338,33976,35657,36104,20043,21482,21675,
+22320,22336,24535,25345,25351,25711,25903,26088,26234,26525,26547,27490,27744,
+27802,28460,30693,30757,31049,31063,32025,32930,33026,33267,33437,33463,34584,
+35468,63996,36100,36286,36978,30452,31257,31287,32340,32887,21767,21972,22645,
+25391,25634,26185,26187,26733,27035,27524,27941,28337,29645,29800,29857,30043,
+30137,30433,30494,30603,31206,32265,32285,33275,34095,34967,35386,36049,36587,
+36784,36914,37805,38499,38515,38663,20356,21489,23018,23241,24089,26702,29894,
+30142,31209,31378,33187,34541,36074,36300,36845,26015,26389,63997,22519,28503,
+32221,36655,37878,38598,24501,25074,28548,19988,20376,20511,21449,21983,23919,
+24046,27425,27492,30923,31642,63998,36425,36554,36974,25417,25662,30528,31364,
+37679,38015,40810,25776,28591,29158,29864,29914,31428,31762,32386,31922,32408,
+35738,36106,38013,39184,39244,21049,23519,25830,26413,32046,20717,21443,22649,
+24920,24921,25082,26028,31449,35730,35734,20489,20513,21109,21809,23100,24288,
+24432,24884,25950,26124,26166,26274,27085,28356,28466,29462,30241,31379,33081,
+33369,33750,33980,20661,22512,23488,23528,24425,25505,30758,32181,33756,34081,
+37319,37365,20874,26613,31574,36012,20932,22971,24765,34389,20508,63999,21076,
+23610,24957,25114,25299,25842,26021,28364,30240,33034,36448,38495,38587,20191,
+21315,21912,22825,24029,25797,27849,28154,29588,31359,33307,34214,36068,36368,
+36983,37351,38369,38433,38854,20984,21746,21894,24505,25764,28552,32180,36639,
+36685,37941,20681,23574,27838,28155,29979,30651,31805,31844,35449,35522,22558,
+22974,24086,25463,29266,30090,30571,35548,36028,36626,24307,26228,28152,32893,
+33729,35531,38737,39894,64000,21059,26367,28053,28399,32224,35558,36910,36958,
+39636,21021,21119,21736,24980,25220,25307,26786,26898,26970,27189,28818,28966,
+30813,30977,30990,31186,31245,32918,33400,33493,33609,34121,35970,36229,37218,
+37259,37294,20419,22225,29165,30679,34560,35320,23544,24534,26449,37032,21474,
+22618,23541,24740,24961,25696,32317,32880,34085,37507,25774,20652,23828,26368,
+22684,25277,25512,26894,27000,27166,28267,30394,31179,33467,33833,35535,36264,
+36861,37138,37195,37276,37648,37656,37786,38619,39478,39949,19985,30044,31069,
+31482,31569,31689,32302,33988,36441,36468,36600,36880,26149,26943,29763,20986,
+26414,40668,20805,24544,27798,34802,34909,34935,24756,33205,33795,36101,21462,
+21561,22068,23094,23601,28810,32736,32858,33030,33261,36259,37257,39519,40434,
+20596,20164,21408,24827,28204,23652,20360,20516,21988,23769,24159,24677,26772,
+27835,28100,29118,30164,30196,30305,31258,31305,32199,32251,32622,33268,34473,
+36636,38601,39347,40786,21063,21189,39149,35242,19971,26578,28422,20405,23522,
+26517,27784,28024,29723,30759,37341,37756,34756,31204,31281,24555,20182,21668,
+21822,22702,22949,24816,25171,25302,26422,26965,33333,38464,39345,39389,20524,
+21331,21828,22396,64001,25176,64002,25826,26219,26589,28609,28655,29730,29752,
+35351,37944,21585,22022,22374,24392,24986,27470,28760,28845,32187,35477,22890,
+33067,25506,30472,32829,36010,22612,25645,27067,23445,24081,28271,64003,34153,
+20812,21488,22826,24608,24907,27526,27760,27888,31518,32974,33492,36294,37040,
+39089,64004,25799,28580,25745,25860,20814,21520,22303,35342,24927,26742,64005,
+30171,31570,32113,36890,22534,27084,33151,35114,36864,38969,20600,22871,22956,
+25237,36879,39722,24925,29305,38358,22369,23110,24052,25226,25773,25850,26487,
+27874,27966,29228,29750,30772,32631,33453,36315,38935,21028,22338,26495,29256,
+29923,36009,36774,37393,38442,20843,21485,25420,20329,21764,24726,25943,27803,
+28031,29260,29437,31255,35207,35997,24429,28558,28921,33192,24846,20415,20559,
+25153,29255,31687,32232,32745,36941,38829,39449,36022,22378,24179,26544,33805,
+35413,21536,23318,24163,24290,24330,25987,32954,34109,38281,38491,20296,21253,
+21261,21263,21638,21754,22275,24067,24598,25243,25265,25429,64006,27873,28006,
+30129,30770,32990,33071,33502,33889,33970,34957,35090,36875,37610,39165,39825,
+24133,26292,26333,28689,29190,64007,20469,21117,24426,24915,26451,27161,28418,
+29922,31080,34920,35961,39111,39108,39491,21697,31263,26963,35575,35914,39080,
+39342,24444,25259,30130,30382,34987,36991,38466,21305,24380,24517,27852,29644,
+30050,30091,31558,33534,39325,20047,36924,19979,20309,21414,22799,24264,26160,
+27827,29781,33655,34662,36032,36944,38686,39957,22737,23416,34384,35604,40372,
+23506,24680,24717,26097,27735,28450,28579,28698,32597,32752,38289,38290,38480,
+38867,21106,36676,20989,21547,21688,21859,21898,27323,28085,32216,33382,37532,
+38519,40569,21512,21704,30418,34532,38308,38356,38492,20130,20233,23022,23270,
+24055,24658,25239,26477,26689,27782,28207,32568,32923,33322,64008,64009,38917,
+20133,20565,21683,22419,22874,23401,23475,25032,26999,28023,28707,34809,35299,
+35442,35559,36994,39405,39608,21182,26680,20502,24184,26447,33607,34892,20139,
+21521,22190,29670,37141,38911,39177,39255,39321,22099,22687,34395,35377,25010,
+27382,29563,36562,27463,38570,39511,22869,29184,36203,38761,20436,23796,24358,
+25080,26203,27883,28843,29572,29625,29694,30505,30541,32067,32098,32291,33335,
+34898,64010,36066,37449,39023,23377,31348,34880,38913,23244,20448,21332,22846,
+23805,25406,28025,29433,33029,33031,33698,37583,38960,20136,20804,21009,22411,
+24418,27842,28366,28677,28752,28847,29074,29673,29801,33610,34722,34913,36872,
+37026,37795,39336,20846,24407,24800,24935,26291,34137,36426,37295,38795,20046,
+20114,21628,22741,22778,22909,23733,24359,25142,25160,26122,26215,27627,28009,
+28111,28246,28408,28564,28640,28649,28765,29392,29733,29786,29920,30355,31068,
+31946,32286,32993,33446,33899,33983,34382,34399,34676,35703,35946,37804,38912,
+39013,24785,25110,37239,23130,26127,28151,28222,29759,39746,24573,24794,31503,
+21700,24344,27742,27859,27946,28888,32005,34425,35340,40251,21270,21644,23301,
+27194,28779,30069,31117,31166,33457,33775,35441,35649,36008,38772,64011,25844,
+25899,30906,30907,31339,20024,21914,22864,23462,24187,24739,25563,27489,26213,
+26707,28185,29029,29872,32008,36996,39529,39973,27963,28369,29502,35905,38346,
+20976,24140,24488,24653,24822,24880,24908,26179,26180,27045,27841,28255,28361,
+28514,29004,29852,30343,31681,31783,33618,34647,36945,38541,40643,21295,22238,
+24315,24458,24674,24724,25079,26214,26371,27292,28142,28590,28784,29546,32362,
+33214,33588,34516,35496,36036,21123,29554,23446,27243,37892,21742,22150,23389,
+25928,25989,26313,26783,28045,28102,29243,32948,37237,39501,20399,20505,21402,
+21518,21564,21897,21957,24127,24460,26429,29030,29661,36869,21211,21235,22628,
+22734,28932,29071,29179,34224,35347,26248,34216,21927,26244,29002,33841,21321,
+21913,27585,24409,24509,25582,26249,28999,35569,36637,40638,20241,25658,28875,
+30054,34407,24676,35662,40440,20807,20982,21256,27958,33016,40657,26133,27427,
+28824,30165,21507,23673,32007,35350,27424,27453,27462,21560,24688,27965,32725,
+33288,20694,20958,21916,22123,22221,23020,23305,24076,24985,24984,25137,26206,
+26342,29081,29113,29114,29351,31143,31232,32690,35440,
diff --git a/sources/android/support/src/musl-locale/langinfo.c b/sources/android/support/src/musl-locale/langinfo.c
index 9f56c5d..6a7c461 100644
--- a/sources/android/support/src/musl-locale/langinfo.c
+++ b/sources/android/support/src/musl-locale/langinfo.c
@@ -25,8 +25,8 @@
 static const char c_messages[] = "^[yY]\0" "^[nN]";
 static const char c_numeric[] = ".\0" "";
 
-// Android: this was __langinfo in musl.
-char *nl_langinfo(nl_item item)
+// Android: this was __nl_langinfo_l in musl.
+char *nl_langinfo_l(nl_item item, locale_t loc)
 {
 	int cat = item >> 16;
 	int idx = item & 65535;
@@ -58,3 +58,12 @@
 	for (; idx; idx--, str++) for (; *str; str++);
 	return (char *)str;
 }
+
+// Android: this was __nl_langinfo in musl
+char *nl_langinfo(nl_item item)
+{
+	return nl_langinfo_l(item, 0);
+}
+
+weak_alias(__nl_langinfo, nl_langinfo);
+weak_alias(__nl_langinfo_l, nl_langinfo_l);
diff --git a/sources/android/support/src/musl-locale/legacychars.h b/sources/android/support/src/musl-locale/legacychars.h
index 4ddbaeb..914ad0d 100644
--- a/sources/android/support/src/musl-locale/legacychars.h
+++ b/sources/android/support/src/musl-locale/legacychars.h
@@ -1,39 +1,41 @@
-0,1,160,167,168,169,175,176,178,183,184,198,215,216,230,247,248,256,257,258,
-259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,278,279,
-280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,
-299,302,303,304,305,308,309,310,311,312,313,314,315,316,317,318,321,322,323,
-324,325,326,327,328,330,331,332,333,336,337,338,339,340,341,342,343,344,345,
-346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,
-365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,402,
-416,417,431,432,536,537,538,539,710,711,728,729,731,732,733,768,769,771,777,
-803,890,900,901,902,904,905,906,908,910,911,912,913,914,915,916,917,918,919,
-920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,
-940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,
-959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,1025,1026,
-1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1038,1039,1040,1041,1042,
-1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,
-1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,
-1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,
-1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,
-1103,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1118,1119,
-1168,1169,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1467,1468,1469,
-1470,1471,1472,1473,1474,1475,1488,1489,1490,1491,1492,1493,1494,1495,1496,
-1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,
-1512,1513,1514,1520,1521,1522,1523,1524,1548,1563,1567,1569,1570,1571,1572,
-1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,
-1588,1589,1590,1591,1592,1593,1594,1600,1601,1602,1603,1604,1605,1606,1607,
-1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1657,1662,1670,1672,
-1681,1688,1705,1711,1722,1726,1729,1746,3585,3586,3587,3588,3589,3590,3591,
-3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,
-3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,
-3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,
-3637,3638,3639,3640,3641,3642,3647,3648,3649,3650,3651,3652,3653,3654,3655,
-3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,
-3671,3672,3673,3674,3675,7682,7683,7690,7691,7710,7711,7744,7745,7766,7767,
-7776,7777,7786,7787,7808,7809,7810,7811,7812,7813,7922,7923,8204,8205,8206,
-8207,8211,8212,8213,8215,8216,8217,8218,8220,8221,8222,8224,8225,8226,8230,
-8240,8249,8250,8362,8363,8364,8367,8470,8482,8729,8730,8776,8804,8805,8992,
-8993,9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9552,9553,9554,
-9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,
-9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9600,9604,9608,9612,
-9616,9617,9618,9619,9632,
+0,1,160,167,168,169,175,176,178,183,184,198,215,216,230,247,248,162,163,165,
+196,197,198,199,201,214,215,216,220,224,226,228,229,230,231,232,233,234,235,
+236,238,239,242,244,246,248,249,251,252,255,256,257,258,259,260,261,262,263,
+264,265,266,267,268,269,270,271,272,273,274,275,278,279,280,281,282,283,284,
+285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,302,303,304,305,
+308,309,310,311,312,313,314,315,316,317,318,321,322,323,324,325,326,327,328,
+330,331,332,333,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,
+351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,
+370,371,372,373,374,375,376,377,378,379,380,381,382,402,416,417,431,432,536,
+537,538,539,710,711,728,729,731,732,733,768,769,771,777,803,890,900,901,902,
+904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,
+925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,
+945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,
+964,965,966,967,968,969,970,
+971,972,973,974,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,
+1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,
+1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,
+1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,
+1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,
+1098,1099,1100,1101,1102,1103,1105,1106,1107,1108,1109,1110,1111,1112,1113,
+1114,1115,1116,1118,1119,1168,1169,1456,1457,1458,1459,1460,1461,1462,1463,
+1464,1465,1467,1468,1469,1470,1471,1472,1473,1474,1475,1488,1489,1490,1491,
+1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,
+1507,1508,1509,1510,1511,1512,1513,1514,1520,1521,1522,1523,1524,1548,1563,
+1567,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,
+1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1600,1601,1602,
+1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,
+1618,1657,1662,1670,1672,1681,1688,1705,1711,1722,1726,1729,1746,3585,3586,
+3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,
+3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,
+3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,
+3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3647,3648,3649,3650,
+3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,
+3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,7682,7683,7690,7691,7710,
+7711,7744,7745,7766,7767,7776,7777,7786,7787,7808,7809,7810,7811,7812,7813,
+7922,7923,8204,8205,8206,8207,8211,8212,8213,8215,8216,8217,8218,8220,8221,
+8222,8224,8225,8226,8230,8240,8249,8250,8362,8363,8364,8367,8359,8470,8482,
+8729,8730,8776,8804,8805,8992,8993,9472,9474,9484,9488,9492,9496,9500,9508,
+9516,9524,9532,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,
+9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,
+9579,9580,9600,9604,9608,9612,9616,9617,9618,9619,9632,
diff --git a/sources/android/support/src/musl-locale/libintl.h b/sources/android/support/src/musl-locale/libintl.h
new file mode 100644
index 0000000..0aab080
--- /dev/null
+++ b/sources/android/support/src/musl-locale/libintl.h
@@ -0,0 +1 @@
+/* Intentionally empty */
diff --git a/sources/android/support/src/musl-locale/newlocale.c b/sources/android/support/src/musl-locale/newlocale.c
index 986e796..447c8fc 100644
--- a/sources/android/support/src/musl-locale/newlocale.c
+++ b/sources/android/support/src/musl-locale/newlocale.c
@@ -1,6 +1,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include "locale_impl.h"
+#include "libc.h"
 
 locale_t newlocale(int mask, const char *name, locale_t base)
 {
@@ -9,3 +10,5 @@
 	if (!base) base = calloc(1, sizeof *base);
 	return base;
 }
+
+weak_alias(newlocale, __newlocale);
diff --git a/sources/android/support/src/musl-locale/strcoll.c b/sources/android/support/src/musl-locale/strcoll.c
index 30bccd6..5d7d909 100644
--- a/sources/android/support/src/musl-locale/strcoll.c
+++ b/sources/android/support/src/musl-locale/strcoll.c
@@ -1,6 +1,16 @@
 #include <string.h>
+#include <locale.h>
+#include "libc.h"
 
-int strcoll(const char *l, const char *r)
+// ANDROID: was __strcoll_l
+int strcoll_l(const char *l, const char *r, locale_t loc)
 {
 	return strcmp(l, r);
 }
+
+int strcoll(const char *l, const char *r)
+{
+	return strcoll_l(l, r, 0);
+}
+
+weak_alias(__strcoll_l, strcoll_l);
diff --git a/sources/android/support/src/musl-locale/strfmon.c b/sources/android/support/src/musl-locale/strfmon.c
index f510d9a..e25db97 100644
--- a/sources/android/support/src/musl-locale/strfmon.c
+++ b/sources/android/support/src/musl-locale/strfmon.c
@@ -3,7 +3,6 @@
 #include <stdarg.h>
 #include <monetary.h>
 #include <errno.h>
-#include <stdarg.h>
 
 static ssize_t vstrfmon_l(char *s, size_t n, locale_t loc, const char *fmt, va_list ap)
 {
diff --git a/sources/android/support/src/musl-locale/strxfrm.c b/sources/android/support/src/musl-locale/strxfrm.c
index d40be9e..6dc2bac 100644
--- a/sources/android/support/src/musl-locale/strxfrm.c
+++ b/sources/android/support/src/musl-locale/strxfrm.c
@@ -1,9 +1,19 @@
 #include <string.h>
+#include <locale.h>
+#include "libc.h"
 
 /* collate only by code points */
-size_t strxfrm(char *restrict dest, const char *restrict src, size_t n)
+// ANDROID: was __strxfrm_l in Musl
+size_t strxfrm_l(char *restrict dest, const char *restrict src, size_t n, locale_t loc)
 {
 	size_t l = strlen(src);
 	if (n > l) strcpy(dest, src);
 	return l;
 }
+
+size_t strxfrm(char *restrict dest, const char *restrict src, size_t n)
+{
+	return strxfrm_l(dest, src, n, 0);
+}
+
+weak_alias(__strxfrm_l, strxfrm_l);
diff --git a/sources/android/support/src/musl-locale/towlower_l.c b/sources/android/support/src/musl-locale/towlower_l.c
index 05fcde5..aaaea37 100644
--- a/sources/android/support/src/musl-locale/towlower_l.c
+++ b/sources/android/support/src/musl-locale/towlower_l.c
@@ -1,6 +1,9 @@
 #include <wctype.h>
+#include "libc.h"
 
 wint_t towlower_l(wint_t c, locale_t l)
 {
 	return towlower(c);
 }
+
+weak_alias(towlower_l, __towlower_l);
diff --git a/sources/android/support/src/musl-locale/towupper_l.c b/sources/android/support/src/musl-locale/towupper_l.c
index aa861ae..ad02a4b 100644
--- a/sources/android/support/src/musl-locale/towupper_l.c
+++ b/sources/android/support/src/musl-locale/towupper_l.c
@@ -1,6 +1,9 @@
 #include <wctype.h>
+#include "libc.h"
 
 wint_t towupper_l(wint_t c, locale_t l)
 {
 	return towupper(c);
 }
+
+weak_alias(towupper_l, __towupper_l);
diff --git a/sources/android/support/src/musl-locale/wcscoll.c b/sources/android/support/src/musl-locale/wcscoll.c
index cdbce1c..621c871 100644
--- a/sources/android/support/src/musl-locale/wcscoll.c
+++ b/sources/android/support/src/musl-locale/wcscoll.c
@@ -1,7 +1,17 @@
 #include <wchar.h>
+#include <locale.h>
+#include "libc.h"
 
 /* FIXME: stub */
-int wcscoll(const wchar_t *l, const wchar_t *r)
+// ANDROID: was __wcscoll_l in Musl
+int wcscoll_l(const wchar_t *l, const wchar_t *r, locale_t locale)
 {
 	return wcscmp(l, r);
 }
+
+int wcscoll(const wchar_t *l, const wchar_t *r)
+{
+	return wcscoll_l(l, r, 0);
+}
+
+weak_alias(__wcscoll_l, wcscoll_l);
diff --git a/sources/android/support/src/musl-locale/wcsxfrm.c b/sources/android/support/src/musl-locale/wcsxfrm.c
index bfa01b5..de5914c 100644
--- a/sources/android/support/src/musl-locale/wcsxfrm.c
+++ b/sources/android/support/src/musl-locale/wcsxfrm.c
@@ -1,12 +1,24 @@
 #include <wchar.h>
+#include <locale.h>
+#include "libc.h"
 
 /* collate only by code points */
+// ANDROID: Was __wcsxfrm_l in Musl
+size_t wcsxfrm_l(wchar_t *restrict dest, const wchar_t *restrict src, size_t n, locale_t loc)
+{
+        size_t l = wcslen(src);
+        if (l < n) {
+                wmemcpy(dest, src, l+1);
+        } else if (n) {
+                wmemcpy(dest, src, n-1);
+                dest[n-1] = 0;
+        }
+        return l;
+}
+
 size_t wcsxfrm(wchar_t *restrict dest, const wchar_t *restrict src, size_t n)
 {
-	size_t l = wcslen(src);
-	if (l >= n) {
-		wmemcpy(dest, src, n-1);
-		dest[n-1] = 0;
-	} else wcscpy(dest, src);
-	return l;
+        return wcsxfrm_l(dest, src, n, 0);
 }
+
+weak_alias(__wcsxfrm_l, wcsxfrm_l);
diff --git a/sources/android/support/src/musl-locale/wctype_l.c b/sources/android/support/src/musl-locale/wctype_l.c
index 01f9c67..601bab3 100644
--- a/sources/android/support/src/musl-locale/wctype_l.c
+++ b/sources/android/support/src/musl-locale/wctype_l.c
@@ -1,6 +1,9 @@
 #include <wctype.h>
+#include "libc.h"
 
 wctype_t wctype_l(const char *s, locale_t l)
 {
 	return wctype(s);
 }
+
+weak_alias(wctype_l, __wctype_l);
diff --git a/sources/android/support/src/musl-math/complex.h b/sources/android/support/src/musl-math/complex.h
new file mode 100644
index 0000000..0aab080
--- /dev/null
+++ b/sources/android/support/src/musl-math/complex.h
@@ -0,0 +1 @@
+/* Intentionally empty */
diff --git a/sources/android/support/src/musl-math/frexpl.c b/sources/android/support/src/musl-math/frexpl.c
index 6c35db7..3c1b553 100644
--- a/sources/android/support/src/musl-math/frexpl.c
+++ b/sources/android/support/src/musl-math/frexpl.c
@@ -1,21 +1,20 @@
-#include <math.h>
-#include <stdint.h>
-#include <float.h>
+#include "libm.h"
 
-#ifndef __LP64__
-#if LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
-
-/* This version is for 80-bit little endian long double */
-
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
 long double frexpl(long double x, int *e)
 {
-	union { long double ld; uint16_t hw[5]; } y = { x };
-	int ee = y.hw[4]&0x7fff;
+	return frexp(x, e);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+long double frexpl(long double x, int *e)
+{
+	union ldshape u = {x};
+	int ee = u.i.se & 0x7fff;
 
 	if (!ee) {
 		if (x) {
-			x = frexpl(x*0x1p64, e);
-			*e -= 64;
+			x = frexpl(x*0x1p120, e);
+			*e -= 120;
 		} else *e = 0;
 		return x;
 	} else if (ee == 0x7fff) {
@@ -23,17 +22,8 @@
 	}
 
 	*e = ee - 0x3ffe;
-	y.hw[4] &= 0x8000;
-	y.hw[4] |= 0x3ffe;
-	return y.ld;
+	u.i.se &= 0x8000;
+	u.i.se |= 0x3ffe;
+	return u.f;
 }
-
-#else
-
-long double frexpl(long double x, int *e)
-{
-	return frexp(x, e);
-}
-
 #endif
-#endif /* __LP64__ */
diff --git a/sources/android/support/src/musl-math/libm.h b/sources/android/support/src/musl-math/libm.h
new file mode 100644
index 0000000..fb6764f
--- /dev/null
+++ b/sources/android/support/src/musl-math/libm.h
@@ -0,0 +1,161 @@
+/* origin: FreeBSD /usr/src/lib/msun/src/math_private.h */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#ifndef _LIBM_H
+#define _LIBM_H
+
+#include <stdint.h>
+#include <float.h>
+#include <math.h>
+// ANDROID
+//#include <complex.h>
+#include <endian.h>
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __LITTLE_ENDIAN
+union ldshape {
+	long double f;
+	struct {
+		uint64_t m;
+		uint16_t se;
+	} i;
+};
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __LITTLE_ENDIAN
+union ldshape {
+	long double f;
+	struct {
+		uint64_t lo;
+		uint32_t mid;
+		uint16_t top;
+		uint16_t se;
+	} i;
+	struct {
+		uint64_t lo;
+		uint64_t hi;
+	} i2;
+};
+#else
+#error Unsupported long double representation
+#endif
+
+#define FORCE_EVAL(x) do {                        \
+	if (sizeof(x) == sizeof(float)) {         \
+		volatile float __x;               \
+		__x = (x);                        \
+	} else if (sizeof(x) == sizeof(double)) { \
+		volatile double __x;              \
+		__x = (x);                        \
+	} else {                                  \
+		volatile long double __x;         \
+		__x = (x);                        \
+	}                                         \
+} while(0)
+
+/* Get two 32 bit ints from a double.  */
+#define EXTRACT_WORDS(hi,lo,d)                    \
+do {                                              \
+  union {double f; uint64_t i;} __u;              \
+  __u.f = (d);                                    \
+  (hi) = __u.i >> 32;                             \
+  (lo) = (uint32_t)__u.i;                         \
+} while (0)
+
+/* Get the more significant 32 bit int from a double.  */
+#define GET_HIGH_WORD(hi,d)                       \
+do {                                              \
+  union {double f; uint64_t i;} __u;              \
+  __u.f = (d);                                    \
+  (hi) = __u.i >> 32;                             \
+} while (0)
+
+/* Get the less significant 32 bit int from a double.  */
+#define GET_LOW_WORD(lo,d)                        \
+do {                                              \
+  union {double f; uint64_t i;} __u;              \
+  __u.f = (d);                                    \
+  (lo) = (uint32_t)__u.i;                         \
+} while (0)
+
+/* Set a double from two 32 bit ints.  */
+#define INSERT_WORDS(d,hi,lo)                     \
+do {                                              \
+  union {double f; uint64_t i;} __u;              \
+  __u.i = ((uint64_t)(hi)<<32) | (uint32_t)(lo);  \
+  (d) = __u.f;                                    \
+} while (0)
+
+/* Set the more significant 32 bits of a double from an int.  */
+#define SET_HIGH_WORD(d,hi)                       \
+do {                                              \
+  union {double f; uint64_t i;} __u;              \
+  __u.f = (d);                                    \
+  __u.i &= 0xffffffff;                            \
+  __u.i |= (uint64_t)(hi) << 32;                  \
+  (d) = __u.f;                                    \
+} while (0)
+
+/* Set the less significant 32 bits of a double from an int.  */
+#define SET_LOW_WORD(d,lo)                        \
+do {                                              \
+  union {double f; uint64_t i;} __u;              \
+  __u.f = (d);                                    \
+  __u.i &= 0xffffffff00000000ull;                 \
+  __u.i |= (uint32_t)(lo);                        \
+  (d) = __u.f;                                    \
+} while (0)
+
+/* Get a 32 bit int from a float.  */
+#define GET_FLOAT_WORD(w,d)                       \
+do {                                              \
+  union {float f; uint32_t i;} __u;               \
+  __u.f = (d);                                    \
+  (w) = __u.i;                                    \
+} while (0)
+
+/* Set a float from a 32 bit int.  */
+#define SET_FLOAT_WORD(d,w)                       \
+do {                                              \
+  union {float f; uint32_t i;} __u;               \
+  __u.i = (w);                                    \
+  (d) = __u.f;                                    \
+} while (0)
+
+/* fdlibm kernel functions */
+
+int    __rem_pio2_large(double*,double*,int,int,int);
+
+int    __rem_pio2(double,double*);
+double __sin(double,double,int);
+double __cos(double,double);
+double __tan(double,double,int);
+double __expo2(double);
+// ANDROID
+//double complex __ldexp_cexp(double complex,int);
+
+int    __rem_pio2f(float,double*);
+float  __sindf(double);
+float  __cosdf(double);
+float  __tandf(double,int);
+float  __expo2f(float);
+// ANDROID
+//float complex __ldexp_cexpf(float complex,int);
+
+int __rem_pio2l(long double, long double *);
+long double __sinl(long double, long double, int);
+long double __cosl(long double, long double);
+long double __tanl(long double, long double, int);
+
+/* polynomial evaluation */
+long double __polevll(long double, const long double *, int);
+long double __p1evll(long double, const long double *, int);
+
+#endif
diff --git a/sources/android/support/src/musl-math/s_scalbln.c b/sources/android/support/src/musl-math/s_scalbln.c
deleted file mode 100644
index a517644..0000000
--- a/sources/android/support/src/musl-math/s_scalbln.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/*-
- * Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#if defined(__i386__)
-/* scalbln scalblnf and scalblnl aren't supported in x86 until API >= 18 */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <limits.h>
-#include <math.h>
-
-double
-scalbln (double x, long n)
-{
-	int in;
-
-	in = (int)n;
-	if (in != n) {
-		if (n > 0)
-			in = INT_MAX;
-		else
-			in = INT_MIN;
-	}
-	return (scalbn(x, in));
-}
-
-float
-scalblnf (float x, long n)
-{
-	int in;
-
-	in = (int)n;
-	if (in != n) {
-		if (n > 0)
-			in = INT_MAX;
-		else
-			in = INT_MIN;
-	}
-	return (scalbnf(x, in));
-}
-
-long double
-scalblnl (long double x, long n)
-{
-	int in;
-
-	in = (int)n;
-	if (in != n) {
-		if (n > 0)
-			in = INT_MAX;
-		else
-			in = INT_MIN;
-	}
-	return (scalbnl(x, (int)n));
-}
-
-#endif
\ No newline at end of file
diff --git a/sources/android/support/src/musl-math/scalbln.c b/sources/android/support/src/musl-math/scalbln.c
new file mode 100644
index 0000000..e6f3f19
--- /dev/null
+++ b/sources/android/support/src/musl-math/scalbln.c
@@ -0,0 +1,11 @@
+#include <limits.h>
+#include <math.h>
+
+double scalbln(double x, long n)
+{
+	if (n > INT_MAX)
+		n = INT_MAX;
+	else if (n < INT_MIN)
+		n = INT_MIN;
+	return scalbn(x, n);
+}
diff --git a/sources/android/support/src/musl-math/scalblnf.c b/sources/android/support/src/musl-math/scalblnf.c
new file mode 100644
index 0000000..d8e8166
--- /dev/null
+++ b/sources/android/support/src/musl-math/scalblnf.c
@@ -0,0 +1,11 @@
+#include <limits.h>
+#include <math.h>
+
+float scalblnf(float x, long n)
+{
+	if (n > INT_MAX)
+		n = INT_MAX;
+	else if (n < INT_MIN)
+		n = INT_MIN;
+	return scalbnf(x, n);
+}
diff --git a/sources/android/support/src/musl-math/scalblnl.c b/sources/android/support/src/musl-math/scalblnl.c
new file mode 100644
index 0000000..854c51c
--- /dev/null
+++ b/sources/android/support/src/musl-math/scalblnl.c
@@ -0,0 +1,19 @@
+#include <limits.h>
+#include <math.h>
+#include <float.h>
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double scalblnl(long double x, long n)
+{
+	return scalbln(x, n);
+}
+#else
+long double scalblnl(long double x, long n)
+{
+	if (n > INT_MAX)
+		n = INT_MAX;
+	else if (n < INT_MIN)
+		n = INT_MIN;
+	return scalbnl(x, n);
+}
+#endif
diff --git a/sources/android/support/src/musl-math/scalbnl.c b/sources/android/support/src/musl-math/scalbnl.c
new file mode 100644
index 0000000..08a4c58
--- /dev/null
+++ b/sources/android/support/src/musl-math/scalbnl.c
@@ -0,0 +1,36 @@
+#include "libm.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+long double scalbnl(long double x, int n)
+{
+	return scalbn(x, n);
+}
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
+long double scalbnl(long double x, int n)
+{
+	union ldshape u;
+
+	if (n > 16383) {
+		x *= 0x1p16383L;
+		n -= 16383;
+		if (n > 16383) {
+			x *= 0x1p16383L;
+			n -= 16383;
+			if (n > 16383)
+				n = 16383;
+		}
+	} else if (n < -16382) {
+		x *= 0x1p-16382L;
+		n += 16382;
+		if (n < -16382) {
+			x *= 0x1p-16382L;
+			n += 16382;
+			if (n < -16382)
+				n = -16382;
+		}
+	}
+	u.f = 1.0;
+	u.i.se = 0x3fff + n;
+	return x * u.f;
+}
+#endif
diff --git a/sources/android/support/src/musl-multibyte/internal.c b/sources/android/support/src/musl-multibyte/internal.c
index ab22806..1813b26 100644
--- a/sources/android/support/src/musl-multibyte/internal.c
+++ b/sources/android/support/src/musl-multibyte/internal.c
@@ -4,8 +4,6 @@
  * unnecessary.
  */
 
-#include <inttypes.h>
-
 #include "internal.h"
 
 #define C(x) ( x<2 ? -1 : ( R(0x80,0xc0) | x ) )
diff --git a/sources/android/support/src/musl-multibyte/internal.h b/sources/android/support/src/musl-multibyte/internal.h
index 25ba240..82f5a07 100644
--- a/sources/android/support/src/musl-multibyte/internal.h
+++ b/sources/android/support/src/musl-multibyte/internal.h
@@ -6,6 +6,7 @@
 
 #define bittab __fsmu8
 
+#include <stdint.h>
 #include "libc.h"
 
 extern const uint32_t bittab[] ATTR_LIBC_VISIBILITY;
diff --git a/sources/android/support/src/musl-multibyte/mblen.c b/sources/android/support/src/musl-multibyte/mblen.c
index 26d3564..96b47b1 100644
--- a/sources/android/support/src/musl-multibyte/mblen.c
+++ b/sources/android/support/src/musl-multibyte/mblen.c
@@ -5,11 +5,6 @@
  */
 
 #include <stdlib.h>
-#include <inttypes.h>
-#include <wchar.h>
-#include <errno.h>
-
-#include "internal.h"
 
 int mblen(const char *s, size_t n)
 {
diff --git a/sources/android/support/src/musl-multibyte/mbrlen.c b/sources/android/support/src/musl-multibyte/mbrlen.c
index c9714ef..3a5a743 100644
--- a/sources/android/support/src/musl-multibyte/mbrlen.c
+++ b/sources/android/support/src/musl-multibyte/mbrlen.c
@@ -4,12 +4,7 @@
  * unnecessary.
  */
 
-#include <stdlib.h>
-#include <inttypes.h>
 #include <wchar.h>
-#include <errno.h>
-
-#include "internal.h"
 
 size_t mbrlen(const char *restrict s, size_t n, mbstate_t *restrict st)
 {
diff --git a/sources/android/support/src/musl-multibyte/mbrtowc.c b/sources/android/support/src/musl-multibyte/mbrtowc.c
index db80366..35e834e 100644
--- a/sources/android/support/src/musl-multibyte/mbrtowc.c
+++ b/sources/android/support/src/musl-multibyte/mbrtowc.c
@@ -4,11 +4,8 @@
  * unnecessary.
  */
 
-#include <stdlib.h>
-#include <inttypes.h>
 #include <wchar.h>
 #include <errno.h>
-
 #include "internal.h"
 
 size_t mbrtowc(wchar_t *restrict wc, const char *restrict src, size_t n, mbstate_t *restrict st)
diff --git a/sources/android/support/src/musl-multibyte/mbsinit.c b/sources/android/support/src/musl-multibyte/mbsinit.c
index c0e7e49..e001d84 100644
--- a/sources/android/support/src/musl-multibyte/mbsinit.c
+++ b/sources/android/support/src/musl-multibyte/mbsinit.c
@@ -4,12 +4,7 @@
  * unnecessary.
  */
 
-#include <stdlib.h>
-#include <inttypes.h>
 #include <wchar.h>
-#include <errno.h>
-
-#include "internal.h"
 
 int mbsinit(const mbstate_t *st)
 {
diff --git a/sources/android/support/src/musl-multibyte/mbsnrtowcs.c b/sources/android/support/src/musl-multibyte/mbsnrtowcs.c
index 33457f9..68b9960 100644
--- a/sources/android/support/src/musl-multibyte/mbsnrtowcs.c
+++ b/sources/android/support/src/musl-multibyte/mbsnrtowcs.c
@@ -4,13 +4,7 @@
  * unnecessary.
  */
 
-#include <stdlib.h>
-#include <inttypes.h>
 #include <wchar.h>
-#include <errno.h>
-#include <stdio.h>
-
-#include "internal.h"
 
 size_t mbsnrtowcs(wchar_t *restrict wcs, const char **restrict src, size_t n, size_t wn, mbstate_t *restrict st)
 {
diff --git a/sources/android/support/src/musl-multibyte/mbsrtowcs.c b/sources/android/support/src/musl-multibyte/mbsrtowcs.c
index 75a493c..3c1343a 100644
--- a/sources/android/support/src/musl-multibyte/mbsrtowcs.c
+++ b/sources/android/support/src/musl-multibyte/mbsrtowcs.c
@@ -4,11 +4,9 @@
  * unnecessary.
  */
 
-#include <stdlib.h>
-#include <inttypes.h>
+#include <stdint.h>
 #include <wchar.h>
 #include <errno.h>
-
 #include "internal.h"
 
 size_t mbsrtowcs(wchar_t *restrict ws, const char **restrict src, size_t wn, mbstate_t *restrict st)
@@ -54,9 +52,12 @@
 		wn--;
 		c = 0;
 	} else for (;;) {
-		if (!wn) return wn0;
+		if (!wn) {
+			*src = (const void *)s;
+			return wn0;
+		}
 		if (*s-1u < 0x7f && (uintptr_t)s%4 == 0) {
-			while (wn>=4 && !(( *(uint32_t*)s | *(uint32_t*)s-0x01010101) & 0x80808080)) {
+			while (wn>=5 && !(( *(uint32_t*)s | *(uint32_t*)s-0x01010101) & 0x80808080)) {
 				*ws++ = *s++;
 				*ws++ = *s++;
 				*ws++ = *s++;
diff --git a/sources/android/support/src/musl-multibyte/mbtowc.c b/sources/android/support/src/musl-multibyte/mbtowc.c
index ec9e54a..6710637 100644
--- a/sources/android/support/src/musl-multibyte/mbtowc.c
+++ b/sources/android/support/src/musl-multibyte/mbtowc.c
@@ -4,13 +4,10 @@
  * unnecessary.
  */
 
-#include <stdlib.h>
-#include <inttypes.h>
 #include <wchar.h>
 #include <errno.h>
-
 #include "internal.h"
-#include <stdio.h>
+
 int mbtowc(wchar_t *restrict wc, const char *restrict src, size_t n)
 {
 	unsigned c;
diff --git a/sources/android/support/src/musl-multibyte/wcrtomb.c b/sources/android/support/src/musl-multibyte/wcrtomb.c
index 250649f..59f733d 100644
--- a/sources/android/support/src/musl-multibyte/wcrtomb.c
+++ b/sources/android/support/src/musl-multibyte/wcrtomb.c
@@ -4,13 +4,9 @@
  * unnecessary.
  */
 
-#include <stdlib.h>
-#include <inttypes.h>
 #include <wchar.h>
 #include <errno.h>
 
-#include "internal.h"
-
 size_t wcrtomb(char *restrict s, wchar_t wc, mbstate_t *restrict st)
 {
 	if (!s) return 1;
diff --git a/sources/android/support/src/musl-multibyte/wcsnrtombs.c b/sources/android/support/src/musl-multibyte/wcsnrtombs.c
index a2e308b..7eb05d4 100644
--- a/sources/android/support/src/musl-multibyte/wcsnrtombs.c
+++ b/sources/android/support/src/musl-multibyte/wcsnrtombs.c
@@ -4,12 +4,7 @@
  * unnecessary.
  */
 
-#include <stdlib.h>
-#include <inttypes.h>
 #include <wchar.h>
-#include <errno.h>
-
-#include "internal.h"
 
 size_t wcsnrtombs(char *restrict dst, const wchar_t **restrict wcs, size_t wn, size_t n, mbstate_t *restrict st)
 {
diff --git a/sources/android/support/src/musl-multibyte/wcsrtombs.c b/sources/android/support/src/musl-multibyte/wcsrtombs.c
index d48a65e..30be415 100644
--- a/sources/android/support/src/musl-multibyte/wcsrtombs.c
+++ b/sources/android/support/src/musl-multibyte/wcsrtombs.c
@@ -4,12 +4,7 @@
  * unnecessary.
  */
 
-#include <stdlib.h>
-#include <inttypes.h>
 #include <wchar.h>
-#include <errno.h>
-
-#include "internal.h"
 
 size_t wcsrtombs(char *restrict s, const wchar_t **restrict ws, size_t n, mbstate_t *restrict st)
 {
@@ -26,8 +21,13 @@
 		}
 		return n;
 	}
-	while (n>=4 && **ws) {
-		if (**ws >= 0x80u) {
+	while (n>=4) {
+		if (**ws-1u >= 0x7fu) {
+			if (!**ws) {
+				*s = 0;
+				*ws = 0;
+				return N-n;
+			}
 			l = wcrtomb(s, **ws, 0);
 			if (!(l+1)) return -1;
 			s += l;
@@ -38,8 +38,13 @@
 		}
 		(*ws)++;
 	}
-	while (n && **ws) {
-		if (**ws >= 0x80u) {
+	while (n) {
+		if (**ws-1u >= 0x7fu) {
+			if (!**ws) {
+				*s = 0;
+				*ws = 0;
+				return N-n;
+			}
 			l = wcrtomb(buf, **ws, 0);
 			if (!(l+1)) return -1;
 			if (l>n) return N-n;
@@ -52,7 +57,5 @@
 		}
 		(*ws)++;
 	}
-	if (n) *s = 0;
-	*ws = 0;
-	return N-n;
+	return N;
 }
diff --git a/sources/android/support/src/musl-multibyte/wctomb.c b/sources/android/support/src/musl-multibyte/wctomb.c
index 6910ef3..de7ed84 100644
--- a/sources/android/support/src/musl-multibyte/wctomb.c
+++ b/sources/android/support/src/musl-multibyte/wctomb.c
@@ -5,11 +5,7 @@
  */
 
 #include <stdlib.h>
-#include <inttypes.h>
 #include <wchar.h>
-#include <errno.h>
-
-#include "internal.h"
 
 int wctomb(char *s, wchar_t wc)
 {
diff --git a/sources/android/support/src/musl-stdio/swprintf.c b/sources/android/support/src/musl-stdio/swprintf.c
index cbf83d2..f75eb11 100644
--- a/sources/android/support/src/musl-stdio/swprintf.c
+++ b/sources/android/support/src/musl-stdio/swprintf.c
@@ -1,4 +1,3 @@
-#include <stdio.h>
 #include <stdarg.h>
 #include <wchar.h>
 
diff --git a/sources/android/support/src/wchar_support.c b/sources/android/support/src/wchar_support.c
index 2a657e9..fad1875 100644
--- a/sources/android/support/src/wchar_support.c
+++ b/sources/android/support/src/wchar_support.c
@@ -348,45 +348,3 @@
         s[i] = c;
     return s;
 }
-
-float wcstof(const wchar_t* nptr, wchar_t** endptr) {
-#warning Not implemented
-  assert(0);
-  return 0;
-}
-
-long wcstol(const wchar_t* nptr, wchar_t** endptr, int base) {
-#warning Not implemented
-  assert(0);
-  return 0;
-}
-
-long double wcstold(const wchar_t* nptr, wchar_t** endptr) {
-#warning Not implemented
-  assert(0);
-  return 0;
-}
-
-long long wcstoll(const wchar_t* nptr, wchar_t** endptr, int base) {
-#warning Not implemented
-  assert(0);
-  return 0;
-}
-
-unsigned long long wcstoull(const wchar_t* nptr, wchar_t** endptr, int base) {
-#warning Not implemented
-  assert(0);
-  return 0;
-}
-
-intmax_t wcstoimax (const wchar_t * nptr, wchar_t** endptr , int base) {
-#warning Not implemented
-  assert(0);
-  return 0;
-}
-
-uintmax_t wcstoumax (const wchar_t * nptr, wchar_t** endptr , int base) {
-#warning Not implemented
-  assert(0);
-  return 0;
-}
diff --git a/sources/android/support/src/wcstox/floatscan.c b/sources/android/support/src/wcstox/floatscan.c
new file mode 100644
index 0000000..3b9d446
--- /dev/null
+++ b/sources/android/support/src/wcstox/floatscan.c
@@ -0,0 +1,525 @@
+// ----------------------------------------------------------------------
+// Copyright © 2005-2014 Rich Felker, et al.
+// Copyright 2014 The Android Open Source Project.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+// ----------------------------------------------------------------------
+
+#include <stdint.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+#include <limits.h>
+#include <errno.h>
+#include <ctype.h>
+
+#include "shgetc.h"
+#include "floatscan.h"
+
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
+
+#define LD_B1B_DIG 2
+#define LD_B1B_MAX 9007199, 254740991
+#define KMAX 128
+
+#else /* LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 */
+
+#define LD_B1B_DIG 3
+#define LD_B1B_MAX 18, 446744073, 709551615
+#define KMAX 2048
+
+#endif
+
+#define MASK (KMAX-1)
+
+#define CONCAT2(x,y) x ## y
+#define CONCAT(x,y) CONCAT2(x,y)
+
+// ANDROID: The original Musl sources use a FILE* handle, but redefine the
+//          type to match our custom fake_file_t from shgetc.h
+#undef FILE
+#define FILE  struct fake_file_t
+
+static long long scanexp(FILE *f, int pok)
+{
+	int c;
+	int x;
+	long long y;
+	int neg = 0;
+	
+	c = shgetc(f);
+	if (c=='+' || c=='-') {
+		neg = (c=='-');
+		c = shgetc(f);
+		if (c-'0'>=10U && pok) shunget(f);
+	}
+	if (c-'0'>=10U) {
+		shunget(f);
+		return LLONG_MIN;
+	}
+	for (x=0; c-'0'<10U && x<INT_MAX/10; c = shgetc(f))
+		x = 10*x + c-'0';
+	for (y=x; c-'0'<10U && y<LLONG_MAX/100; c = shgetc(f))
+		y = 10*y + c-'0';
+	for (; c-'0'<10U; c = shgetc(f));
+	shunget(f);
+	return neg ? -y : y;
+}
+
+
+static long double decfloat(FILE *f, int c, int bits, int emin, int sign, int pok)
+{
+	uint32_t x[KMAX];
+	static const uint32_t th[] = { LD_B1B_MAX };
+	int i, j, k, a, z;
+	long long lrp=0, dc=0;
+	long long e10=0;
+	int lnz = 0;
+	int gotdig = 0, gotrad = 0;
+	int rp;
+	int e2;
+	int emax = -emin-bits+3;
+	int denormal = 0;
+	long double y;
+	long double frac=0;
+	long double bias=0;
+	static const int p10s[] = { 10, 100, 1000, 10000,
+		100000, 1000000, 10000000, 100000000 };
+
+	j=0;
+	k=0;
+
+	/* Don't let leading zeros consume buffer space */
+	for (; c=='0'; c = shgetc(f)) gotdig=1;
+	if (c=='.') {
+		gotrad = 1;
+		for (c = shgetc(f); c=='0'; c = shgetc(f)) gotdig=1, lrp--;
+	}
+
+	x[0] = 0;
+	for (; c-'0'<10U || c=='.'; c = shgetc(f)) {
+		if (c == '.') {
+			if (gotrad) break;
+			gotrad = 1;
+			lrp = dc;
+		} else if (k < KMAX-3) {
+			dc++;
+			if (c!='0') lnz = dc;
+			if (j) x[k] = x[k]*10 + c-'0';
+			else x[k] = c-'0';
+			if (++j==9) {
+				k++;
+				j=0;
+			}
+			gotdig=1;
+		} else {
+			dc++;
+			if (c!='0') x[KMAX-4] |= 1;
+		}
+	}
+	if (!gotrad) lrp=dc;
+
+	if (gotdig && (c|32)=='e') {
+		e10 = scanexp(f, pok);
+		if (e10 == LLONG_MIN) {
+			if (pok) {
+				shunget(f);
+			} else {
+				shlim(f, 0);
+				return 0;
+			}
+			e10 = 0;
+		}
+		lrp += e10;
+	} else if (c>=0) {
+		shunget(f);
+	}
+	if (!gotdig) {
+		errno = EINVAL;
+		shlim(f, 0);
+		return 0;
+	}
+
+	/* Handle zero specially to avoid nasty special cases later */
+	if (!x[0]) return sign * 0.0;
+
+	/* Optimize small integers (w/no exponent) and over/under-flow */
+	if (lrp==dc && dc<10 && (bits>30 || x[0]>>bits==0))
+		return sign * (long double)x[0];
+	if (lrp > -emin/2) {
+		errno = ERANGE;
+		return sign * LDBL_MAX * LDBL_MAX;
+	}
+	if (lrp < emin-2*LDBL_MANT_DIG) {
+		errno = ERANGE;
+		return sign * LDBL_MIN * LDBL_MIN;
+	}
+
+	/* Align incomplete final B1B digit */
+	if (j) {
+		for (; j<9; j++) x[k]*=10;
+		k++;
+		j=0;
+	}
+
+	a = 0;
+	z = k;
+	e2 = 0;
+	rp = lrp;
+
+	/* Optimize small to mid-size integers (even in exp. notation) */
+	if (lnz<9 && lnz<=rp && rp < 18) {
+		if (rp == 9) return sign * (long double)x[0];
+		if (rp < 9) return sign * (long double)x[0] / p10s[8-rp];
+		int bitlim = bits-3*(int)(rp-9);
+		if (bitlim>30 || x[0]>>bitlim==0)
+			return sign * (long double)x[0] * p10s[rp-10];
+	}
+
+	/* Align radix point to B1B digit boundary */
+	if (rp % 9) {
+		int rpm9 = rp>=0 ? rp%9 : rp%9+9;
+		int p10 = p10s[8-rpm9];
+		uint32_t carry = 0;
+		for (k=a; k!=z; k++) {
+			uint32_t tmp = x[k] % p10;
+			x[k] = x[k]/p10 + carry;
+			carry = 1000000000/p10 * tmp;
+			if (k==a && !x[k]) {
+				a = (a+1 & MASK);
+				rp -= 9;
+			}
+		}
+		if (carry) x[z++] = carry;
+		rp += 9-rpm9;
+	}
+
+	/* Upscale until desired number of bits are left of radix point */
+	while (rp < 9*LD_B1B_DIG || (rp == 9*LD_B1B_DIG && x[a]<th[0])) {
+		uint32_t carry = 0;
+		e2 -= 29;
+		for (k=(z-1 & MASK); ; k=(k-1 & MASK)) {
+			uint64_t tmp = ((uint64_t)x[k] << 29) + carry;
+			if (tmp > 1000000000) {
+				carry = tmp / 1000000000;
+				x[k] = tmp % 1000000000;
+			} else {
+				carry = 0;
+				x[k] = tmp;
+			}
+			if (k==(z-1 & MASK) && k!=a && !x[k]) z = k;
+			if (k==a) break;
+		}
+		if (carry) {
+			rp += 9;
+			a = (a-1 & MASK);
+			if (a == z) {
+				z = (z-1 & MASK);
+				x[z-1 & MASK] |= x[z];
+			}
+			x[a] = carry;
+		}
+	}
+
+	/* Downscale until exactly number of bits are left of radix point */
+	for (;;) {
+		uint32_t carry = 0;
+		int sh = 1;
+		for (i=0; i<LD_B1B_DIG; i++) {
+			k = (a+i & MASK);
+			if (k == z || x[k] < th[i]) {
+				i=LD_B1B_DIG;
+				break;
+			}
+			if (x[a+i & MASK] > th[i]) break;
+		}
+		if (i==LD_B1B_DIG && rp==9*LD_B1B_DIG) break;
+		/* FIXME: find a way to compute optimal sh */
+		if (rp > 9+9*LD_B1B_DIG) sh = 9;
+		e2 += sh;
+		for (k=a; k!=z; k=(k+1 & MASK)) {
+			uint32_t tmp = x[k] & (1<<sh)-1;
+			x[k] = (x[k]>>sh) + carry;
+			carry = (1000000000>>sh) * tmp;
+			if (k==a && !x[k]) {
+				a = (a+1 & MASK);
+				i--;
+				rp -= 9;
+			}
+		}
+		if (carry) {
+			if ((z+1 & MASK) != a) {
+				x[z] = carry;
+				z = (z+1 & MASK);
+			} else x[z-1 & MASK] |= 1;
+		}
+	}
+
+	/* Assemble desired bits into floating point variable */
+	for (y=i=0; i<LD_B1B_DIG; i++) {
+		if ((a+i & MASK)==z) x[(z=(z+1 & MASK))-1] = 0;
+		y = 1000000000.0L * y + x[a+i & MASK];
+	}
+
+	y *= sign;
+
+	/* Limit precision for denormal results */
+	if (bits > LDBL_MANT_DIG+e2-emin) {
+		bits = LDBL_MANT_DIG+e2-emin;
+		if (bits<0) bits=0;
+		denormal = 1;
+	}
+
+	/* Calculate bias term to force rounding, move out lower bits */
+	if (bits < LDBL_MANT_DIG) {
+		bias = copysignl(scalbn(1, 2*LDBL_MANT_DIG-bits-1), y);
+		frac = fmodl(y, scalbn(1, LDBL_MANT_DIG-bits));
+		y -= frac;
+		y += bias;
+	}
+
+	/* Process tail of decimal input so it can affect rounding */
+	if ((a+i & MASK) != z) {
+		uint32_t t = x[a+i & MASK];
+		if (t < 500000000 && (t || (a+i+1 & MASK) != z))
+			frac += 0.25*sign;
+		else if (t > 500000000)
+			frac += 0.75*sign;
+		else if (t == 500000000) {
+			if ((a+i+1 & MASK) == z)
+				frac += 0.5*sign;
+			else
+				frac += 0.75*sign;
+		}
+		if (LDBL_MANT_DIG-bits >= 2 && !fmodl(frac, 1))
+			frac++;
+	}
+
+	y += frac;
+	y -= bias;
+
+	if ((e2+LDBL_MANT_DIG & INT_MAX) > emax-5) {
+		if (fabs(y) >= CONCAT(0x1p, LDBL_MANT_DIG)) {
+			if (denormal && bits==LDBL_MANT_DIG+e2-emin)
+				denormal = 0;
+			y *= 0.5;
+			e2++;
+		}
+		if (e2+LDBL_MANT_DIG>emax || (denormal && frac))
+			errno = ERANGE;
+	}
+
+	return scalbnl(y, e2);
+}
+
+static long double hexfloat(FILE *f, int bits, int emin, int sign, int pok)
+{
+	uint32_t x = 0;
+	long double y = 0;
+	long double scale = 1;
+	long double bias = 0;
+	int gottail = 0, gotrad = 0, gotdig = 0;
+	long long rp = 0;
+	long long dc = 0;
+	long long e2 = 0;
+	int d;
+	int c;
+
+	c = shgetc(f);
+
+	/* Skip leading zeros */
+	for (; c=='0'; c = shgetc(f)) gotdig = 1;
+
+	if (c=='.') {
+		gotrad = 1;
+		c = shgetc(f);
+		/* Count zeros after the radix point before significand */
+		for (rp=0; c=='0'; c = shgetc(f), rp--) gotdig = 1;
+	}
+
+	for (; c-'0'<10U || (c|32)-'a'<6U || c=='.'; c = shgetc(f)) {
+		if (c=='.') {
+			if (gotrad) break;
+			rp = dc;
+			gotrad = 1;
+		} else {
+			gotdig = 1;
+			if (c > '9') d = (c|32)+10-'a';
+			else d = c-'0';
+			if (dc<8) {
+				x = x*16 + d;
+			} else if (dc < LDBL_MANT_DIG/4+1) {
+				y += d*(scale/=16);
+			} else if (d && !gottail) {
+				y += 0.5*scale;
+				gottail = 1;
+			}
+			dc++;
+		}
+	}
+	if (!gotdig) {
+		shunget(f);
+		if (pok) {
+			shunget(f);
+			if (gotrad) shunget(f);
+		} else {
+			shlim(f, 0);
+		}
+		return sign * 0.0;
+	}
+	if (!gotrad) rp = dc;
+	while (dc<8) x *= 16, dc++;
+	if ((c|32)=='p') {
+		e2 = scanexp(f, pok);
+		if (e2 == LLONG_MIN) {
+			if (pok) {
+				shunget(f);
+			} else {
+				shlim(f, 0);
+				return 0;
+			}
+			e2 = 0;
+		}
+	} else {
+		shunget(f);
+	}
+	e2 += 4*rp - 32;
+
+	if (!x) return sign * 0.0;
+	if (e2 > -emin) {
+		errno = ERANGE;
+		return sign * LDBL_MAX * LDBL_MAX;
+	}
+	if (e2 < emin-2*LDBL_MANT_DIG) {
+		errno = ERANGE;
+		return sign * LDBL_MIN * LDBL_MIN;
+	}
+
+	while (x < 0x80000000) {
+		if (y>=0.5) {
+			x += x + 1;
+			y += y - 1;
+		} else {
+			x += x;
+			y += y;
+		}
+		e2--;
+	}
+
+	if (bits > 32+e2-emin) {
+		bits = 32+e2-emin;
+		if (bits<0) bits=0;
+	}
+
+	if (bits < LDBL_MANT_DIG)
+		bias = copysignl(scalbn(1, 32+LDBL_MANT_DIG-bits-1), sign);
+
+	if (bits<32 && y && !(x&1)) x++, y=0;
+
+	y = bias + sign*(long double)x + sign*y;
+	y -= bias;
+
+	if (!y) errno = ERANGE;
+
+	return scalbnl(y, e2);
+}
+
+long double __floatscan(FILE *f, int prec, int pok)
+{
+	int sign = 1;
+	size_t i;
+	int bits;
+	int emin;
+	int c;
+
+	switch (prec) {
+	case 0:
+		bits = FLT_MANT_DIG;
+		emin = FLT_MIN_EXP-bits;
+		break;
+	case 1:
+		bits = DBL_MANT_DIG;
+		emin = DBL_MIN_EXP-bits;
+		break;
+	case 2:
+		bits = LDBL_MANT_DIG;
+		emin = LDBL_MIN_EXP-bits;
+		break;
+	default:
+		return 0;
+	}
+
+	while (isspace((c=shgetc(f))));
+
+	if (c=='+' || c=='-') {
+		sign -= 2*(c=='-');
+		c = shgetc(f);
+	}
+
+	for (i=0; i<8 && (c|32)=="infinity"[i]; i++)
+		if (i<7) c = shgetc(f);
+	if (i==3 || i==8 || (i>3 && pok)) {
+		if (i!=8) {
+			shunget(f);
+			if (pok) for (; i>3; i--) shunget(f);
+		}
+		return sign * INFINITY;
+	}
+	if (!i) for (i=0; i<3 && (c|32)=="nan"[i]; i++)
+		if (i<2) c = shgetc(f);
+	if (i==3) {
+		if (shgetc(f) != '(') {
+			shunget(f);
+			return NAN;
+		}
+		for (i=1; ; i++) {
+			c = shgetc(f);
+			if (c-'0'<10U || c-'A'<26U || c-'a'<26U || c=='_')
+				continue;
+			if (c==')') return NAN;
+			shunget(f);
+			if (!pok) {
+				errno = EINVAL;
+				shlim(f, 0);
+				return 0;
+			}
+			while (i--) shunget(f);
+			return NAN;
+		}
+		return NAN;
+	}
+
+	if (i) {
+		shunget(f);
+		errno = EINVAL;
+		shlim(f, 0);
+		return 0;
+	}
+
+	if (c=='0') {
+		c = shgetc(f);
+		if ((c|32) == 'x')
+			return hexfloat(f, bits, emin, sign, pok);
+		shunget(f);
+		c = '0';
+	}
+
+	return decfloat(f, c, bits, emin, sign, pok);
+}
diff --git a/sources/android/support/src/wcstox/floatscan.h b/sources/android/support/src/wcstox/floatscan.h
new file mode 100644
index 0000000..9352b78
--- /dev/null
+++ b/sources/android/support/src/wcstox/floatscan.h
@@ -0,0 +1,6 @@
+#ifndef FLOATSCAN_H
+#define FLOATSCAN_H
+
+long double __floatscan(struct fake_file_t *, int, int);
+
+#endif
diff --git a/sources/android/support/src/wcstox/intscan.c b/sources/android/support/src/wcstox/intscan.c
new file mode 100644
index 0000000..72f2d2a
--- /dev/null
+++ b/sources/android/support/src/wcstox/intscan.c
@@ -0,0 +1,127 @@
+// ----------------------------------------------------------------------
+// Copyright © 2005-2014 Rich Felker, et al.
+// Copyright 2014 The Android Open Source Project.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+// ----------------------------------------------------------------------
+
+#include <limits.h>
+#include <errno.h>
+#include <ctype.h>
+#include "shgetc.h"
+
+// ANDROID: Redefine FILE to use our custom stream abstraction.
+#undef FILE
+#define FILE struct fake_file_t
+
+/* Lookup table for digit values. -1==255>=36 -> invalid */
+static const unsigned char table[] = { -1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
+-1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
+25,26,27,28,29,30,31,32,33,34,35,-1,-1,-1,-1,-1,
+-1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
+25,26,27,28,29,30,31,32,33,34,35,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+};
+
+unsigned long long __intscan(FILE *f, unsigned base, int pok, unsigned long long lim)
+{
+	const unsigned char *val = table+1;
+	int c, neg=0;
+	unsigned x;
+	unsigned long long y;
+	if (base > 36) {
+		errno = EINVAL;
+		return 0;
+	}
+	while (isspace((c=shgetc(f))));
+	if (c=='+' || c=='-') {
+		neg = -(c=='-');
+		c = shgetc(f);
+	}
+	if ((base == 0 || base == 16) && c=='0') {
+		c = shgetc(f);
+		if ((c|32)=='x') {
+			c = shgetc(f);
+			if (val[c]>=16) {
+				shunget(f);
+				if (pok) shunget(f);
+				else shlim(f, 0);
+				return 0;
+			}
+			base = 16;
+		} else if (base == 0) {
+			base = 8;
+		}
+	} else {
+		if (base == 0) base = 10;
+		if (val[c] >= base) {
+			shunget(f);
+			shlim(f, 0);
+			errno = EINVAL;
+			return 0;
+		}
+	}
+	if (base == 10) {
+		for (x=0; c-'0'<10U && x<=UINT_MAX/10-1; c=shgetc(f))
+			x = x*10 + (c-'0');
+		for (y=x; c-'0'<10U && y<=ULLONG_MAX/10 && 10*y<=ULLONG_MAX-(c-'0'); c=shgetc(f))
+			y = y*10 + (c-'0');
+		if (c-'0'>=10U) goto done;
+	} else if (!(base & base-1)) {
+		int bs = "\0\1\2\4\7\3\6\5"[(0x17*base)>>5&7];
+		for (x=0; val[c]<base && x<=UINT_MAX/32; c=shgetc(f))
+			x = x<<bs | val[c];
+		for (y=x; val[c]<base && y<=ULLONG_MAX>>bs; c=shgetc(f))
+			y = y<<bs | val[c];
+	} else {
+		for (x=0; val[c]<base && x<=UINT_MAX/36-1; c=shgetc(f))
+			x = x*base + val[c];
+		for (y=x; val[c]<base && y<=ULLONG_MAX/base && base*y<=ULLONG_MAX-val[c]; c=shgetc(f))
+			y = y*base + val[c];
+	}
+	if (val[c]<base) {
+		for (; val[c]<base; c=shgetc(f));
+		errno = ERANGE;
+		y = lim;
+	}
+done:
+	shunget(f);
+	if (y>=lim) {
+		if (!(lim&1) && !neg) {
+			errno = ERANGE;
+			return lim-1;
+		} else if (y>lim) {
+			errno = ERANGE;
+			return lim;
+		}
+	}
+	return (y^neg)-neg;
+}
diff --git a/sources/android/support/src/wcstox/intscan.h b/sources/android/support/src/wcstox/intscan.h
new file mode 100644
index 0000000..b2087c9
--- /dev/null
+++ b/sources/android/support/src/wcstox/intscan.h
@@ -0,0 +1,8 @@
+#ifndef INTSCAN_H
+#define INTSCAN_H
+
+#include "shgetc.h"
+
+unsigned long long __intscan(struct fake_file_t *, unsigned, int, unsigned long long);
+
+#endif
diff --git a/sources/android/support/src/wcstox/shgetc.c b/sources/android/support/src/wcstox/shgetc.c
new file mode 100644
index 0000000..4bec261
--- /dev/null
+++ b/sources/android/support/src/wcstox/shgetc.c
@@ -0,0 +1,39 @@
+#include "shgetc.h"
+
+#include <stdio.h>
+
+void shinit_wcstring(struct fake_file_t *f, const wchar_t* wcs) {
+    f->rstart = wcs;
+    f->rpos = wcs;
+    f->rend = wcs + wcslen(wcs);
+    f->extra_eof = 0;
+}
+
+int shgetc(struct fake_file_t *f) {
+    if (f->rpos >= f->rend) {
+        f->extra_eof ++;
+        return EOF;
+    }
+    wchar_t wc = *f->rpos++;
+    int ch = (wc < 128) ? (int)wc : '@';
+    return ch;
+}
+
+void shunget(struct fake_file_t *f) {
+    if (f->extra_eof) {
+        f->extra_eof--;
+    } else if (f->rpos > f->rstart) {
+        f->rpos--;
+    }
+}
+
+void shlim(struct fake_file_t *f, off_t lim) {
+    int off = f->rpos - f->rstart;
+    if (off > lim)
+        f->rpos = f->rstart + lim;
+
+}
+
+off_t shcnt(struct fake_file_t *f) {
+    return (off_t)(f->rpos - f->rstart);
+}
diff --git a/sources/android/support/src/wcstox/shgetc.h b/sources/android/support/src/wcstox/shgetc.h
new file mode 100644
index 0000000..72fa870
--- /dev/null
+++ b/sources/android/support/src/wcstox/shgetc.h
@@ -0,0 +1,41 @@
+#ifndef SHGETC_H
+#define SHGETC_H
+
+#include <stdio.h>
+#include <wchar.h>
+
+// Custom stream abstraction, replaces the Musl FILE type for
+// the purpose of scanning integers and floating points.
+// |rstart| is the start of the input string.
+// |rend| is the first wchar_t after it.
+// |rpos| is the current reading position.
+// |extra_eof| is a counter of positions past EOF. Needed because the
+// scanning routines more or less assume an infinite input string, with
+// EOF being returned when shgetc() is being called past the real end
+// of the input stream.
+struct fake_file_t {
+    const wchar_t *rstart, *rpos, *rend;
+    int extra_eof;
+};
+
+// Initialize fake_file_t structure from a wide-char string.
+void shinit_wcstring(struct fake_file_t *, const wchar_t *wcs);
+
+// Get next character from string. This convers the wide character to
+// an 8-bit value, which will be '@' in case of overflow. Returns EOF (-1)
+// in case of end-of-string.
+int shgetc(struct fake_file_t *);
+
+// Back-track one character, must not be called more times than shgetc()
+void shungetc(struct fake_file_t *);
+
+// This will be called with a value of 0 for |lim| to force rewinding
+// to the start of the string. In Musl, this is also used in different
+// parts of the library to impose a local limit on the number of characters
+// that can be retrieved through shgetc(), but this is not necessary here.
+void shlim(struct fake_file_t *, off_t lim);
+
+// Return the number of input characters that were read so far.
+off_t shcnt(struct fake_file_t *);
+
+#endif  // SHGETC_H
diff --git a/sources/android/support/src/wcstox/wcstod.c b/sources/android/support/src/wcstox/wcstod.c
new file mode 100644
index 0000000..6bc8378
--- /dev/null
+++ b/sources/android/support/src/wcstox/wcstod.c
@@ -0,0 +1,35 @@
+#include "shgetc.h"
+#include "floatscan.h"
+#include <wchar.h>
+#include <wctype.h>
+
+static long double wcstox(const wchar_t * restrict s,
+                          wchar_t ** restrict p,
+                          int prec)
+{
+    wchar_t *t = (wchar_t *)s;
+    struct fake_file_t f;
+    while (iswspace(*t)) t++;
+    shinit_wcstring(&f, t);
+    long double y = __floatscan(&f, prec, 1);
+    if (p) {
+        size_t cnt = shcnt(&f);
+        *p = cnt ? t + cnt : (wchar_t *)s;
+    }
+    return y;
+}
+
+float wcstof(const wchar_t *restrict s, wchar_t **restrict p)
+{
+    return wcstox(s, p, 0);
+}
+
+double wcstod(const wchar_t *restrict s, wchar_t **restrict p)
+{
+    return wcstox(s, p, 1);
+}
+
+long double wcstold(const wchar_t *restrict s, wchar_t **restrict p)
+{
+    return wcstox(s, p, 2);
+}
diff --git a/sources/android/support/src/wcstox/wcstol.c b/sources/android/support/src/wcstox/wcstol.c
new file mode 100644
index 0000000..d126cab
--- /dev/null
+++ b/sources/android/support/src/wcstox/wcstol.c
@@ -0,0 +1,61 @@
+#include "shgetc.h"
+#include "intscan.h"
+#include <inttypes.h>
+#include <limits.h>
+#include <wctype.h>
+#include <wchar.h>
+
+static unsigned long long wcstox(const wchar_t * restrict s,
+                                 wchar_t ** restrict p,
+                                 int base,
+                                 unsigned long long lim)
+{
+    struct fake_file_t f;
+    const wchar_t *t = s;
+    while (iswspace(*t)) t++;
+    shinit_wcstring(&f, t);
+    unsigned long long y = __intscan(&f, base, 1, lim);
+    if (p) {
+        size_t cnt = shcnt(&f);
+        *p = cnt ? t + cnt : (const wchar_t *)s;
+    }
+    return y;
+}
+
+unsigned long long wcstoull(const wchar_t *restrict s,
+                            wchar_t **restrict p,
+                            int base)
+{
+    return wcstox(s, p, base, ULLONG_MAX);
+}
+
+long long wcstoll(const wchar_t *restrict s, wchar_t **restrict p, int base)
+{
+    return wcstox(s, p, base, LLONG_MIN);
+}
+
+unsigned long wcstoul(const wchar_t *restrict s,
+                      wchar_t **restrict p,
+                      int base)
+{
+    return wcstox(s, p, base, ULONG_MAX);
+}
+
+long wcstol(const wchar_t *restrict s, wchar_t **restrict p, int base)
+{
+    return wcstox(s, p, base, 0UL+LONG_MIN);
+}
+
+intmax_t wcstoimax(const wchar_t *restrict s,
+                   wchar_t **restrict p,
+                   int base)
+{
+    return wcstoll(s, p, base);
+}
+
+uintmax_t wcstoumax(const wchar_t *restrict s,
+                    wchar_t **restrict p,
+                    int base)
+{
+    return wcstoull(s, p, base);
+}
diff --git a/sources/android/support/tests/Android.mk b/sources/android/support/tests/Android.mk
index 243f70b..4638ac5 100644
--- a/sources/android/support/tests/Android.mk
+++ b/sources/android/support/tests/Android.mk
@@ -13,6 +13,7 @@
 LOCAL_MODULE := android_support_unittests
 LOCAL_SRC_FILES := \
   ctype_unittest.cc \
+  math_unittest.cc \
   stdio_unittest.cc \
   wchar_unittest.cc \
 
diff --git a/sources/android/support/tests/math_unittest.cc b/sources/android/support/tests/math_unittest.cc
new file mode 100644
index 0000000..3036551
--- /dev/null
+++ b/sources/android/support/tests/math_unittest.cc
@@ -0,0 +1,47 @@
+#include <math.h>
+
+#include <minitest/minitest.h>
+
+TEST(math, sizeof_long_double) {
+#ifdef __ANDROID__
+#  ifdef __LP64__
+    EXPECT_EQ(16U, sizeof(long double));
+#  else
+    EXPECT_EQ(8U, sizeof(long double));
+#  endif
+#endif
+}
+
+TEST(math, nexttoward) {
+    double x = 2.0;
+    EXPECT_EQ(x, nexttoward(x, (long double)x));
+    EXPECT_GT(x, nexttoward(x, (long double)(x * 2.)));
+    EXPECT_LT(x, nexttoward(x, (long double)(x - 1.0)));
+}
+
+TEST(math, nexttowardf) {
+    float x = 2.0;
+    EXPECT_EQ(x, nexttowardf(x, (long double)x));
+    EXPECT_GT(x, nexttowardf(x, (long double)(x * 2.)));
+    EXPECT_LT(x, nexttowardf(x, (long double)(x - 1.0)));
+}
+
+TEST(math, nexttowardl) {
+    long double x = 2.0;
+    EXPECT_EQ(x, nexttowardl(x, x));
+    EXPECT_GT(x, nexttowardl(x, x * 2.));
+    EXPECT_LT(x, nexttowardl(x, x - 1.0));
+}
+
+// These functions are not exported on x86 before API level 18!
+TEST(math, scalbln) {
+    EXPECT_EQ(16., scalbln(2.0, (long int)3));
+}
+
+TEST(math, scalblnf) {
+    EXPECT_EQ((float)16., scalblnf((float)2.0, (long int)3));
+}
+
+TEST(math, scalblnl) {
+    EXPECT_EQ((long double)16., scalblnl((long double)2.0, (long int)3));
+}
diff --git a/sources/android/support/tests/minitest/minitest.cc b/sources/android/support/tests/minitest/minitest.cc
index b918006..114ff34 100644
--- a/sources/android/support/tests/minitest/minitest.cc
+++ b/sources/android/support/tests/minitest/minitest.cc
@@ -90,6 +90,7 @@
 MINITEST_STRING_OPERATOR_LL_(unsigned long long, "%llu")
 MINITEST_STRING_OPERATOR_LL_(float, "%f")
 MINITEST_STRING_OPERATOR_LL_(double, "%f")
+MINITEST_STRING_OPERATOR_LL_(long double, "%Lf")
 MINITEST_STRING_OPERATOR_LL_(const void*, "%p")
 
 #undef MINITEST_STRING_OPERATOR_LL_
diff --git a/sources/android/support/tests/minitest/minitest.h b/sources/android/support/tests/minitest/minitest.h
index 4d9a533..5ee86a8 100644
--- a/sources/android/support/tests/minitest/minitest.h
+++ b/sources/android/support/tests/minitest/minitest.h
@@ -175,6 +175,7 @@
   MINITEST_OPERATOR_LL_(unsigned long long);
   MINITEST_OPERATOR_LL_(float);
   MINITEST_OPERATOR_LL_(double);
+  MINITEST_OPERATOR_LL_(long double);
   MINITEST_OPERATOR_LL_(const void*);
 
 #undef MINITEST_OPERATOR_LL_
@@ -399,10 +400,10 @@
              __FILE__,                                                         \
              __LINE__,                                                         \
              #expression);                                                     \
-      printf("actual size   : %d (0x%x)\n",                                    \
+      printf("actual size   : %zu (0x%zx)\n",                                  \
              minitest_actual_len,                                              \
              minitest_actual_len);                                             \
-      printf("expected size : %d (0x%x)\n",                                    \
+      printf("expected size : %zu (0x%zx)\n",                                  \
              minitest_expected_len,                                            \
              minitest_expected_len);                                           \
       minitest_testcase->Failure();                                            \
@@ -410,16 +411,18 @@
       bool minitest_eq =                                                       \
           !memcmp(minitest_expected, minitest_actual, minitest_expected_len);  \
       if (minitest_eq != is_eq) {                                              \
-        printf("%s%s:%s:%d: with expression '%s' of %d bytes\n",               \
+        printf("%s%s:%s:%d: with expression '%s' of %zu bytes\n",              \
                minitest_prefix,                                                \
                minitest_suffix,                                                \
                __FILE__,                                                       \
                __LINE__,                                                       \
                #expression,                                                    \
                minitest_expected_len);                                         \
-        printf("actual   : '%.*s'\n", minitest_expected_len, minitest_actual); \
+        printf("actual   : '%.*s'\n", (int)minitest_expected_len,              \
+                                      minitest_actual);                        \
         printf(                                                                \
-            "expected : '%.*s'\n", minitest_expected_len, minitest_expected);  \
+            "expected : '%.*s'\n", (int)minitest_expected_len,                 \
+                                   minitest_expected);                         \
         minitest_testcase->Failure();                                          \
       }                                                                        \
     }                                                                          \
diff --git a/sources/android/support/tests/run-host.sh b/sources/android/support/tests/run-host.sh
index 365524d..9be7bcf 100755
--- a/sources/android/support/tests/run-host.sh
+++ b/sources/android/support/tests/run-host.sh
@@ -16,6 +16,7 @@
 
 SOURCES="\
   ctype_unittest.cc \
+  math_unittest.cc \
   stdio_unittest.cc \
   wchar_unittest.cc \
 "
diff --git a/sources/android/support/tests/wchar_unittest.cc b/sources/android/support/tests/wchar_unittest.cc
index a440c9f..7b2a77e 100644
--- a/sources/android/support/tests/wchar_unittest.cc
+++ b/sources/android/support/tests/wchar_unittest.cc
@@ -1,8 +1,28 @@
+#include <limits.h>
 #include <stddef.h>
 #include <wchar.h>
 
 #include <minitest/minitest.h>
 
+namespace {
+
+const char* to_cstr(const wchar_t* wcs) {
+    static char buffer[256];
+    size_t n;
+    for (n = 0; n + 1U < sizeof(buffer); ++n) {
+        wchar_t ch = wcs[n];
+        if (!ch)
+            break;
+        buffer[n] = (ch < 128) ? ch : '@';
+    }
+    buffer[n] = '\0';
+    return buffer;
+}
+
+#define ARRAY_SIZE(x)  (sizeof(x) / sizeof(x[0]))
+
+}
+
 TEST(wchar, wchar_limits) {
   ASSERT_EQ(sizeof(__WCHAR_TYPE__), sizeof(wchar_t));
   ASSERT_EQ(sizeof(int), sizeof(wint_t));
@@ -36,3 +56,184 @@
   EXPECT_FALSE(wcsrchr(kString, L'e'));
   EXPECT_EQ(kString + 5, wcsrchr(kString, L'\0'));
 }
+
+TEST(wchar, wcstof) {
+    static const struct {
+        const wchar_t* input;
+        float expected;
+        int expected_len;
+    } kData[] = {
+        { L"123", 123., 3 },
+        { L"123#", 123., 3 },
+        { L"   123 45", 123., 6 },
+        { L"0.2", 0.2, 3 },
+        { L"-0.2", -0.2, 4 },
+        { L"-3.1415926535", -3.1415926535, 13 },
+        { L"+1e+100", 1e100, 7 },
+        { L"0x10000.80", 65536.50, 10 },
+    };
+    for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) {
+        const char* text = to_cstr(kData[n].input);
+        wchar_t* end;
+        TEST_TEXT << text;
+        EXPECT_EQ(kData[n].expected, wcstof(kData[n].input, &end));
+        TEST_TEXT << text;
+        EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input));
+    }
+}
+
+TEST(wchar, wcstod) {
+    static const struct {
+        const wchar_t* input;
+        double expected;
+        int expected_len;
+    } kData[] = {
+        { L"123", 123., 3 },
+        { L"123#", 123., 3 },
+        { L"   123 45", 123., 6 },
+        { L"0.2", 0.2, 3 },
+        { L"-0.2", -0.2, 4 },
+        { L"-3.1415926535", -3.1415926535, 13 },
+        { L"+1e+100", 1e100, 7 },
+        { L"0x10000.80", 65536.50, 10 },
+        { L"1.e60", 1e60, 5 },
+    };
+    for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) {
+        const char* text = to_cstr(kData[n].input);
+        wchar_t* end;
+        TEST_TEXT << text;
+        EXPECT_EQ(kData[n].expected, wcstod(kData[n].input, &end));
+        TEST_TEXT << text;
+        EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input));
+    }
+}
+
+TEST(wchar, wcstold) {
+    static const struct {
+        const wchar_t* input;
+        long double expected;
+        int expected_len;
+    } kData[] = {
+        { L"123", 123., 3 },
+        { L"123#", 123., 3 },
+        { L"   123 45", 123., 6 },
+        { L"0.2", 0.2L, 3 },
+        { L"-0.2", -0.2L, 4 },
+        { L"-3.1415926535", -3.1415926535L, 13 },
+        { L"+1e+100", 1e100L, 7 },
+        { L"0x10000.80", 65536.50L, 10 },
+        { L"+1.e+100", 1e100L, 8 },
+    };
+    for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) {
+        const char* text = to_cstr(kData[n].input);
+        wchar_t* end;
+        TEST_TEXT << text;
+        EXPECT_EQ(kData[n].expected, wcstold(kData[n].input, &end));
+        TEST_TEXT << text;
+        EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input));
+    }
+}
+
+TEST(wchar, wcstol) {
+    static const struct {
+        const wchar_t* input;
+        int base;
+        long expected;
+        int expected_len;
+    } kData[] = {
+        { L"123", 10, 123, 3 },
+        { L"123#", 10, 123, 3 },
+        { L"01000", 0, 512, 5 },
+        { L"   123 45", 0, 123, 6 },
+        { L"  -123", 0, -123, 6 },
+        { L"0x10000", 0, 65536, 7 },
+        { L"12222222222222222222222222222222222", 10, LONG_MAX, 35 },
+        { L"-12222222222222222222222222222222222", 10, LONG_MIN, 36 },
+    };
+    for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) {
+        const char* text = to_cstr(kData[n].input);
+        wchar_t* end;
+        TEST_TEXT << text;
+        EXPECT_EQ(kData[n].expected, wcstol(kData[n].input, &end, kData[n].base));
+        TEST_TEXT << text;
+        EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input));
+    }
+}
+
+TEST(wchar, wcstoul) {
+    static const struct {
+        const wchar_t* input;
+        int base;
+        unsigned long expected;
+        int expected_len;
+    } kData[] = {
+        { L"123", 10, 123, 3 },
+        { L"123#", 10, 123, 3 },
+        { L"01000", 0, 512, 5 },
+        { L"   123 45", 0, 123, 6 },
+        { L"  -123", 0, ULONG_MAX - 123 + 1, 6 },
+        { L"0x10000", 0, 65536, 7 },
+        { L"12222222222222222222222222222222222", 10, ULONG_MAX, 35 },
+        { L"-1", 10, ULONG_MAX, 2 },
+    };
+    for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) {
+        const char* text = to_cstr(kData[n].input);
+        wchar_t* end;
+        TEST_TEXT << text;
+        EXPECT_EQ(kData[n].expected, wcstoul(kData[n].input, &end, kData[n].base));
+        TEST_TEXT << text;
+        EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input));
+    }
+}
+
+TEST(wchar, wcstoll) {
+    static const struct {
+        const wchar_t* input;
+        int base;
+        long long expected;
+        int expected_len;
+    } kData[] = {
+        { L"123", 10, 123, 3 },
+        { L"123#", 10, 123, 3 },
+        { L"01000", 0, 512, 5 },
+        { L"   123 45", 0, 123, 6 },
+        { L"  -123", 0, -123, 6 },
+        { L"0x10000", 0, 65536, 7 },
+        { L"12222222222222222222222222222222222", 10, LLONG_MAX, 35 },
+        { L"-12222222222222222222222222222222222", 10, LLONG_MIN, 36 },
+    };
+    for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) {
+        const char* text = to_cstr(kData[n].input);
+        wchar_t* end;
+        TEST_TEXT << text;
+        EXPECT_EQ(kData[n].expected, wcstoll(kData[n].input, &end, kData[n].base));
+        TEST_TEXT << text;
+        EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input));
+    }
+}
+
+TEST(wchar, wcstoull) {
+    static const struct {
+        const wchar_t* input;
+        int base;
+        unsigned long long expected;
+        int expected_len;
+    } kData[] = {
+        { L"123", 10, 123, 3 },
+        { L"123#", 10, 123, 3 },
+        { L"01000", 0, 512, 5 },
+        { L"   123 45", 0, 123, 6 },
+        { L"  -123", 0, ULLONG_MAX - 123 + 1, 6 },
+        { L"0x10000", 0, 65536, 7 },
+        { L"12222222222222222222222222222222222", 10, ULLONG_MAX, 35 },
+        { L"-1", 10, ULLONG_MAX, 2 },
+    };
+    for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) {
+        const char* text = to_cstr(kData[n].input);
+        wchar_t* end;
+        TEST_TEXT << text;
+        EXPECT_EQ(kData[n].expected, wcstoull(kData[n].input, &end, kData[n].base));
+        TEST_TEXT << text;
+        EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input));
+    }
+}
diff --git a/sources/cxx-stl/gabi++/src/delete.cc b/sources/cxx-stl/gabi++/src/delete.cc
index f567658..ae673fe 100644
--- a/sources/cxx-stl/gabi++/src/delete.cc
+++ b/sources/cxx-stl/gabi++/src/delete.cc
@@ -27,7 +27,6 @@
 //
 // delete.cc: delete operator
 
-#if !defined(LIBCXXABI)
 #include <gabixx_config.h>
 #include <stdlib.h>
 #include <new>
@@ -57,4 +56,3 @@
 {
     ::operator delete(ptr, nt);
 }
-#endif  // !defined(LIBCXXABI)
diff --git a/sources/cxx-stl/gabi++/src/new.cc b/sources/cxx-stl/gabi++/src/new.cc
index 4aea7cc..e074ec0 100644
--- a/sources/cxx-stl/gabi++/src/new.cc
+++ b/sources/cxx-stl/gabi++/src/new.cc
@@ -92,7 +92,6 @@
 
 } // namespace std
 
-#if !defined(LIBCXXABI)
 _GABIXX_WEAK
 void* operator new(std::size_t size) throw(std::bad_alloc) {
   void* space;
@@ -131,4 +130,3 @@
   return ::operator new(size, no);
 }
 
-#endif  // !defined(LIBCXXABI)
diff --git a/sources/cxx-stl/llvm-libc++/Android.mk b/sources/cxx-stl/llvm-libc++/Android.mk
index 287c41b..ca7f76e 100644
--- a/sources/cxx-stl/llvm-libc++/Android.mk
+++ b/sources/cxx-stl/llvm-libc++/Android.mk
@@ -8,6 +8,7 @@
 #
 
 LIBCXX_FORCE_REBUILD := $(strip $(LIBCXX_FORCE_REBUILD))
+LIBCXX_USE_LIBCXXABI := $(strip $(LIBCXX_USE_LIBCXXABI))
 ifndef LIBCXX_FORCE_REBUILD
   ifeq (,$(strip $(wildcard $(LOCAL_PATH)/libs/$(TARGET_ARCH_ABI)/libc++_static$(TARGET_LIB_EXTENSION))))
     $(call __ndk_info,WARNING: Rebuilding libc++ libraries from sources!)
@@ -55,8 +56,10 @@
 
 llvm_libc++_cxxflags := $(llvm_libc++_export_cxxflags)
 
+
+ifneq ($(LIBCXX_USE_LIBCXXABI),true)
+
 # Gabi++ emulates libcxxabi when building libcxx.
-#
 llvm_libc++_cxxflags += -DLIBCXXABI=1
 
 # Find the GAbi++ sources to include them here.
@@ -79,6 +82,27 @@
 llvm_libc++_includes += $(libgabi++_c_includes)
 llvm_libc++_export_includes += $(libgabi++_c_includes)
 
+else
+# LIBCXX_USE_LIBCXXABI : true
+
+libcxxabi_sources_dir := $(strip $(wildcard $(LOCAL_PATH)/../llvm-libc++abi))
+ifdef libcxxabi_sources_dir
+  libcxxabi_sources_prefix := ../llvm-libc++abi
+else
+  libcxxabi_sources_dir := $(strip $(wildcard $(NDK_ROOT)/sources/cxx-stl/llvm-libc++abi))
+  ifndef libcxxabi_sources_dir
+    $(error Can't find libcxxabi sources directory!!)
+  endif
+  libcxxabi_sources_prefix := $(libcxxabi_sources_dir)
+endif
+
+include $(libcxxabi_sources_dir)/sources.mk
+llvm_libc++_sources += $(addprefix $(libcxxabi_sources_prefix:%/=%)/,$(libcxxabi_src_files))
+llvm_libc++_includes += $(libcxxabi_c_includes)
+llvm_libc++_export_includes += $(libcxxabi_c_includes)
+
+endif
+
 ifneq ($(LIBCXX_FORCE_REBUILD),true)
 
 $(call ndk_log,Using prebuilt libc++ libraries)
diff --git a/sources/cxx-stl/llvm-libc++/export_symbols.txt b/sources/cxx-stl/llvm-libc++/export_symbols.txt
new file mode 100644
index 0000000..3ac4040
--- /dev/null
+++ b/sources/cxx-stl/llvm-libc++/export_symbols.txt
@@ -0,0 +1,2290 @@
+{
+  global:
+    /* libc++abi exports */
+    _Unwind_DeleteException;
+    _Unwind_RaiseException;
+    _Unwind_Resume;
+    _Unwind_Complete;
+    _Unwind_VRS_Get;
+    _Unwind_VRS_Pop;
+    _Unwind_VRS_Set;
+    _ZNKSt10bad_typeid4whatEv;
+    _ZNKSt11logic_error4whatEv;
+    _ZNKSt13bad_exception4whatEv;
+    _ZNKSt13runtime_error4whatEv;
+    _ZNKSt20bad_array_new_length4whatEv;
+    _ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv;
+    _ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv;
+    _ZNKSt3__121__basic_string_commonILb1EE20__throw_out_of_rangeEv;
+    _ZNKSt8bad_cast4whatEv;
+    _ZNKSt9bad_alloc4whatEv;
+    _ZNKSt9exception4whatEv;
+    _ZNSt10bad_typeidC1Ev;
+    _ZNSt10bad_typeidC2Ev;
+    _ZNSt10bad_typeidD0Ev;
+    _ZNSt10bad_typeidD1Ev;
+    _ZNSt10bad_typeidD2Ev;
+    _ZNSt11logic_errorD0Ev;
+    _ZNSt11logic_errorD1Ev;
+    _ZNSt11logic_errorD2Ev;
+    _ZNSt11range_errorD0Ev;
+    _ZNSt11range_errorD1Ev;
+    _ZNSt11range_errorD2Ev;
+    _ZNSt12domain_errorD0Ev;
+    _ZNSt12domain_errorD1Ev;
+    _ZNSt12domain_errorD2Ev;
+    _ZNSt12length_errorD0Ev;
+    _ZNSt12length_errorD1Ev;
+    _ZNSt12length_errorD2Ev;
+    _ZNSt12out_of_rangeD0Ev;
+    _ZNSt12out_of_rangeD1Ev;
+    _ZNSt12out_of_rangeD2Ev;
+    _ZNSt13bad_exceptionC2ERKS_;
+    _ZNSt13bad_exceptionD0Ev;
+    _ZNSt13bad_exceptionD1Ev;
+    _ZNSt13bad_exceptionD2Ev;
+    _ZNSt13runtime_errorD0Ev;
+    _ZNSt13runtime_errorD1Ev;
+    _ZNSt13runtime_errorD2Ev;
+    _ZNSt14overflow_errorD0Ev;
+    _ZNSt14overflow_errorD1Ev;
+    _ZNSt14overflow_errorD2Ev;
+    _ZNSt15underflow_errorD0Ev;
+    _ZNSt15underflow_errorD1Ev;
+    _ZNSt15underflow_errorD2Ev;
+    _ZNSt16invalid_argumentD0Ev;
+    _ZNSt16invalid_argumentD1Ev;
+    _ZNSt16invalid_argumentD2Ev;
+    _ZNSt20bad_array_new_lengthC1Ev;
+    _ZNSt20bad_array_new_lengthC2Ev;
+    _ZNSt20bad_array_new_lengthD0Ev;
+    _ZNSt20bad_array_new_lengthD1Ev;
+    _ZNSt20bad_array_new_lengthD2Ev;
+    _ZNSt8bad_castC1Ev;
+    _ZNSt8bad_castC2Ev;
+    _ZNSt8bad_castD0Ev;
+    _ZNSt8bad_castD1Ev;
+    _ZNSt8bad_castD2Ev;
+    _ZNSt9bad_allocC1Ev;
+    _ZNSt9bad_allocC2Ev;
+    _ZNSt9bad_allocD0Ev;
+    _ZNSt9bad_allocD1Ev;
+    _ZNSt9bad_allocD2Ev;
+    _ZNSt9exceptionC2ERKS_;
+    _ZNSt9exceptionD0Ev;
+    _ZNSt9exceptionD1Ev;
+    _ZNSt9exceptionD2Ev;
+    _ZNSt9type_infoD0Ev;
+    _ZNSt9type_infoD1Ev;
+    _ZNSt9type_infoD2Ev;
+    _ZSt10unexpectedv;
+    _ZSt13get_terminatev;
+    _ZSt13set_terminatePFvvE;
+    _ZSt14get_unexpectedv;
+    _ZSt14set_unexpectedPFvvE;
+    _ZSt15get_new_handlerv;
+    _ZSt15set_new_handlerPFvvE;
+    _ZSt9terminatev;
+    _ZTIDi;
+    _ZTIDn;
+    _ZTIDs;
+    _ZTIN10__cxxabiv116__enum_type_infoE;
+    _ZTIN10__cxxabiv117__array_type_infoE;
+    _ZTIN10__cxxabiv117__class_type_infoE;
+    _ZTIN10__cxxabiv117__pbase_type_infoE;
+    _ZTIN10__cxxabiv119__pointer_type_infoE;
+    _ZTIN10__cxxabiv120__function_type_infoE;
+    _ZTIN10__cxxabiv120__si_class_type_infoE;
+    _ZTIN10__cxxabiv121__vmi_class_type_infoE;
+    _ZTIN10__cxxabiv123__fundamental_type_infoE;
+    _ZTIN10__cxxabiv129__pointer_to_member_type_infoE;
+    _ZTIPDi;
+    _ZTIPDn;
+    _ZTIPDs;
+    _ZTIPKDi;
+    _ZTIPKDn;
+    _ZTIPKDs;
+    _ZTIPKa;
+    _ZTIPKb;
+    _ZTIPKc;
+    _ZTIPKd;
+    _ZTIPKe;
+    _ZTIPKf;
+    _ZTIPKh;
+    _ZTIPKi;
+    _ZTIPKj;
+    _ZTIPKl;
+    _ZTIPKm;
+    _ZTIPKs;
+    _ZTIPKt;
+    _ZTIPKv;
+    _ZTIPKw;
+    _ZTIPKx;
+    _ZTIPKy;
+    _ZTIPa;
+    _ZTIPb;
+    _ZTIPc;
+    _ZTIPd;
+    _ZTIPe;
+    _ZTIPf;
+    _ZTIPh;
+    _ZTIPi;
+    _ZTIPj;
+    _ZTIPl;
+    _ZTIPm;
+    _ZTIPs;
+    _ZTIPt;
+    _ZTIPv;
+    _ZTIPw;
+    _ZTIPx;
+    _ZTIPy;
+    _ZTISt10bad_typeid;
+    _ZTISt11logic_error;
+    _ZTISt11range_error;
+    _ZTISt12domain_error;
+    _ZTISt12length_error;
+    _ZTISt12out_of_range;
+    _ZTISt13bad_exception;
+    _ZTISt13runtime_error;
+    _ZTISt14overflow_error;
+    _ZTISt15underflow_error;
+    _ZTISt16invalid_argument;
+    _ZTISt20bad_array_new_length;
+    _ZTISt8bad_cast;
+    _ZTISt9bad_alloc;
+    _ZTISt9exception;
+    _ZTISt9type_info;
+    _ZTIa;
+    _ZTIb;
+    _ZTIc;
+    _ZTId;
+    _ZTIe;
+    _ZTIf;
+    _ZTIh;
+    _ZTIi;
+    _ZTIj;
+    _ZTIl;
+    _ZTIm;
+    _ZTIs;
+    _ZTIt;
+    _ZTIv;
+    _ZTIw;
+    _ZTIx;
+    _ZTIy;
+    _ZTSDi;
+    _ZTSDn;
+    _ZTSDs;
+    _ZTSN10__cxxabiv116__enum_type_infoE;
+    _ZTSN10__cxxabiv117__array_type_infoE;
+    _ZTSN10__cxxabiv117__class_type_infoE;
+    _ZTSN10__cxxabiv117__pbase_type_infoE;
+    _ZTSN10__cxxabiv119__pointer_type_infoE;
+    _ZTSN10__cxxabiv120__function_type_infoE;
+    _ZTSN10__cxxabiv120__si_class_type_infoE;
+    _ZTSN10__cxxabiv121__vmi_class_type_infoE;
+    _ZTSN10__cxxabiv123__fundamental_type_infoE;
+    _ZTSN10__cxxabiv129__pointer_to_member_type_infoE;
+    _ZTSPDi;
+    _ZTSPDn;
+    _ZTSPDs;
+    _ZTSPKDi;
+    _ZTSPKDn;
+    _ZTSPKDs;
+    _ZTSPKa;
+    _ZTSPKb;
+    _ZTSPKc;
+    _ZTSPKd;
+    _ZTSPKe;
+    _ZTSPKf;
+    _ZTSPKh;
+    _ZTSPKi;
+    _ZTSPKj;
+    _ZTSPKl;
+    _ZTSPKm;
+    _ZTSPKs;
+    _ZTSPKt;
+    _ZTSPKv;
+    _ZTSPKw;
+    _ZTSPKx;
+    _ZTSPKy;
+    _ZTSPa;
+    _ZTSPb;
+    _ZTSPc;
+    _ZTSPd;
+    _ZTSPe;
+    _ZTSPf;
+    _ZTSPh;
+    _ZTSPi;
+    _ZTSPj;
+    _ZTSPl;
+    _ZTSPm;
+    _ZTSPs;
+    _ZTSPt;
+    _ZTSPv;
+    _ZTSPw;
+    _ZTSPx;
+    _ZTSPy;
+    _ZTSSt10bad_typeid;
+    _ZTSSt11logic_error;
+    _ZTSSt11range_error;
+    _ZTSSt12domain_error;
+    _ZTSSt12length_error;
+    _ZTSSt12out_of_range;
+    _ZTSSt13bad_exception;
+    _ZTSSt13runtime_error;
+    _ZTSSt14overflow_error;
+    _ZTSSt15underflow_error;
+    _ZTSSt16invalid_argument;
+    _ZTSSt20bad_array_new_length;
+    _ZTSSt8bad_cast;
+    _ZTSSt9bad_alloc;
+    _ZTSSt9exception;
+    _ZTSSt9type_info;
+    _ZTSa;
+    _ZTSb;
+    _ZTSc;
+    _ZTSd;
+    _ZTSe;
+    _ZTSf;
+    _ZTSh;
+    _ZTSi;
+    _ZTSj;
+    _ZTSl;
+    _ZTSm;
+    _ZTSs;
+    _ZTSt;
+    _ZTSv;
+    _ZTSw;
+    _ZTSx;
+    _ZTSy;
+    _ZTVN10__cxxabiv116__enum_type_infoE;
+    _ZTVN10__cxxabiv117__array_type_infoE;
+    _ZTVN10__cxxabiv117__class_type_infoE;
+    _ZTVN10__cxxabiv117__pbase_type_infoE;
+    _ZTVN10__cxxabiv119__pointer_type_infoE;
+    _ZTVN10__cxxabiv120__function_type_infoE;
+    _ZTVN10__cxxabiv120__si_class_type_infoE;
+    _ZTVN10__cxxabiv121__vmi_class_type_infoE;
+    _ZTVN10__cxxabiv123__fundamental_type_infoE;
+    _ZTVN10__cxxabiv129__pointer_to_member_type_infoE;
+    _ZTVSt10bad_typeid;
+    _ZTVSt11logic_error;
+    _ZTVSt11range_error;
+    _ZTVSt12domain_error;
+    _ZTVSt12length_error;
+    _ZTVSt12out_of_range;
+    _ZTVSt13bad_exception;
+    _ZTVSt13runtime_error;
+    _ZTVSt14overflow_error;
+    _ZTVSt15underflow_error;
+    _ZTVSt16invalid_argument;
+    _ZTVSt20bad_array_new_length;
+    _ZTVSt8bad_cast;
+    _ZTVSt9bad_alloc;
+    _ZTVSt9exception;
+    _ZTVSt9type_info;
+    _ZdaPv;
+    _ZdaPvRKSt9nothrow_t;
+    _ZdlPv;
+    _ZdlPvRKSt9nothrow_t;
+    _Znaj;
+    _ZnajRKSt9nothrow_t;
+    _Znwj;
+    _ZnwjRKSt9nothrow_t;
+    __aeabi_unwind_cpp_pr0;
+    __aeabi_unwind_cpp_pr1;
+    __aeabi_unwind_cpp_pr2;
+    __cxa_allocate_dependent_exception;
+    __cxa_allocate_exception;
+    __cxa_bad_cast;
+    __cxa_bad_typeid;
+    __cxa_begin_catch;
+    __cxa_begin_cleanup;
+    __cxa_call_unexpected;
+    __cxa_current_exception_type;
+    __cxa_current_primary_exception;
+    __cxa_decrement_exception_refcount;
+    __cxa_deleted_virtual;
+    __cxa_demangle;
+    __cxa_end_catch;
+    __cxa_end_cleanup;
+    __cxa_free_dependent_exception;
+    __cxa_free_exception;
+    __cxa_get_exception_ptr;
+    __cxa_get_globals;
+    __cxa_get_globals_fast;
+    __cxa_guard_abort;
+    __cxa_guard_acquire;
+    __cxa_guard_release;
+    __cxa_increment_exception_refcount;
+    __cxa_pure_virtual;
+    __cxa_rethrow;
+    __cxa_rethrow_primary_exception;
+    __cxa_terminate_handler;
+    __cxa_throw;
+    __cxa_uncaught_exception;
+    __cxa_unexpected_handler;
+    __cxa_vec_cctor;
+    __cxa_vec_cleanup;
+    __cxa_vec_ctor;
+    __cxa_vec_delete;
+    __cxa_vec_delete2;
+    __cxa_vec_delete3;
+    __cxa_vec_dtor;
+    __cxa_vec_new;
+    __cxa_vec_new2;
+    __cxa_vec_new3;
+    __dynamic_cast;
+    __gxx_personality_v0;
+
+    /* libc++ exports */
+    _ZdaPv;
+    _ZdaPvRKSt9nothrow_t;
+    _ZdlPv;
+    _ZdlPvRKSt9nothrow_t;
+    _ZGVZNKSt3__120__time_get_c_storageIcE3__cEvE1s;
+    _ZGVZNKSt3__120__time_get_c_storageIcE3__rEvE1s;
+    _ZGVZNKSt3__120__time_get_c_storageIcE3__xEvE1s;
+    _ZGVZNKSt3__120__time_get_c_storageIcE3__XEvE1s;
+    _ZGVZNKSt3__120__time_get_c_storageIcE7__am_pmEvE5am_pm;
+    _ZGVZNKSt3__120__time_get_c_storageIcE7__weeksEvE5weeks;
+    _ZGVZNKSt3__120__time_get_c_storageIcE8__monthsEvE6months;
+    _ZGVZNKSt3__120__time_get_c_storageIwE3__cEvE1s;
+    _ZGVZNKSt3__120__time_get_c_storageIwE3__rEvE1s;
+    _ZGVZNKSt3__120__time_get_c_storageIwE3__xEvE1s;
+    _ZGVZNKSt3__120__time_get_c_storageIwE3__XEvE1s;
+    _ZGVZNKSt3__120__time_get_c_storageIwE7__am_pmEvE5am_pm;
+    _ZGVZNKSt3__120__time_get_c_storageIwE7__weeksEvE5weeks;
+    _ZGVZNKSt3__120__time_get_c_storageIwE8__monthsEvE6months;
+    _Znaj;
+    _ZnajRKSt9nothrow_t;
+    _ZNKSt16nested_exception14rethrow_nestedEv;
+    _ZNKSt3__110error_code7messageEv;
+    _ZNKSt3__110moneypunctIcLb0EE11do_groupingEv;
+    _ZNKSt3__110moneypunctIcLb0EE13do_neg_formatEv;
+    _ZNKSt3__110moneypunctIcLb0EE13do_pos_formatEv;
+    _ZNKSt3__110moneypunctIcLb0EE14do_curr_symbolEv;
+    _ZNKSt3__110moneypunctIcLb0EE14do_frac_digitsEv;
+    _ZNKSt3__110moneypunctIcLb0EE16do_decimal_pointEv;
+    _ZNKSt3__110moneypunctIcLb0EE16do_negative_signEv;
+    _ZNKSt3__110moneypunctIcLb0EE16do_positive_signEv;
+    _ZNKSt3__110moneypunctIcLb0EE16do_thousands_sepEv;
+    _ZNKSt3__110moneypunctIcLb1EE11do_groupingEv;
+    _ZNKSt3__110moneypunctIcLb1EE13do_neg_formatEv;
+    _ZNKSt3__110moneypunctIcLb1EE13do_pos_formatEv;
+    _ZNKSt3__110moneypunctIcLb1EE14do_curr_symbolEv;
+    _ZNKSt3__110moneypunctIcLb1EE14do_frac_digitsEv;
+    _ZNKSt3__110moneypunctIcLb1EE16do_decimal_pointEv;
+    _ZNKSt3__110moneypunctIcLb1EE16do_negative_signEv;
+    _ZNKSt3__110moneypunctIcLb1EE16do_positive_signEv;
+    _ZNKSt3__110moneypunctIcLb1EE16do_thousands_sepEv;
+    _ZNKSt3__110moneypunctIwLb0EE11do_groupingEv;
+    _ZNKSt3__110moneypunctIwLb0EE13do_neg_formatEv;
+    _ZNKSt3__110moneypunctIwLb0EE13do_pos_formatEv;
+    _ZNKSt3__110moneypunctIwLb0EE14do_curr_symbolEv;
+    _ZNKSt3__110moneypunctIwLb0EE14do_frac_digitsEv;
+    _ZNKSt3__110moneypunctIwLb0EE16do_decimal_pointEv;
+    _ZNKSt3__110moneypunctIwLb0EE16do_negative_signEv;
+    _ZNKSt3__110moneypunctIwLb0EE16do_positive_signEv;
+    _ZNKSt3__110moneypunctIwLb0EE16do_thousands_sepEv;
+    _ZNKSt3__110moneypunctIwLb1EE11do_groupingEv;
+    _ZNKSt3__110moneypunctIwLb1EE13do_neg_formatEv;
+    _ZNKSt3__110moneypunctIwLb1EE13do_pos_formatEv;
+    _ZNKSt3__110moneypunctIwLb1EE14do_curr_symbolEv;
+    _ZNKSt3__110moneypunctIwLb1EE14do_frac_digitsEv;
+    _ZNKSt3__110moneypunctIwLb1EE16do_decimal_pointEv;
+    _ZNKSt3__110moneypunctIwLb1EE16do_negative_signEv;
+    _ZNKSt3__110moneypunctIwLb1EE16do_positive_signEv;
+    _ZNKSt3__110moneypunctIwLb1EE16do_thousands_sepEv;
+    _ZNKSt3__110__time_put8__do_putEPcRS1_PK2tmcc;
+    _ZNKSt3__110__time_put8__do_putEPwRS1_PK2tmcc;
+    _ZNKSt3__111__libcpp_db15__decrementableEPKv;
+    _ZNKSt3__111__libcpp_db15__find_c_from_iEPv;
+    _ZNKSt3__111__libcpp_db15__subscriptableEPKvi;
+    _ZNKSt3__111__libcpp_db17__dereferenceableEPKv;
+    _ZNKSt3__111__libcpp_db17__find_c_and_lockEPv;
+    _ZNKSt3__111__libcpp_db22__less_than_comparableEPKvS2_;
+    _ZNKSt3__111__libcpp_db6unlockEv;
+    _ZNKSt3__111__libcpp_db8__find_cEPv;
+    _ZNKSt3__111__libcpp_db9__addableEPKvi;
+    _ZNKSt3__112bad_weak_ptr4whatEv;
+    _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE12find_last_ofEPKcjj;
+    _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13find_first_ofEPKcjj;
+    _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16find_last_not_ofEPKcjj;
+    _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE17find_first_not_ofEPKcjj;
+    _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE2atEj;
+    _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4copyEPcjj;
+    _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4findEcj;
+    _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4findEPKcjj;
+    _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5rfindEcj;
+    _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5rfindEPKcjj;
+    _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEjjPKc;
+    _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEjjPKcj;
+    _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEjjRKS5_jj;
+    _ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEPKc;
+    _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE12find_last_ofEPKwjj;
+    _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE13find_first_ofEPKwjj;
+    _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE16find_last_not_ofEPKwjj;
+    _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE17find_first_not_ofEPKwjj;
+    _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE2atEj;
+    _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE4copyEPwjj;
+    _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE4findEPKwjj;
+    _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE4findEwj;
+    _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE5rfindEPKwjj;
+    _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE5rfindEwj;
+    _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7compareEjjPKw;
+    _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7compareEjjPKwj;
+    _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7compareEjjRKS5_jj;
+    _ZNKSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7compareEPKw;
+    _ZNKSt3__112ctype_bynameIcE10do_tolowerEc;
+    _ZNKSt3__112ctype_bynameIcE10do_tolowerEPcPKc;
+    _ZNKSt3__112ctype_bynameIcE10do_toupperEc;
+    _ZNKSt3__112ctype_bynameIcE10do_toupperEPcPKc;
+    _ZNKSt3__112ctype_bynameIwE10do_scan_isEtPKwS3_;
+    _ZNKSt3__112ctype_bynameIwE10do_tolowerEPwPKw;
+    _ZNKSt3__112ctype_bynameIwE10do_tolowerEw;
+    _ZNKSt3__112ctype_bynameIwE10do_toupperEPwPKw;
+    _ZNKSt3__112ctype_bynameIwE10do_toupperEw;
+    _ZNKSt3__112ctype_bynameIwE11do_scan_notEtPKwS3_;
+    _ZNKSt3__112ctype_bynameIwE5do_isEPKwS3_Pt;
+    _ZNKSt3__112ctype_bynameIwE5do_isEtw;
+    _ZNKSt3__112ctype_bynameIwE8do_widenEc;
+    _ZNKSt3__112ctype_bynameIwE8do_widenEPKcS3_Pw;
+    _ZNKSt3__112ctype_bynameIwE9do_narrowEPKwS3_cPc;
+    _ZNKSt3__112ctype_bynameIwE9do_narrowEwc;
+    _ZNKSt3__112strstreambuf6pcountEv;
+    _ZNKSt3__113random_device7entropyEv;
+    _ZNKSt3__114__codecvt_utf8IDiE10do_unshiftER9mbstate_tPcS4_RS4_;
+    _ZNKSt3__114__codecvt_utf8IDiE11do_encodingEv;
+    _ZNKSt3__114__codecvt_utf8IDiE13do_max_lengthEv;
+    _ZNKSt3__114__codecvt_utf8IDiE16do_always_noconvEv;
+    _ZNKSt3__114__codecvt_utf8IDiE5do_inER9mbstate_tPKcS5_RS5_PDiS7_RS7_;
+    _ZNKSt3__114__codecvt_utf8IDiE6do_outER9mbstate_tPKDiS5_RS5_PcS7_RS7_;
+    _ZNKSt3__114__codecvt_utf8IDiE9do_lengthER9mbstate_tPKcS5_j;
+    _ZNKSt3__114__codecvt_utf8IDsE10do_unshiftER9mbstate_tPcS4_RS4_;
+    _ZNKSt3__114__codecvt_utf8IDsE11do_encodingEv;
+    _ZNKSt3__114__codecvt_utf8IDsE13do_max_lengthEv;
+    _ZNKSt3__114__codecvt_utf8IDsE16do_always_noconvEv;
+    _ZNKSt3__114__codecvt_utf8IDsE5do_inER9mbstate_tPKcS5_RS5_PDsS7_RS7_;
+    _ZNKSt3__114__codecvt_utf8IDsE6do_outER9mbstate_tPKDsS5_RS5_PcS7_RS7_;
+    _ZNKSt3__114__codecvt_utf8IDsE9do_lengthER9mbstate_tPKcS5_j;
+    _ZNKSt3__114__codecvt_utf8IwE10do_unshiftER9mbstate_tPcS4_RS4_;
+    _ZNKSt3__114__codecvt_utf8IwE11do_encodingEv;
+    _ZNKSt3__114__codecvt_utf8IwE13do_max_lengthEv;
+    _ZNKSt3__114__codecvt_utf8IwE16do_always_noconvEv;
+    _ZNKSt3__114__codecvt_utf8IwE5do_inER9mbstate_tPKcS5_RS5_PwS7_RS7_;
+    _ZNKSt3__114__codecvt_utf8IwE6do_outER9mbstate_tPKwS5_RS5_PcS7_RS7_;
+    _ZNKSt3__114__codecvt_utf8IwE9do_lengthER9mbstate_tPKcS5_j;
+    _ZNKSt3__114collate_bynameIcE10do_compareEPKcS3_S3_S3_;
+    _ZNKSt3__114collate_bynameIcE12do_transformEPKcS3_;
+    _ZNKSt3__114collate_bynameIwE10do_compareEPKwS3_S3_S3_;
+    _ZNKSt3__114collate_bynameIwE12do_transformEPKwS3_;
+    _ZNKSt3__114error_category10equivalentEiRKNS_15error_conditionE;
+    _ZNKSt3__114error_category10equivalentERKNS_10error_codeEi;
+    _ZNKSt3__114error_category23default_error_conditionEi;
+    _ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE6getlocEv;
+    _ZNKSt3__115basic_streambufIwNS_11char_traitsIwEEE6getlocEv;
+    _ZNKSt3__115__codecvt_utf16IDiLb0EE10do_unshiftER9mbstate_tPcS4_RS4_;
+    _ZNKSt3__115__codecvt_utf16IDiLb0EE11do_encodingEv;
+    _ZNKSt3__115__codecvt_utf16IDiLb0EE13do_max_lengthEv;
+    _ZNKSt3__115__codecvt_utf16IDiLb0EE16do_always_noconvEv;
+    _ZNKSt3__115__codecvt_utf16IDiLb0EE5do_inER9mbstate_tPKcS5_RS5_PDiS7_RS7_;
+    _ZNKSt3__115__codecvt_utf16IDiLb0EE6do_outER9mbstate_tPKDiS5_RS5_PcS7_RS7_;
+    _ZNKSt3__115__codecvt_utf16IDiLb0EE9do_lengthER9mbstate_tPKcS5_j;
+    _ZNKSt3__115__codecvt_utf16IDiLb1EE10do_unshiftER9mbstate_tPcS4_RS4_;
+    _ZNKSt3__115__codecvt_utf16IDiLb1EE11do_encodingEv;
+    _ZNKSt3__115__codecvt_utf16IDiLb1EE13do_max_lengthEv;
+    _ZNKSt3__115__codecvt_utf16IDiLb1EE16do_always_noconvEv;
+    _ZNKSt3__115__codecvt_utf16IDiLb1EE5do_inER9mbstate_tPKcS5_RS5_PDiS7_RS7_;
+    _ZNKSt3__115__codecvt_utf16IDiLb1EE6do_outER9mbstate_tPKDiS5_RS5_PcS7_RS7_;
+    _ZNKSt3__115__codecvt_utf16IDiLb1EE9do_lengthER9mbstate_tPKcS5_j;
+    _ZNKSt3__115__codecvt_utf16IDsLb0EE10do_unshiftER9mbstate_tPcS4_RS4_;
+    _ZNKSt3__115__codecvt_utf16IDsLb0EE11do_encodingEv;
+    _ZNKSt3__115__codecvt_utf16IDsLb0EE13do_max_lengthEv;
+    _ZNKSt3__115__codecvt_utf16IDsLb0EE16do_always_noconvEv;
+    _ZNKSt3__115__codecvt_utf16IDsLb0EE5do_inER9mbstate_tPKcS5_RS5_PDsS7_RS7_;
+    _ZNKSt3__115__codecvt_utf16IDsLb0EE6do_outER9mbstate_tPKDsS5_RS5_PcS7_RS7_;
+    _ZNKSt3__115__codecvt_utf16IDsLb0EE9do_lengthER9mbstate_tPKcS5_j;
+    _ZNKSt3__115__codecvt_utf16IDsLb1EE10do_unshiftER9mbstate_tPcS4_RS4_;
+    _ZNKSt3__115__codecvt_utf16IDsLb1EE11do_encodingEv;
+    _ZNKSt3__115__codecvt_utf16IDsLb1EE13do_max_lengthEv;
+    _ZNKSt3__115__codecvt_utf16IDsLb1EE16do_always_noconvEv;
+    _ZNKSt3__115__codecvt_utf16IDsLb1EE5do_inER9mbstate_tPKcS5_RS5_PDsS7_RS7_;
+    _ZNKSt3__115__codecvt_utf16IDsLb1EE6do_outER9mbstate_tPKDsS5_RS5_PcS7_RS7_;
+    _ZNKSt3__115__codecvt_utf16IDsLb1EE9do_lengthER9mbstate_tPKcS5_j;
+    _ZNKSt3__115__codecvt_utf16IwLb0EE10do_unshiftER9mbstate_tPcS4_RS4_;
+    _ZNKSt3__115__codecvt_utf16IwLb0EE11do_encodingEv;
+    _ZNKSt3__115__codecvt_utf16IwLb0EE13do_max_lengthEv;
+    _ZNKSt3__115__codecvt_utf16IwLb0EE16do_always_noconvEv;
+    _ZNKSt3__115__codecvt_utf16IwLb0EE5do_inER9mbstate_tPKcS5_RS5_PwS7_RS7_;
+    _ZNKSt3__115__codecvt_utf16IwLb0EE6do_outER9mbstate_tPKwS5_RS5_PcS7_RS7_;
+    _ZNKSt3__115__codecvt_utf16IwLb0EE9do_lengthER9mbstate_tPKcS5_j;
+    _ZNKSt3__115__codecvt_utf16IwLb1EE10do_unshiftER9mbstate_tPcS4_RS4_;
+    _ZNKSt3__115__codecvt_utf16IwLb1EE11do_encodingEv;
+    _ZNKSt3__115__codecvt_utf16IwLb1EE13do_max_lengthEv;
+    _ZNKSt3__115__codecvt_utf16IwLb1EE16do_always_noconvEv;
+    _ZNKSt3__115__codecvt_utf16IwLb1EE5do_inER9mbstate_tPKcS5_RS5_PwS7_RS7_;
+    _ZNKSt3__115__codecvt_utf16IwLb1EE6do_outER9mbstate_tPKwS5_RS5_PcS7_RS7_;
+    _ZNKSt3__115__codecvt_utf16IwLb1EE9do_lengthER9mbstate_tPKcS5_j;
+    _ZNKSt3__115error_condition7messageEv;
+    _ZNKSt3__117moneypunct_bynameIcLb0EE11do_groupingEv;
+    _ZNKSt3__117moneypunct_bynameIcLb0EE13do_neg_formatEv;
+    _ZNKSt3__117moneypunct_bynameIcLb0EE13do_pos_formatEv;
+    _ZNKSt3__117moneypunct_bynameIcLb0EE14do_curr_symbolEv;
+    _ZNKSt3__117moneypunct_bynameIcLb0EE14do_frac_digitsEv;
+    _ZNKSt3__117moneypunct_bynameIcLb0EE16do_decimal_pointEv;
+    _ZNKSt3__117moneypunct_bynameIcLb0EE16do_negative_signEv;
+    _ZNKSt3__117moneypunct_bynameIcLb0EE16do_positive_signEv;
+    _ZNKSt3__117moneypunct_bynameIcLb0EE16do_thousands_sepEv;
+    _ZNKSt3__117moneypunct_bynameIcLb1EE11do_groupingEv;
+    _ZNKSt3__117moneypunct_bynameIcLb1EE13do_neg_formatEv;
+    _ZNKSt3__117moneypunct_bynameIcLb1EE13do_pos_formatEv;
+    _ZNKSt3__117moneypunct_bynameIcLb1EE14do_curr_symbolEv;
+    _ZNKSt3__117moneypunct_bynameIcLb1EE14do_frac_digitsEv;
+    _ZNKSt3__117moneypunct_bynameIcLb1EE16do_decimal_pointEv;
+    _ZNKSt3__117moneypunct_bynameIcLb1EE16do_negative_signEv;
+    _ZNKSt3__117moneypunct_bynameIcLb1EE16do_positive_signEv;
+    _ZNKSt3__117moneypunct_bynameIcLb1EE16do_thousands_sepEv;
+    _ZNKSt3__117moneypunct_bynameIwLb0EE11do_groupingEv;
+    _ZNKSt3__117moneypunct_bynameIwLb0EE13do_neg_formatEv;
+    _ZNKSt3__117moneypunct_bynameIwLb0EE13do_pos_formatEv;
+    _ZNKSt3__117moneypunct_bynameIwLb0EE14do_curr_symbolEv;
+    _ZNKSt3__117moneypunct_bynameIwLb0EE14do_frac_digitsEv;
+    _ZNKSt3__117moneypunct_bynameIwLb0EE16do_decimal_pointEv;
+    _ZNKSt3__117moneypunct_bynameIwLb0EE16do_negative_signEv;
+    _ZNKSt3__117moneypunct_bynameIwLb0EE16do_positive_signEv;
+    _ZNKSt3__117moneypunct_bynameIwLb0EE16do_thousands_sepEv;
+    _ZNKSt3__117moneypunct_bynameIwLb1EE11do_groupingEv;
+    _ZNKSt3__117moneypunct_bynameIwLb1EE13do_neg_formatEv;
+    _ZNKSt3__117moneypunct_bynameIwLb1EE13do_pos_formatEv;
+    _ZNKSt3__117moneypunct_bynameIwLb1EE14do_curr_symbolEv;
+    _ZNKSt3__117moneypunct_bynameIwLb1EE14do_frac_digitsEv;
+    _ZNKSt3__117moneypunct_bynameIwLb1EE16do_decimal_pointEv;
+    _ZNKSt3__117moneypunct_bynameIwLb1EE16do_negative_signEv;
+    _ZNKSt3__117moneypunct_bynameIwLb1EE16do_positive_signEv;
+    _ZNKSt3__117moneypunct_bynameIwLb1EE16do_thousands_sepEv;
+    _ZNKSt3__118__time_get_storageIcE15__do_date_orderEv;
+    _ZNKSt3__118__time_get_storageIwE15__do_date_orderEv;
+    _ZNKSt3__119__shared_weak_count13__get_deleterERKSt9type_info;
+    _ZNKSt3__120__codecvt_utf8_utf16IDiE10do_unshiftER9mbstate_tPcS4_RS4_;
+    _ZNKSt3__120__codecvt_utf8_utf16IDiE11do_encodingEv;
+    _ZNKSt3__120__codecvt_utf8_utf16IDiE13do_max_lengthEv;
+    _ZNKSt3__120__codecvt_utf8_utf16IDiE16do_always_noconvEv;
+    _ZNKSt3__120__codecvt_utf8_utf16IDiE5do_inER9mbstate_tPKcS5_RS5_PDiS7_RS7_;
+    _ZNKSt3__120__codecvt_utf8_utf16IDiE6do_outER9mbstate_tPKDiS5_RS5_PcS7_RS7_;
+    _ZNKSt3__120__codecvt_utf8_utf16IDiE9do_lengthER9mbstate_tPKcS5_j;
+    _ZNKSt3__120__codecvt_utf8_utf16IDsE10do_unshiftER9mbstate_tPcS4_RS4_;
+    _ZNKSt3__120__codecvt_utf8_utf16IDsE11do_encodingEv;
+    _ZNKSt3__120__codecvt_utf8_utf16IDsE13do_max_lengthEv;
+    _ZNKSt3__120__codecvt_utf8_utf16IDsE16do_always_noconvEv;
+    _ZNKSt3__120__codecvt_utf8_utf16IDsE5do_inER9mbstate_tPKcS5_RS5_PDsS7_RS7_;
+    _ZNKSt3__120__codecvt_utf8_utf16IDsE6do_outER9mbstate_tPKDsS5_RS5_PcS7_RS7_;
+    _ZNKSt3__120__codecvt_utf8_utf16IDsE9do_lengthER9mbstate_tPKcS5_j;
+    _ZNKSt3__120__codecvt_utf8_utf16IwE10do_unshiftER9mbstate_tPcS4_RS4_;
+    _ZNKSt3__120__codecvt_utf8_utf16IwE11do_encodingEv;
+    _ZNKSt3__120__codecvt_utf8_utf16IwE13do_max_lengthEv;
+    _ZNKSt3__120__codecvt_utf8_utf16IwE16do_always_noconvEv;
+    _ZNKSt3__120__codecvt_utf8_utf16IwE5do_inER9mbstate_tPKcS5_RS5_PwS7_RS7_;
+    _ZNKSt3__120__codecvt_utf8_utf16IwE6do_outER9mbstate_tPKwS5_RS5_PcS7_RS7_;
+    _ZNKSt3__120__codecvt_utf8_utf16IwE9do_lengthER9mbstate_tPKcS5_j;
+    _ZNKSt3__120__time_get_c_storageIcE3__cEv;
+    _ZNKSt3__120__time_get_c_storageIcE3__rEv;
+    _ZNKSt3__120__time_get_c_storageIcE3__xEv;
+    _ZNKSt3__120__time_get_c_storageIcE3__XEv;
+    _ZNKSt3__120__time_get_c_storageIcE7__am_pmEv;
+    _ZNKSt3__120__time_get_c_storageIcE7__weeksEv;
+    _ZNKSt3__120__time_get_c_storageIcE8__monthsEv;
+    _ZNKSt3__120__time_get_c_storageIwE3__cEv;
+    _ZNKSt3__120__time_get_c_storageIwE3__rEv;
+    _ZNKSt3__120__time_get_c_storageIwE3__xEv;
+    _ZNKSt3__120__time_get_c_storageIwE3__XEv;
+    _ZNKSt3__120__time_get_c_storageIwE7__am_pmEv;
+    _ZNKSt3__120__time_get_c_storageIwE7__weeksEv;
+    _ZNKSt3__120__time_get_c_storageIwE8__monthsEv;
+    _ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv;
+    _ZNKSt3__120__vector_base_commonILb1EE20__throw_out_of_rangeEv;
+    _ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv;
+    _ZNKSt3__121__basic_string_commonILb1EE20__throw_out_of_rangeEv;
+    _ZNKSt3__123__match_any_but_newlineIcE6__execERNS_7__stateIcEE;
+    _ZNKSt3__123__match_any_but_newlineIwE6__execERNS_7__stateIwEE;
+    _ZNKSt3__15ctypeIcE10do_tolowerEc;
+    _ZNKSt3__15ctypeIcE10do_tolowerEPcPKc;
+    _ZNKSt3__15ctypeIcE10do_toupperEc;
+    _ZNKSt3__15ctypeIcE10do_toupperEPcPKc;
+    _ZNKSt3__15ctypeIcE8do_widenEc;
+    _ZNKSt3__15ctypeIcE8do_widenEPKcS3_Pc;
+    _ZNKSt3__15ctypeIcE9do_narrowEcc;
+    _ZNKSt3__15ctypeIcE9do_narrowEPKcS3_cPc;
+    _ZNKSt3__15ctypeIwE10do_scan_isEtPKwS3_;
+    _ZNKSt3__15ctypeIwE10do_tolowerEPwPKw;
+    _ZNKSt3__15ctypeIwE10do_tolowerEw;
+    _ZNKSt3__15ctypeIwE10do_toupperEPwPKw;
+    _ZNKSt3__15ctypeIwE10do_toupperEw;
+    _ZNKSt3__15ctypeIwE11do_scan_notEtPKwS3_;
+    _ZNKSt3__15ctypeIwE5do_isEPKwS3_Pt;
+    _ZNKSt3__15ctypeIwE5do_isEtw;
+    _ZNKSt3__15ctypeIwE8do_widenEc;
+    _ZNKSt3__15ctypeIwE8do_widenEPKcS3_Pw;
+    _ZNKSt3__15ctypeIwE9do_narrowEPKwS3_cPc;
+    _ZNKSt3__15ctypeIwE9do_narrowEwc;
+    _ZNKSt3__16locale4nameEv;
+    _ZNKSt3__16locale9has_facetERNS0_2idE;
+    _ZNKSt3__16locale9use_facetERNS0_2idE;
+    _ZNKSt3__16localeeqERKS0_;
+    _ZNKSt3__17codecvtIcc9mbstate_tE10do_unshiftERS1_PcS4_RS4_;
+    _ZNKSt3__17codecvtIcc9mbstate_tE11do_encodingEv;
+    _ZNKSt3__17codecvtIcc9mbstate_tE13do_max_lengthEv;
+    _ZNKSt3__17codecvtIcc9mbstate_tE16do_always_noconvEv;
+    _ZNKSt3__17codecvtIcc9mbstate_tE5do_inERS1_PKcS5_RS5_PcS7_RS7_;
+    _ZNKSt3__17codecvtIcc9mbstate_tE6do_outERS1_PKcS5_RS5_PcS7_RS7_;
+    _ZNKSt3__17codecvtIcc9mbstate_tE9do_lengthERS1_PKcS5_j;
+    _ZNKSt3__17codecvtIDic9mbstate_tE10do_unshiftERS1_PcS4_RS4_;
+    _ZNKSt3__17codecvtIDic9mbstate_tE11do_encodingEv;
+    _ZNKSt3__17codecvtIDic9mbstate_tE13do_max_lengthEv;
+    _ZNKSt3__17codecvtIDic9mbstate_tE16do_always_noconvEv;
+    _ZNKSt3__17codecvtIDic9mbstate_tE5do_inERS1_PKcS5_RS5_PDiS7_RS7_;
+    _ZNKSt3__17codecvtIDic9mbstate_tE6do_outERS1_PKDiS5_RS5_PcS7_RS7_;
+    _ZNKSt3__17codecvtIDic9mbstate_tE9do_lengthERS1_PKcS5_j;
+    _ZNKSt3__17codecvtIDsc9mbstate_tE10do_unshiftERS1_PcS4_RS4_;
+    _ZNKSt3__17codecvtIDsc9mbstate_tE11do_encodingEv;
+    _ZNKSt3__17codecvtIDsc9mbstate_tE13do_max_lengthEv;
+    _ZNKSt3__17codecvtIDsc9mbstate_tE16do_always_noconvEv;
+    _ZNKSt3__17codecvtIDsc9mbstate_tE5do_inERS1_PKcS5_RS5_PDsS7_RS7_;
+    _ZNKSt3__17codecvtIDsc9mbstate_tE6do_outERS1_PKDsS5_RS5_PcS7_RS7_;
+    _ZNKSt3__17codecvtIDsc9mbstate_tE9do_lengthERS1_PKcS5_j;
+    _ZNKSt3__17codecvtIwc9mbstate_tE10do_unshiftERS1_PcS4_RS4_;
+    _ZNKSt3__17codecvtIwc9mbstate_tE11do_encodingEv;
+    _ZNKSt3__17codecvtIwc9mbstate_tE13do_max_lengthEv;
+    _ZNKSt3__17codecvtIwc9mbstate_tE16do_always_noconvEv;
+    _ZNKSt3__17codecvtIwc9mbstate_tE5do_inERS1_PKcS5_RS5_PwS7_RS7_;
+    _ZNKSt3__17codecvtIwc9mbstate_tE6do_outERS1_PKwS5_RS5_PcS7_RS7_;
+    _ZNKSt3__17codecvtIwc9mbstate_tE9do_lengthERS1_PKcS5_j;
+    _ZNKSt3__17collateIcE10do_compareEPKcS3_S3_S3_;
+    _ZNKSt3__17collateIcE12do_transformEPKcS3_;
+    _ZNKSt3__17collateIcE7do_hashEPKcS3_;
+    _ZNKSt3__17collateIwE10do_compareEPKwS3_S3_S3_;
+    _ZNKSt3__17collateIwE12do_transformEPKwS3_;
+    _ZNKSt3__17collateIwE7do_hashEPKwS3_;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE15__do_get_signedIlEES4_S4_S4_RNS_8ios_baseERjRT_;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE15__do_get_signedIxEES4_S4_S4_RNS_8ios_baseERjRT_;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE17__do_get_unsignedIjEES4_S4_S4_RNS_8ios_baseERjRT_;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE17__do_get_unsignedImEES4_S4_S4_RNS_8ios_baseERjRT_;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE17__do_get_unsignedItEES4_S4_S4_RNS_8ios_baseERjRT_;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE17__do_get_unsignedIyEES4_S4_S4_RNS_8ios_baseERjRT_;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE23__do_get_floating_pointIdEES4_S4_S4_RNS_8ios_baseERjRT_;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE23__do_get_floating_pointIeEES4_S4_S4_RNS_8ios_baseERjRT_;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE23__do_get_floating_pointIfEES4_S4_S4_RNS_8ios_baseERjRT_;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRb;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRd;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRe;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRf;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRl;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRm;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRPv;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRt;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRx;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjRy;
+    _ZNKSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjS8_;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE15__do_get_signedIlEES4_S4_S4_RNS_8ios_baseERjRT_;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE15__do_get_signedIxEES4_S4_S4_RNS_8ios_baseERjRT_;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE17__do_get_unsignedIjEES4_S4_S4_RNS_8ios_baseERjRT_;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE17__do_get_unsignedImEES4_S4_S4_RNS_8ios_baseERjRT_;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE17__do_get_unsignedItEES4_S4_S4_RNS_8ios_baseERjRT_;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE17__do_get_unsignedIyEES4_S4_S4_RNS_8ios_baseERjRT_;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE23__do_get_floating_pointIdEES4_S4_S4_RNS_8ios_baseERjRT_;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE23__do_get_floating_pointIeEES4_S4_S4_RNS_8ios_baseERjRT_;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE23__do_get_floating_pointIfEES4_S4_S4_RNS_8ios_baseERjRT_;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRb;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRd;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRe;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRf;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRl;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRm;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRPv;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRt;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRx;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjRy;
+    _ZNKSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjS8_;
+    _ZNKSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcb;
+    _ZNKSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcd;
+    _ZNKSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEce;
+    _ZNKSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcl;
+    _ZNKSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcm;
+    _ZNKSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcPKv;
+    _ZNKSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcx;
+    _ZNKSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcy;
+    _ZNKSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwb;
+    _ZNKSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwd;
+    _ZNKSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwe;
+    _ZNKSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwl;
+    _ZNKSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwm;
+    _ZNKSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwPKv;
+    _ZNKSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwx;
+    _ZNKSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwy;
+    _ZNKSt3__18ios_base6getlocEv;
+    _ZNKSt3__18messagesIcE6do_getEiiiRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
+    _ZNKSt3__18messagesIcE7do_openERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERKNS_6localeE;
+    _ZNKSt3__18messagesIcE8do_closeEi;
+    _ZNKSt3__18messagesIwE6do_getEiiiRKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEE;
+    _ZNKSt3__18messagesIwE7do_openERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERKNS_6localeE;
+    _ZNKSt3__18messagesIwE8do_closeEi;
+    _ZNKSt3__18numpunctIcE11do_groupingEv;
+    _ZNKSt3__18numpunctIcE11do_truenameEv;
+    _ZNKSt3__18numpunctIcE12do_falsenameEv;
+    _ZNKSt3__18numpunctIcE16do_decimal_pointEv;
+    _ZNKSt3__18numpunctIcE16do_thousands_sepEv;
+    _ZNKSt3__18numpunctIwE11do_groupingEv;
+    _ZNKSt3__18numpunctIwE11do_truenameEv;
+    _ZNKSt3__18numpunctIwE12do_falsenameEv;
+    _ZNKSt3__18numpunctIwE16do_decimal_pointEv;
+    _ZNKSt3__18numpunctIwE16do_thousands_sepEv;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE10__get_hourERiRS4_S4_RjRKNS_5ctypeIcEE;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE10__get_yearERiRS4_S4_RjRKNS_5ctypeIcEE;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11do_get_dateES4_S4_RNS_8ios_baseERjP2tm;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11do_get_timeES4_S4_RNS_8ios_baseERjP2tm;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11do_get_yearES4_S4_RNS_8ios_baseERjP2tm;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11__get_am_pmERiRS4_S4_RjRKNS_5ctypeIcEE;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11__get_monthERiRS4_S4_RjRKNS_5ctypeIcEE;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE11__get_year4ERiRS4_S4_RjRKNS_5ctypeIcEE;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE12__get_minuteERiRS4_S4_RjRKNS_5ctypeIcEE;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE12__get_secondERiRS4_S4_RjRKNS_5ctypeIcEE;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE13do_date_orderEv;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE13__get_12_hourERiRS4_S4_RjRKNS_5ctypeIcEE;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE13__get_percentERS4_S4_RjRKNS_5ctypeIcEE;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE13__get_weekdayERiRS4_S4_RjRKNS_5ctypeIcEE;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE14do_get_weekdayES4_S4_RNS_8ios_baseERjP2tm;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE15__get_monthnameERiRS4_S4_RjRKNS_5ctypeIcEE;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE16do_get_monthnameES4_S4_RNS_8ios_baseERjP2tm;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE17__get_weekdaynameERiRS4_S4_RjRKNS_5ctypeIcEE;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE17__get_white_spaceERS4_S4_RjRKNS_5ctypeIcEE;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE18__get_day_year_numERiRS4_S4_RjRKNS_5ctypeIcEE;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE3getES4_S4_RNS_8ios_baseERjP2tmPKcSC_;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_RNS_8ios_baseERjP2tmcc;
+    _ZNKSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE9__get_dayERiRS4_S4_RjRKNS_5ctypeIcEE;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE10__get_hourERiRS4_S4_RjRKNS_5ctypeIwEE;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE10__get_yearERiRS4_S4_RjRKNS_5ctypeIwEE;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11do_get_dateES4_S4_RNS_8ios_baseERjP2tm;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11do_get_timeES4_S4_RNS_8ios_baseERjP2tm;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11do_get_yearES4_S4_RNS_8ios_baseERjP2tm;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11__get_am_pmERiRS4_S4_RjRKNS_5ctypeIwEE;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11__get_monthERiRS4_S4_RjRKNS_5ctypeIwEE;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE11__get_year4ERiRS4_S4_RjRKNS_5ctypeIwEE;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE12__get_minuteERiRS4_S4_RjRKNS_5ctypeIwEE;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE12__get_secondERiRS4_S4_RjRKNS_5ctypeIwEE;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE13do_date_orderEv;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE13__get_12_hourERiRS4_S4_RjRKNS_5ctypeIwEE;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE13__get_percentERS4_S4_RjRKNS_5ctypeIwEE;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE13__get_weekdayERiRS4_S4_RjRKNS_5ctypeIwEE;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE14do_get_weekdayES4_S4_RNS_8ios_baseERjP2tm;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE15__get_monthnameERiRS4_S4_RjRKNS_5ctypeIwEE;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE16do_get_monthnameES4_S4_RNS_8ios_baseERjP2tm;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE17__get_weekdaynameERiRS4_S4_RjRKNS_5ctypeIwEE;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE17__get_white_spaceERS4_S4_RjRKNS_5ctypeIwEE;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE18__get_day_year_numERiRS4_S4_RjRKNS_5ctypeIwEE;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE3getES4_S4_RNS_8ios_baseERjP2tmPKwSC_;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_RNS_8ios_baseERjP2tmcc;
+    _ZNKSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE9__get_dayERiRS4_S4_RjRKNS_5ctypeIwEE;
+    _ZNKSt3__18time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE3putES4_RNS_8ios_baseEcPK2tmPKcSC_;
+    _ZNKSt3__18time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_RNS_8ios_baseEcPK2tmcc;
+    _ZNKSt3__18time_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE3putES4_RNS_8ios_baseEwPK2tmPKwSC_;
+    _ZNKSt3__18time_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_RNS_8ios_baseEwPK2tmcc;
+    _ZNKSt3__19money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_bRNS_8ios_baseERjRe;
+    _ZNKSt3__19money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_getES4_S4_bRNS_8ios_baseERjRNS_12basic_stringIcS3_NS_9allocatorIcEEEE;
+    _ZNKSt3__19money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_bRNS_8ios_baseERjRe;
+    _ZNKSt3__19money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_getES4_S4_bRNS_8ios_baseERjRNS_12basic_stringIwS3_NS_9allocatorIwEEEE;
+    _ZNKSt3__19money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_bRNS_8ios_baseEce;
+    _ZNKSt3__19money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE6do_putES4_bRNS_8ios_baseEcRKNS_12basic_stringIcS3_NS_9allocatorIcEEEE;
+    _ZNKSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_bRNS_8ios_baseEwe;
+    _ZNKSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE6do_putES4_bRNS_8ios_baseEwRKNS_12basic_stringIwS3_NS_9allocatorIwEEEE;
+    _ZNSt11logic_erroraSERKS_;
+    _ZNSt11logic_errorC1EPKc;
+    _ZNSt11logic_errorC1ERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE;
+    _ZNSt11logic_errorC1ERKS_;
+    _ZNSt11logic_errorC2EPKc;
+    _ZNSt11logic_errorC2ERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE;
+    _ZNSt11logic_errorC2ERKS_;
+    _ZNSt12experimental19bad_optional_accessD0Ev;
+    _ZNSt12experimental19bad_optional_accessD1Ev;
+    _ZNSt12experimental19bad_optional_accessD2Ev;
+    _ZNSt13exception_ptraSERKS_;
+    _ZNSt13exception_ptrC1ERKS_;
+    _ZNSt13exception_ptrC2ERKS_;
+    _ZNSt13exception_ptrD1Ev;
+    _ZNSt13exception_ptrD2Ev;
+    _ZNSt13runtime_erroraSERKS_;
+    _ZNSt13runtime_errorC1EPKc;
+    _ZNSt13runtime_errorC1ERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE;
+    _ZNSt13runtime_errorC1ERKS_;
+    _ZNSt13runtime_errorC2EPKc;
+    _ZNSt13runtime_errorC2ERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE;
+    _ZNSt13runtime_errorC2ERKS_;
+    _ZNSt16nested_exceptionC1Ev;
+    _ZNSt16nested_exceptionC2Ev;
+    _ZNSt16nested_exceptionD0Ev;
+    _ZNSt16nested_exceptionD1Ev;
+    _ZNSt16nested_exceptionD2Ev;
+    _ZNSt3__110adopt_lockE;
+    _ZNSt3__110ctype_base5alnumE;
+    _ZNSt3__110ctype_base5alphaE;
+    _ZNSt3__110ctype_base5blankE;
+    _ZNSt3__110ctype_base5cntrlE;
+    _ZNSt3__110ctype_base5digitE;
+    _ZNSt3__110ctype_base5graphE;
+    _ZNSt3__110ctype_base5lowerE;
+    _ZNSt3__110ctype_base5printE;
+    _ZNSt3__110ctype_base5punctE;
+    _ZNSt3__110ctype_base5spaceE;
+    _ZNSt3__110ctype_base5upperE;
+    _ZNSt3__110ctype_base6xdigitE;
+    _ZNSt3__110defer_lockE;
+    _ZNSt3__110istrstreamD0Ev;
+    _ZNSt3__110istrstreamD1Ev;
+    _ZNSt3__110istrstreamD2Ev;
+    _ZNSt3__110moneypunctIcLb0EE2idE;
+    _ZNSt3__110moneypunctIcLb0EE4intlE;
+    _ZNSt3__110moneypunctIcLb1EE2idE;
+    _ZNSt3__110moneypunctIcLb1EE4intlE;
+    _ZNSt3__110moneypunctIwLb0EE2idE;
+    _ZNSt3__110moneypunctIwLb0EE4intlE;
+    _ZNSt3__110moneypunctIwLb1EE2idE;
+    _ZNSt3__110moneypunctIwLb1EE4intlE;
+    _ZNSt3__110__new_clocEv;
+    _ZNSt3__110ostrstreamD0Ev;
+    _ZNSt3__110ostrstreamD1Ev;
+    _ZNSt3__110ostrstreamD2Ev;
+    _ZNSt3__110__sscanf_lEPKcP13locale_structS1_z;
+    _ZNSt3__110__time_getC1EPKc;
+    _ZNSt3__110__time_getC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
+    _ZNSt3__110__time_getC2EPKc;
+    _ZNSt3__110__time_getC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
+    _ZNSt3__110__time_getD1Ev;
+    _ZNSt3__110__time_getD2Ev;
+    _ZNSt3__110__time_putC1EPKc;
+    _ZNSt3__110__time_putC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
+    _ZNSt3__110__time_putC2EPKc;
+    _ZNSt3__110__time_putC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
+    _ZNSt3__110__time_putD1Ev;
+    _ZNSt3__110__time_putD2Ev;
+    _ZNSt3__110to_wstringEd;
+    _ZNSt3__110to_wstringEe;
+    _ZNSt3__110to_wstringEf;
+    _ZNSt3__110to_wstringEi;
+    _ZNSt3__110to_wstringEj;
+    _ZNSt3__110to_wstringEl;
+    _ZNSt3__110to_wstringEm;
+    _ZNSt3__110to_wstringEx;
+    _ZNSt3__110to_wstringEy;
+    _ZNSt3__111__call_onceERVmPvPFvS2_E;
+    _ZNSt3__111__libcpp_db10__insert_cEPv;
+    _ZNSt3__111__libcpp_db10__insert_iEPv;
+    _ZNSt3__111__libcpp_db11__insert_icEPvPKv;
+    _ZNSt3__111__libcpp_db15__iterator_copyEPvPKv;
+    _ZNSt3__111__libcpp_db16__invalidate_allEPv;
+    _ZNSt3__111__libcpp_db4swapEPvS1_;
+    _ZNSt3__111__libcpp_db9__erase_cEPv;
+    _ZNSt3__111__libcpp_db9__erase_iEPv;
+    _ZNSt3__111__libcpp_dbC1Ev;
+    _ZNSt3__111__libcpp_dbC2Ev;
+    _ZNSt3__111__libcpp_dbD1Ev;
+    _ZNSt3__111__libcpp_dbD2Ev;
+    _ZNSt3__111__money_getIcE13__gather_infoEbRKNS_6localeERNS_10money_base7patternERcS8_RNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEESF_SF_SF_Ri;
+    _ZNSt3__111__money_getIwE13__gather_infoEbRKNS_6localeERNS_10money_base7patternERwS8_RNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS9_IwNSA_IwEENSC_IwEEEESJ_SJ_Ri;
+    _ZNSt3__111__money_putIcE13__gather_infoEbbRKNS_6localeERNS_10money_base7patternERcS8_RNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEESF_SF_Ri;
+    _ZNSt3__111__money_putIcE8__formatEPcRS2_S3_jPKcS5_RKNS_5ctypeIcEEbRKNS_10money_base7patternEccRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEESL_SL_i;
+    _ZNSt3__111__money_putIwE13__gather_infoEbbRKNS_6localeERNS_10money_base7patternERwS8_RNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS9_IwNSA_IwEENSC_IwEEEESJ_Ri;
+    _ZNSt3__111__money_putIwE8__formatEPwRS2_S3_jPKwS5_RKNS_5ctypeIwEEbRKNS_10money_base7patternEwwRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERKNSE_IwNSF_IwEENSH_IwEEEESQ_i;
+    _ZNSt3__111regex_errorC1ENS_15regex_constants10error_typeE;
+    _ZNSt3__111regex_errorC2ENS_15regex_constants10error_typeE;
+    _ZNSt3__111regex_errorD0Ev;
+    _ZNSt3__111regex_errorD1Ev;
+    _ZNSt3__111regex_errorD2Ev;
+    _ZNSt3__111this_thread9sleep_forERKNS_6chrono8durationIxNS_5ratioILx1ELx1000000000EEEEE;
+    _ZNSt3__111timed_mutex4lockEv;
+    _ZNSt3__111timed_mutex6unlockEv;
+    _ZNSt3__111timed_mutex8try_lockEv;
+    _ZNSt3__111timed_mutexC1Ev;
+    _ZNSt3__111timed_mutexC2Ev;
+    _ZNSt3__111timed_mutexD1Ev;
+    _ZNSt3__111timed_mutexD2Ev;
+    _ZNSt3__111try_to_lockE;
+    _ZNSt3__111unique_lockINS_5mutexEE6unlockEv;
+    _ZNSt3__112__asprintf_lEPPcP13locale_structPKcz;
+    _ZNSt3__112bad_weak_ptrD0Ev;
+    _ZNSt3__112bad_weak_ptrD1Ev;
+    _ZNSt3__112bad_weak_ptrD2Ev;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE21__grow_by_and_replaceEjjjjjjPKc;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE2atEj;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4nposE;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5eraseEjj;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEjc;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEPKc;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEPKcj;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendERKS5_jj;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueERS5_E4typeES9_S9_;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEjc;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEPKc;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEPKcj;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignERKS5_jj;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEjc;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcj;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcjj;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPKcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESA_SA_;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertEjjc;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertEjPKc;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertEjPKcj;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertEjRKS5_jj;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertENS_11__wrap_iterIPKcEEc;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertIPKcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueENS_11__wrap_iterIPcEEE4typeENSB_IS8_EESA_SA_;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEjc;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceEjjjc;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceEjjPKc;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceEjjPKcj;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceEjjRKS5_jj;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceIPKcEENS_9enable_ifIXsr19__is_input_iteratorIT_EE5valueERS5_E4typeENS_11__wrap_iterIS8_EESF_SA_SA_;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7reserveEj;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__grow_byEjjjjjj;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSEc;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSERKS5_;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5_;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5_jjRKS4_;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5_RKS4_;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS5_;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS5_jjRKS4_;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS5_RKS4_;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev;
+    _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE21__grow_by_and_replaceEjjjjjjPKw;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE2atEj;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE4nposE;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE5eraseEjj;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendEjw;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendEPKw;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendEPKwj;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendERKS5_jj;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendIPwEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueERS5_E4typeES9_S9_;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignEjw;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignEPKw;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignEPKwj;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignERKS5_jj;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6assignIPwEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueERS5_E4typeES9_S9_;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__initEjw;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__initEPKwj;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__initEPKwjj;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__initIPKwEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESA_SA_;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertEjjw;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertEjPKw;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertEjPKwj;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertEjRKS5_jj;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertENS_11__wrap_iterIPKwEEw;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6insertIPKwEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueENS_11__wrap_iterIPwEEE4typeENSB_IS8_EESA_SA_;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6resizeEjw;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceEjjjw;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceEjjPKw;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceEjjPKwj;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceEjjRKS5_jj;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceIPKwEENS_9enable_ifIXsr19__is_input_iteratorIT_EE5valueERS5_E4typeENS_11__wrap_iterIS8_EESF_SA_SA_;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7reserveEj;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE9__grow_byEjjjjjj;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE9push_backEw;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEaSERKS5_;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEaSEw;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1ERKS5_;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1ERKS5_jjRKS4_;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC1ERKS5_RKS4_;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2ERKS5_;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2ERKS5_jjRKS4_;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEC2ERKS5_RKS4_;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEED1Ev;
+    _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEED2Ev;
+    _ZNSt3__112ctype_bynameIcEC1EPKcj;
+    _ZNSt3__112ctype_bynameIcEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj;
+    _ZNSt3__112ctype_bynameIcEC2EPKcj;
+    _ZNSt3__112ctype_bynameIcEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj;
+    _ZNSt3__112ctype_bynameIcED0Ev;
+    _ZNSt3__112ctype_bynameIcED1Ev;
+    _ZNSt3__112ctype_bynameIcED2Ev;
+    _ZNSt3__112ctype_bynameIwEC1EPKcj;
+    _ZNSt3__112ctype_bynameIwEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj;
+    _ZNSt3__112ctype_bynameIwEC2EPKcj;
+    _ZNSt3__112ctype_bynameIwEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj;
+    _ZNSt3__112ctype_bynameIwED0Ev;
+    _ZNSt3__112ctype_bynameIwED1Ev;
+    _ZNSt3__112ctype_bynameIwED2Ev;
+    _ZNSt3__112__do_nothingEPv;
+    _ZNSt3__112future_errorC1ENS_10error_codeE;
+    _ZNSt3__112future_errorC2ENS_10error_codeE;
+    _ZNSt3__112future_errorC2ERKS0_;
+    _ZNSt3__112future_errorD0Ev;
+    _ZNSt3__112future_errorD1Ev;
+    _ZNSt3__112future_errorD2Ev;
+    _ZNSt3__112__get_sp_mutEPKv;
+    _ZNSt3__112__next_primeEj;
+    _ZNSt3__112placeholders2_1E;
+    _ZNSt3__112placeholders2_2E;
+    _ZNSt3__112placeholders2_3E;
+    _ZNSt3__112placeholders2_4E;
+    _ZNSt3__112placeholders2_5E;
+    _ZNSt3__112placeholders2_6E;
+    _ZNSt3__112placeholders2_7E;
+    _ZNSt3__112placeholders2_8E;
+    _ZNSt3__112placeholders2_9E;
+    _ZNSt3__112placeholders3_10E;
+    _ZNSt3__112__rotate_gcdINS_11__wrap_iterIPcEEEET_S4_S4_S4_;
+    _ZNSt3__112__rotate_gcdINS_11__wrap_iterIPwEEEET_S4_S4_S4_;
+    _ZNSt3__112__rs_default4__c_E;
+    _ZNSt3__112__rs_defaultC1ERKS0_;
+    _ZNSt3__112__rs_defaultC1Ev;
+    _ZNSt3__112__rs_defaultC2ERKS0_;
+    _ZNSt3__112__rs_defaultC2Ev;
+    _ZNSt3__112__rs_defaultclEv;
+    _ZNSt3__112__rs_defaultD1Ev;
+    _ZNSt3__112__rs_defaultD2Ev;
+    _ZNSt3__112__snprintf_lEPcjP13locale_structPKcz;
+    _ZNSt3__112strstreambuf3strEv;
+    _ZNSt3__112strstreambuf4swapERS0_;
+    _ZNSt3__112strstreambuf6freezeEb;
+    _ZNSt3__112strstreambuf6__initEPciS1_;
+    _ZNSt3__112strstreambuf7seekoffExNS_8ios_base7seekdirEj;
+    _ZNSt3__112strstreambuf7seekposENS_4fposI9mbstate_tEEj;
+    _ZNSt3__112strstreambuf8overflowEi;
+    _ZNSt3__112strstreambuf9pbackfailEi;
+    _ZNSt3__112strstreambuf9underflowEv;
+    _ZNSt3__112strstreambufC1Ei;
+    _ZNSt3__112strstreambufC1EPaiS1_;
+    _ZNSt3__112strstreambufC1EPciS1_;
+    _ZNSt3__112strstreambufC1EPFPvjEPFvS1_E;
+    _ZNSt3__112strstreambufC1EPhiS1_;
+    _ZNSt3__112strstreambufC1EPKai;
+    _ZNSt3__112strstreambufC1EPKci;
+    _ZNSt3__112strstreambufC1EPKhi;
+    _ZNSt3__112strstreambufC2Ei;
+    _ZNSt3__112strstreambufC2EPaiS1_;
+    _ZNSt3__112strstreambufC2EPciS1_;
+    _ZNSt3__112strstreambufC2EPFPvjEPFvS1_E;
+    _ZNSt3__112strstreambufC2EPhiS1_;
+    _ZNSt3__112strstreambufC2EPKai;
+    _ZNSt3__112strstreambufC2EPKci;
+    _ZNSt3__112strstreambufC2EPKhi;
+    _ZNSt3__112strstreambufD0Ev;
+    _ZNSt3__112strstreambufD1Ev;
+    _ZNSt3__112strstreambufD2Ev;
+    _ZNSt3__112system_error6__initERKNS_10error_codeENS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
+    _ZNSt3__112system_errorC1EiRKNS_14error_categoryE;
+    _ZNSt3__112system_errorC1EiRKNS_14error_categoryEPKc;
+    _ZNSt3__112system_errorC1EiRKNS_14error_categoryERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
+    _ZNSt3__112system_errorC1ENS_10error_codeE;
+    _ZNSt3__112system_errorC1ENS_10error_codeEPKc;
+    _ZNSt3__112system_errorC1ENS_10error_codeERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
+    _ZNSt3__112system_errorC2EiRKNS_14error_categoryE;
+    _ZNSt3__112system_errorC2EiRKNS_14error_categoryEPKc;
+    _ZNSt3__112system_errorC2EiRKNS_14error_categoryERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
+    _ZNSt3__112system_errorC2ENS_10error_codeE;
+    _ZNSt3__112system_errorC2ENS_10error_codeEPKc;
+    _ZNSt3__112system_errorC2ENS_10error_codeERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
+    _ZNSt3__112system_errorD0Ev;
+    _ZNSt3__112system_errorD1Ev;
+    _ZNSt3__112system_errorD2Ev;
+    _ZNSt3__113allocator_argE;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE3getEPci;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE3getEPcic;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE3getERc;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE3getERNS_15basic_streambufIcS2_EE;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE3getERNS_15basic_streambufIcS2_EEc;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE3getEv;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE4peekEv;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE4readEPci;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE4swapERS3_;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE4syncEv;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE5seekgENS_4fposI9mbstate_tEE;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE5seekgExNS_8ios_base7seekdirE;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE5tellgEv;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE5ungetEv;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE6ignoreEii;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE6sentryC1ERS3_b;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE6sentryC2ERS3_b;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE7getlineEPci;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE7getlineEPcic;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE7putbackEc;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE8readsomeEPci;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC1EPNS_15basic_streambufIcS2_EE;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsEPFRNS_8ios_baseES5_E;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsEPFRNS_9basic_iosIcS2_EES6_E;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsEPFRS3_S4_E;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsEPNS_15basic_streambufIcS2_EE;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERb;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERd;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERe;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERf;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERi;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERj;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERl;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERm;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERPv;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERs;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERt;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERx;
+    _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERy;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE3getEPwi;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE3getEPwiw;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE3getERNS_15basic_streambufIwS2_EE;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE3getERNS_15basic_streambufIwS2_EEw;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE3getERw;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE3getEv;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE4peekEv;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE4readEPwi;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE4swapERS3_;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE4syncEv;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE5seekgENS_4fposI9mbstate_tEE;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE5seekgExNS_8ios_base7seekdirE;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE5tellgEv;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE5ungetEv;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE6ignoreEii;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE6sentryC1ERS3_b;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE6sentryC2ERS3_b;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE7getlineEPwi;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE7getlineEPwiw;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE7putbackEw;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE8readsomeEPwi;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEEC1EPNS_15basic_streambufIwS2_EE;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEEC2EPNS_15basic_streambufIwS2_EE;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEED0Ev;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEED1Ev;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEED2Ev;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsEPFRNS_8ios_baseES5_E;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsEPFRNS_9basic_iosIwS2_EES6_E;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsEPFRS3_S4_E;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsEPNS_15basic_streambufIwS2_EE;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERb;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERd;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERe;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERf;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERi;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERj;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERl;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERm;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERPv;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERs;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERt;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERx;
+    _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEErsERy;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE3putEc;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE4swapERS3_;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5flushEv;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5seekpENS_4fposI9mbstate_tEE;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5seekpExNS_8ios_base7seekdirE;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5tellpEv;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5writeEPKci;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3_;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC2ERS3_;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD2Ev;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC1EPNS_15basic_streambufIcS2_EE;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED2Ev;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEb;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEd;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEe;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEf;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEj;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEl;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEm;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRNS_8ios_baseES5_E;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRNS_9basic_iosIcS2_EES6_E;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRS3_S4_E;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPKv;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPNS_15basic_streambufIcS2_EE;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEs;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEt;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEx;
+    _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEy;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE3putEw;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE4swapERS3_;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE5flushEv;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE5seekpENS_4fposI9mbstate_tEE;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE5seekpExNS_8ios_base7seekdirE;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE5tellpEv;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE5writeEPKwi;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE6sentryC1ERS3_;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE6sentryC2ERS3_;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE6sentryD1Ev;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEE6sentryD2Ev;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEEC1EPNS_15basic_streambufIwS2_EE;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEEC2EPNS_15basic_streambufIwS2_EE;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEED0Ev;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEED1Ev;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEED2Ev;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEb;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEd;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEe;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEf;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEi;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEj;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEl;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEm;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEPFRNS_8ios_baseES5_E;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEPFRNS_9basic_iosIwS2_EES6_E;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEPFRS3_S4_E;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEPKv;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEPNS_15basic_streambufIwS2_EE;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEs;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEt;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEx;
+    _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEy;
+    _ZNSt3__113find_first_ofIPKcS2_PFbccEEET_S5_S5_T0_S6_T1_;
+    _ZNSt3__113find_first_ofIPKwS2_PFbwwEEET_S5_S5_T0_S6_T1_;
+    _ZNSt3__113__lower_boundIRNS_6__lessIjjEEPKjjEET0_S6_S6_RKT1_T_;
+    _ZNSt3__113random_deviceC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
+    _ZNSt3__113random_deviceC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
+    _ZNSt3__113random_deviceclEv;
+    _ZNSt3__113random_deviceD1Ev;
+    _ZNSt3__113random_deviceD2Ev;
+    _ZNSt3__113__rotate_leftINS_11__wrap_iterIPcEEEET_S4_S4_;
+    _ZNSt3__113__rotate_leftINS_11__wrap_iterIPwEEEET_S4_S4_;
+    _ZNSt3__113shared_futureIvEaSERKS1_;
+    _ZNSt3__113shared_futureIvED1Ev;
+    _ZNSt3__113shared_futureIvED2Ev;
+    _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEE4swapERS3_;
+    _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC1EPNS_15basic_streambufIcS2_EE;
+    _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE;
+    _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev;
+    _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev;
+    _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev;
+    _ZNSt3__114codecvt_bynameIcc9mbstate_tED0Ev;
+    _ZNSt3__114codecvt_bynameIcc9mbstate_tED1Ev;
+    _ZNSt3__114codecvt_bynameIcc9mbstate_tED2Ev;
+    _ZNSt3__114codecvt_bynameIDic9mbstate_tED0Ev;
+    _ZNSt3__114codecvt_bynameIDic9mbstate_tED1Ev;
+    _ZNSt3__114codecvt_bynameIDic9mbstate_tED2Ev;
+    _ZNSt3__114codecvt_bynameIDsc9mbstate_tED0Ev;
+    _ZNSt3__114codecvt_bynameIDsc9mbstate_tED1Ev;
+    _ZNSt3__114codecvt_bynameIDsc9mbstate_tED2Ev;
+    _ZNSt3__114codecvt_bynameIwc9mbstate_tED0Ev;
+    _ZNSt3__114codecvt_bynameIwc9mbstate_tED1Ev;
+    _ZNSt3__114codecvt_bynameIwc9mbstate_tED2Ev;
+    _ZNSt3__114__codecvt_utf8IDiED0Ev;
+    _ZNSt3__114__codecvt_utf8IDiED2Ev;
+    _ZNSt3__114__codecvt_utf8IDsED0Ev;
+    _ZNSt3__114__codecvt_utf8IDsED2Ev;
+    _ZNSt3__114__codecvt_utf8IwED0Ev;
+    _ZNSt3__114__codecvt_utf8IwED2Ev;
+    _ZNSt3__114collate_bynameIcEC1EPKcj;
+    _ZNSt3__114collate_bynameIcEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj;
+    _ZNSt3__114collate_bynameIcEC2EPKcj;
+    _ZNSt3__114collate_bynameIcEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj;
+    _ZNSt3__114collate_bynameIcED0Ev;
+    _ZNSt3__114collate_bynameIcED1Ev;
+    _ZNSt3__114collate_bynameIcED2Ev;
+    _ZNSt3__114collate_bynameIwEC1EPKcj;
+    _ZNSt3__114collate_bynameIwEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj;
+    _ZNSt3__114collate_bynameIwEC2EPKcj;
+    _ZNSt3__114collate_bynameIwEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj;
+    _ZNSt3__114collate_bynameIwED0Ev;
+    _ZNSt3__114collate_bynameIwED1Ev;
+    _ZNSt3__114collate_bynameIwED2Ev;
+    _ZNSt3__114error_categoryC1Ev;
+    _ZNSt3__114error_categoryC2Ev;
+    _ZNSt3__114error_categoryD0Ev;
+    _ZNSt3__114error_categoryD1Ev;
+    _ZNSt3__114error_categoryD2Ev;
+    _ZNSt3__114__get_const_dbEv;
+    _ZNSt3__114__num_get_base10__get_baseERNS_8ios_baseE;
+    _ZNSt3__114__num_get_base5__srcE;
+    _ZNSt3__114__num_put_base12__format_intEPcPKcbj;
+    _ZNSt3__114__num_put_base14__format_floatEPcPKcj;
+    _ZNSt3__114__num_put_base18__identify_paddingEPcS1_RKNS_8ios_baseE;
+    _ZNSt3__114__rotate_rightINS_11__wrap_iterIPcEEEET_S4_S4_;
+    _ZNSt3__114__rotate_rightINS_11__wrap_iterIPwEEEET_S4_S4_;
+    _ZNSt3__114__shared_count12__add_sharedEv;
+    _ZNSt3__114__shared_count16__release_sharedEv;
+    _ZNSt3__114__shared_countD0Ev;
+    _ZNSt3__114__shared_countD1Ev;
+    _ZNSt3__114__shared_countD2Ev;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE10pubseekoffExNS_8ios_base7seekdirEj;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE10pubseekposENS_4fposI9mbstate_tEEj;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4_;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setpEPcS4_;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4swapERS3_;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5gbumpEi;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbumpEi;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sgetcEv;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sgetnEPci;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputcEc;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnEPKci;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6sbumpcEv;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPci;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6snextcEv;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPci;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKci;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7pubsyncEv;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7seekoffExNS_8ios_base7seekdirEj;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7seekposENS_4fposI9mbstate_tEEj;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7sungetcEv;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE8in_availEv;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE8overflowEi;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE8pubimbueERKNS_6localeE;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9pbackfailEi;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9pubsetbufEPci;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9sputbackcEc;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9underflowEv;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEaSERKS3_;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC1ERKS3_;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC1Ev;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2ERKS3_;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED0Ev;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED1Ev;
+    _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE10pubseekoffExNS_8ios_base7seekdirEj;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE10pubseekposENS_4fposI9mbstate_tEEj;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE4setgEPwS4_S4_;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE4setpEPwS4_;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE4swapERS3_;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE4syncEv;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE5gbumpEi;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE5imbueERKNS_6localeE;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE5pbumpEi;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE5sgetcEv;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE5sgetnEPwi;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE5sputcEw;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE5sputnEPKwi;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE5uflowEv;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE6sbumpcEv;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE6setbufEPwi;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE6snextcEv;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE6xsgetnEPwi;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE6xsputnEPKwi;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE7pubsyncEv;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE7seekoffExNS_8ios_base7seekdirEj;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE7seekposENS_4fposI9mbstate_tEEj;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE7sungetcEv;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE8in_availEv;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE8overflowEi;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE8pubimbueERKNS_6localeE;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE9pbackfailEi;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE9pubsetbufEPwi;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE9showmanycEv;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE9sputbackcEw;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE9underflowEv;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEEaSERKS3_;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEEC1ERKS3_;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEEC1Ev;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEEC2ERKS3_;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEEC2Ev;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEED0Ev;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEED1Ev;
+    _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEED2Ev;
+    _ZNSt3__115__codecvt_utf16IDiLb0EED0Ev;
+    _ZNSt3__115__codecvt_utf16IDiLb0EED2Ev;
+    _ZNSt3__115__codecvt_utf16IDiLb1EED0Ev;
+    _ZNSt3__115__codecvt_utf16IDiLb1EED2Ev;
+    _ZNSt3__115__codecvt_utf16IDsLb0EED0Ev;
+    _ZNSt3__115__codecvt_utf16IDsLb0EED2Ev;
+    _ZNSt3__115__codecvt_utf16IDsLb1EED0Ev;
+    _ZNSt3__115__codecvt_utf16IDsLb1EED2Ev;
+    _ZNSt3__115__codecvt_utf16IwLb0EED0Ev;
+    _ZNSt3__115__codecvt_utf16IwLb0EED2Ev;
+    _ZNSt3__115__codecvt_utf16IwLb1EED0Ev;
+    _ZNSt3__115__codecvt_utf16IwLb1EED2Ev;
+    _ZNSt3__115future_categoryEv;
+    _ZNSt3__115__get_classnameEPKcb;
+    _ZNSt3__115__num_get_floatIdEET_PKcS3_Rj;
+    _ZNSt3__115__num_get_floatIeEET_PKcS3_Rj;
+    _ZNSt3__115__num_get_floatIfEET_PKcS3_Rj;
+    _ZNSt3__115numpunct_bynameIcE6__initEPKc;
+    _ZNSt3__115numpunct_bynameIcEC1EPKcj;
+    _ZNSt3__115numpunct_bynameIcEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj;
+    _ZNSt3__115numpunct_bynameIcEC2EPKcj;
+    _ZNSt3__115numpunct_bynameIcEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj;
+    _ZNSt3__115numpunct_bynameIcED0Ev;
+    _ZNSt3__115numpunct_bynameIcED1Ev;
+    _ZNSt3__115numpunct_bynameIcED2Ev;
+    _ZNSt3__115numpunct_bynameIwE6__initEPKc;
+    _ZNSt3__115numpunct_bynameIwEC1EPKcj;
+    _ZNSt3__115numpunct_bynameIwEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj;
+    _ZNSt3__115numpunct_bynameIwEC2EPKcj;
+    _ZNSt3__115numpunct_bynameIwEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj;
+    _ZNSt3__115numpunct_bynameIwED0Ev;
+    _ZNSt3__115numpunct_bynameIwED1Ev;
+    _ZNSt3__115numpunct_bynameIwED2Ev;
+    _ZNSt3__115recursive_mutex4lockEv;
+    _ZNSt3__115recursive_mutex6unlockEv;
+    _ZNSt3__115recursive_mutex8try_lockEv;
+    _ZNSt3__115recursive_mutexC1Ev;
+    _ZNSt3__115recursive_mutexC2Ev;
+    _ZNSt3__115recursive_mutexD1Ev;
+    _ZNSt3__115recursive_mutexD2Ev;
+    _ZNSt3__115system_categoryEv;
+    _ZNSt3__115__thread_struct25notify_all_at_thread_exitEPNS_18condition_variableEPNS_5mutexE;
+    _ZNSt3__115__thread_struct27__make_ready_at_thread_exitEPNS_17__assoc_sub_stateE;
+    _ZNSt3__115__thread_structC1Ev;
+    _ZNSt3__115__thread_structC2Ev;
+    _ZNSt3__115__thread_structD1Ev;
+    _ZNSt3__115__thread_structD2Ev;
+    _ZNSt3__116__check_groupingERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPjS8_Rj;
+    _ZNSt3__116generic_categoryEv;
+    _ZNSt3__116__narrow_to_utf8ILj16EED0Ev;
+    _ZNSt3__116__narrow_to_utf8ILj16EED1Ev;
+    _ZNSt3__116__narrow_to_utf8ILj16EED2Ev;
+    _ZNSt3__116__narrow_to_utf8ILj32EED0Ev;
+    _ZNSt3__116__narrow_to_utf8ILj32EED1Ev;
+    _ZNSt3__116__narrow_to_utf8ILj32EED2Ev;
+    _ZNSt3__117__assoc_sub_state10__sub_waitERNS_11unique_lockINS_5mutexEEE;
+    _ZNSt3__117__assoc_sub_state12__make_readyEv;
+    _ZNSt3__117__assoc_sub_state13set_exceptionESt13exception_ptr;
+    _ZNSt3__117__assoc_sub_state16__on_zero_sharedEv;
+    _ZNSt3__117__assoc_sub_state24set_value_at_thread_exitEv;
+    _ZNSt3__117__assoc_sub_state28set_exception_at_thread_exitESt13exception_ptr;
+    _ZNSt3__117__assoc_sub_state4copyEv;
+    _ZNSt3__117__assoc_sub_state4waitEv;
+    _ZNSt3__117__assoc_sub_state9__executeEv;
+    _ZNSt3__117__assoc_sub_state9set_valueEv;
+    _ZNSt3__117__assoc_sub_stateD0Ev;
+    _ZNSt3__117__assoc_sub_stateD2Ev;
+    _ZNSt3__117declare_reachableEPv;
+    _ZNSt3__117iostream_categoryEv;
+    _ZNSt3__117moneypunct_bynameIcLb0EE4initEPKc;
+    _ZNSt3__117moneypunct_bynameIcLb1EE4initEPKc;
+    _ZNSt3__117moneypunct_bynameIwLb0EE4initEPKc;
+    _ZNSt3__117moneypunct_bynameIwLb1EE4initEPKc;
+    _ZNSt3__117__widen_from_utf8ILj16EED0Ev;
+    _ZNSt3__117__widen_from_utf8ILj16EED1Ev;
+    _ZNSt3__117__widen_from_utf8ILj16EED2Ev;
+    _ZNSt3__117__widen_from_utf8ILj32EED0Ev;
+    _ZNSt3__117__widen_from_utf8ILj32EED1Ev;
+    _ZNSt3__117__widen_from_utf8ILj32EED2Ev;
+    _ZNSt3__118condition_variable10notify_allEv;
+    _ZNSt3__118condition_variable10notify_oneEv;
+    _ZNSt3__118condition_variable15__do_timed_waitERNS_11unique_lockINS_5mutexEEENS_6chrono10time_pointINS5_12system_clockENS5_8durationIxNS_5ratioILx1ELx1000000000EEEEEEE;
+    _ZNSt3__118condition_variable4waitERNS_11unique_lockINS_5mutexEEE;
+    _ZNSt3__118condition_variableD1Ev;
+    _ZNSt3__118condition_variableD2Ev;
+    _ZNSt3__118get_pointer_safetyEv;
+    _ZNSt3__118__insertion_sort_3IRNS_6__lessIaaEEPaEEvT0_S5_T_;
+    _ZNSt3__118__insertion_sort_3IRNS_6__lessIccEEPcEEvT0_S5_T_;
+    _ZNSt3__118__insertion_sort_3IRNS_6__lessIddEEPdEEvT0_S5_T_;
+    _ZNSt3__118__insertion_sort_3IRNS_6__lessIeeEEPeEEvT0_S5_T_;
+    _ZNSt3__118__insertion_sort_3IRNS_6__lessIffEEPfEEvT0_S5_T_;
+    _ZNSt3__118__insertion_sort_3IRNS_6__lessIhhEEPhEEvT0_S5_T_;
+    _ZNSt3__118__insertion_sort_3IRNS_6__lessIiiEEPiEEvT0_S5_T_;
+    _ZNSt3__118__insertion_sort_3IRNS_6__lessIjjEEPjEEvT0_S5_T_;
+    _ZNSt3__118__insertion_sort_3IRNS_6__lessIllEEPlEEvT0_S5_T_;
+    _ZNSt3__118__insertion_sort_3IRNS_6__lessImmEEPmEEvT0_S5_T_;
+    _ZNSt3__118__insertion_sort_3IRNS_6__lessIssEEPsEEvT0_S5_T_;
+    _ZNSt3__118__insertion_sort_3IRNS_6__lessIttEEPtEEvT0_S5_T_;
+    _ZNSt3__118__insertion_sort_3IRNS_6__lessIwwEEPwEEvT0_S5_T_;
+    _ZNSt3__118__insertion_sort_3IRNS_6__lessIxxEEPxEEvT0_S5_T_;
+    _ZNSt3__118__insertion_sort_3IRNS_6__lessIyyEEPyEEvT0_S5_T_;
+    _ZNSt3__118shared_timed_mutex11lock_sharedEv;
+    _ZNSt3__118shared_timed_mutex13unlock_sharedEv;
+    _ZNSt3__118shared_timed_mutex15try_lock_sharedEv;
+    _ZNSt3__118shared_timed_mutex4lockEv;
+    _ZNSt3__118shared_timed_mutex6unlockEv;
+    _ZNSt3__118shared_timed_mutex8try_lockEv;
+    _ZNSt3__118shared_timed_mutexC1Ev;
+    _ZNSt3__118shared_timed_mutexC2Ev;
+    _ZNSt3__118__time_get_storageIcE4initERKNS_5ctypeIcEE;
+    _ZNSt3__118__time_get_storageIcE9__analyzeEcRKNS_5ctypeIcEE;
+    _ZNSt3__118__time_get_storageIcEC1EPKc;
+    _ZNSt3__118__time_get_storageIcEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
+    _ZNSt3__118__time_get_storageIcEC2EPKc;
+    _ZNSt3__118__time_get_storageIcEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
+    _ZNSt3__118__time_get_storageIwE4initERKNS_5ctypeIwEE;
+    _ZNSt3__118__time_get_storageIwE9__analyzeEcRKNS_5ctypeIwEE;
+    _ZNSt3__118__time_get_storageIwEC1EPKc;
+    _ZNSt3__118__time_get_storageIwEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
+    _ZNSt3__118__time_get_storageIwEC2EPKc;
+    _ZNSt3__118__time_get_storageIwEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
+    _ZNSt3__119declare_no_pointersEPcj;
+    _ZNSt3__119piecewise_constructE;
+    _ZNSt3__119__shared_weak_count10__add_weakEv;
+    _ZNSt3__119__shared_weak_count12__add_sharedEv;
+    _ZNSt3__119__shared_weak_count14__release_weakEv;
+    _ZNSt3__119__shared_weak_count16__release_sharedEv;
+    _ZNSt3__119__shared_weak_count4lockEv;
+    _ZNSt3__119__shared_weak_countD0Ev;
+    _ZNSt3__119__shared_weak_countD1Ev;
+    _ZNSt3__119__shared_weak_countD2Ev;
+    _ZNSt3__119__start_std_streamsE;
+    _ZNSt3__119__thread_local_dataEv;
+    _ZNSt3__120__codecvt_utf8_utf16IDiED0Ev;
+    _ZNSt3__120__codecvt_utf8_utf16IDiED2Ev;
+    _ZNSt3__120__codecvt_utf8_utf16IDsED0Ev;
+    _ZNSt3__120__codecvt_utf8_utf16IDsED2Ev;
+    _ZNSt3__120__codecvt_utf8_utf16IwED0Ev;
+    _ZNSt3__120__codecvt_utf8_utf16IwED2Ev;
+    _ZNSt3__120__get_collation_nameEPKc;
+    _ZNSt3__120__throw_system_errorEiPKc;
+    _ZNSt3__120__time_get_c_storageIcEC2Ev;
+    _ZNSt3__120__time_get_c_storageIwEC2Ev;
+    _ZNSt3__121__murmur2_or_cityhashIjLj32EEclEPKvj;
+    _ZNSt3__121recursive_timed_mutex4lockEv;
+    _ZNSt3__121recursive_timed_mutex6unlockEv;
+    _ZNSt3__121recursive_timed_mutex8try_lockEv;
+    _ZNSt3__121recursive_timed_mutexC1Ev;
+    _ZNSt3__121recursive_timed_mutexC2Ev;
+    _ZNSt3__121recursive_timed_mutexD1Ev;
+    _ZNSt3__121recursive_timed_mutexD2Ev;
+    _ZNSt3__121__thread_specific_ptrINS_15__thread_structEE16__at_thread_exitEPv;
+    _ZNSt3__121__thread_specific_ptrINS_15__thread_structEEC2Ev;
+    _ZNSt3__121__thread_specific_ptrINS_15__thread_structEED2Ev;
+    _ZNSt3__121__throw_runtime_errorEPKc;
+    _ZNSt3__121undeclare_no_pointersEPcj;
+    _ZNSt3__121__undeclare_reachableEPv;
+    _ZNSt3__122__release_shared_countclEPNS_14__shared_countE;
+    _ZNSt3__123mersenne_twister_engineIjLj32ELj624ELj397ELj31ELj2567483615ELj11ELj4294967295ELj7ELj2636928640ELj15ELj4022730752ELj18ELj1812433253EE4seedEj;
+    _ZNSt3__123mersenne_twister_engineIjLj32ELj624ELj397ELj31ELj2567483615ELj11ELj4294967295ELj7ELj2636928640ELj15ELj4022730752ELj18ELj1812433253EEclEv;
+    _ZNSt3__125notify_all_at_thread_exitERNS_18condition_variableENS_11unique_lockINS_5mutexEEE;
+    _ZNSt3__125__num_get_signed_integralIlEET_PKcS3_Rji;
+    _ZNSt3__125__num_get_signed_integralIxEET_PKcS3_Rji;
+    _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIaaEEPaEEbT0_S5_T_;
+    _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIccEEPcEEbT0_S5_T_;
+    _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIddEEPdEEbT0_S5_T_;
+    _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIeeEEPeEEbT0_S5_T_;
+    _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIffEEPfEEbT0_S5_T_;
+    _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIhhEEPhEEbT0_S5_T_;
+    _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIiiEEPiEEbT0_S5_T_;
+    _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIjjEEPjEEbT0_S5_T_;
+    _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIllEEPlEEbT0_S5_T_;
+    _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessImmEEPmEEbT0_S5_T_;
+    _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIssEEPsEEbT0_S5_T_;
+    _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIttEEPtEEbT0_S5_T_;
+    _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIwwEEPwEEbT0_S5_T_;
+    _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIxxEEPxEEbT0_S5_T_;
+    _ZNSt3__127__insertion_sort_incompleteIRNS_6__lessIyyEEPyEEbT0_S5_T_;
+    _ZNSt3__127__num_get_unsigned_integralIjEET_PKcS3_Rji;
+    _ZNSt3__127__num_get_unsigned_integralImEET_PKcS3_Rji;
+    _ZNSt3__127__num_get_unsigned_integralItEET_PKcS3_Rji;
+    _ZNSt3__127__num_get_unsigned_integralIyEET_PKcS3_Rji;
+    _ZNSt3__13cinE;
+    _ZNSt3__14cerrE;
+    _ZNSt3__14clogE;
+    _ZNSt3__14coutE;
+    _ZNSt3__14stodERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPj;
+    _ZNSt3__14stodERKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEEPj;
+    _ZNSt3__14stofERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPj;
+    _ZNSt3__14stofERKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEEPj;
+    _ZNSt3__14stoiERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPji;
+    _ZNSt3__14stoiERKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEEPji;
+    _ZNSt3__14stolERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPji;
+    _ZNSt3__14stolERKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEEPji;
+    _ZNSt3__14wcinE;
+    _ZNSt3__15alignEjjRPvRj;
+    _ZNSt3__15ctypeIcE13classic_tableEv;
+    _ZNSt3__15ctypeIcE2idE;
+    _ZNSt3__15ctypeIcEC1EPKtbj;
+    _ZNSt3__15ctypeIcEC2EPKtbj;
+    _ZNSt3__15ctypeIcED0Ev;
+    _ZNSt3__15ctypeIcED1Ev;
+    _ZNSt3__15ctypeIcED2Ev;
+    _ZNSt3__15ctypeIwE2idE;
+    _ZNSt3__15ctypeIwED0Ev;
+    _ZNSt3__15ctypeIwED1Ev;
+    _ZNSt3__15ctypeIwED2Ev;
+    _ZNSt3__15mutex4lockEv;
+    _ZNSt3__15mutex6unlockEv;
+    _ZNSt3__15mutex8try_lockEv;
+    _ZNSt3__15mutexD1Ev;
+    _ZNSt3__15mutexD2Ev;
+    _ZNSt3__15stoldERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPj;
+    _ZNSt3__15stoldERKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEEPj;
+    _ZNSt3__15stollERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPji;
+    _ZNSt3__15stollERKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEEPji;
+    _ZNSt3__15stoulERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPji;
+    _ZNSt3__15stoulERKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEEPji;
+    _ZNSt3__15wcerrE;
+    _ZNSt3__15wclogE;
+    _ZNSt3__15wcoutE;
+    _ZNSt3__16chrono12steady_clock3nowEv;
+    _ZNSt3__16chrono12steady_clock9is_steadyE;
+    _ZNSt3__16chrono12system_clock11from_time_tEl;
+    _ZNSt3__16chrono12system_clock3nowEv;
+    _ZNSt3__16chrono12system_clock9is_steadyE;
+    _ZNSt3__16chrono12system_clock9to_time_tERKNS0_10time_pointIS1_NS0_8durationIxNS_5ratioILx1ELx1000000EEEEEEE;
+    _ZNSt3__16__clocEv;
+    _ZNSt3__16futureIvE3getEv;
+    _ZNSt3__16futureIvEC1EPNS_17__assoc_sub_stateE;
+    _ZNSt3__16futureIvEC2EPNS_17__assoc_sub_stateE;
+    _ZNSt3__16futureIvED1Ev;
+    _ZNSt3__16futureIvED2Ev;
+    _ZNSt3__16gslice6__initEj;
+    _ZNSt3__16locale14__install_ctorERKS0_PNS0_5facetEl;
+    _ZNSt3__16locale2id5__getEv;
+    _ZNSt3__16locale2id6__initEv;
+    _ZNSt3__16locale2id9__next_idE;
+    _ZNSt3__16locale3allE;
+    _ZNSt3__16locale4noneE;
+    _ZNSt3__16locale4timeE;
+    _ZNSt3__16locale5ctypeE;
+    _ZNSt3__16locale5facet16__on_zero_sharedEv;
+    _ZNSt3__16locale5facetD0Ev;
+    _ZNSt3__16locale5facetD1Ev;
+    _ZNSt3__16locale5facetD2Ev;
+    _ZNSt3__16locale6globalERKS0_;
+    _ZNSt3__16locale7classicEv;
+    _ZNSt3__16locale7collateE;
+    _ZNSt3__16locale7numericE;
+    _ZNSt3__16locale8__globalEv;
+    _ZNSt3__16locale8messagesE;
+    _ZNSt3__16locale8monetaryE;
+    _ZNSt3__16localeaSERKS0_;
+    _ZNSt3__16localeC1EPKc;
+    _ZNSt3__16localeC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
+    _ZNSt3__16localeC1ERKS0_;
+    _ZNSt3__16localeC1ERKS0_PKci;
+    _ZNSt3__16localeC1ERKS0_RKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEi;
+    _ZNSt3__16localeC1ERKS0_S2_i;
+    _ZNSt3__16localeC1Ev;
+    _ZNSt3__16localeC2EPKc;
+    _ZNSt3__16localeC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE;
+    _ZNSt3__16localeC2ERKS0_;
+    _ZNSt3__16localeC2ERKS0_PKci;
+    _ZNSt3__16localeC2ERKS0_RKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEi;
+    _ZNSt3__16localeC2ERKS0_S2_i;
+    _ZNSt3__16localeC2Ev;
+    _ZNSt3__16localeD1Ev;
+    _ZNSt3__16localeD2Ev;
+    _ZNSt3__16__sortIRNS_6__lessIaaEEPaEEvT0_S5_T_;
+    _ZNSt3__16__sortIRNS_6__lessIccEEPcEEvT0_S5_T_;
+    _ZNSt3__16__sortIRNS_6__lessIddEEPdEEvT0_S5_T_;
+    _ZNSt3__16__sortIRNS_6__lessIeeEEPeEEvT0_S5_T_;
+    _ZNSt3__16__sortIRNS_6__lessIffEEPfEEvT0_S5_T_;
+    _ZNSt3__16__sortIRNS_6__lessIhhEEPhEEvT0_S5_T_;
+    _ZNSt3__16__sortIRNS_6__lessIiiEEPiEEvT0_S5_T_;
+    _ZNSt3__16__sortIRNS_6__lessIjjEEPjEEvT0_S5_T_;
+    _ZNSt3__16__sortIRNS_6__lessIllEEPlEEvT0_S5_T_;
+    _ZNSt3__16__sortIRNS_6__lessImmEEPmEEvT0_S5_T_;
+    _ZNSt3__16__sortIRNS_6__lessIssEEPsEEvT0_S5_T_;
+    _ZNSt3__16__sortIRNS_6__lessIttEEPtEEvT0_S5_T_;
+    _ZNSt3__16__sortIRNS_6__lessIwwEEPwEEvT0_S5_T_;
+    _ZNSt3__16__sortIRNS_6__lessIxxEEPxEEvT0_S5_T_;
+    _ZNSt3__16__sortIRNS_6__lessIyyEEPyEEvT0_S5_T_;
+    _ZNSt3__16stoullERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPji;
+    _ZNSt3__16stoullERKNS_12basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEEEPji;
+    _ZNSt3__16thread20hardware_concurrencyEv;
+    _ZNSt3__16thread4joinEv;
+    _ZNSt3__16thread6detachEv;
+    _ZNSt3__16threadD1Ev;
+    _ZNSt3__16threadD2Ev;
+    _ZNSt3__17codecvtIcc9mbstate_tE2idE;
+    _ZNSt3__17codecvtIcc9mbstate_tED0Ev;
+    _ZNSt3__17codecvtIcc9mbstate_tED1Ev;
+    _ZNSt3__17codecvtIcc9mbstate_tED2Ev;
+    _ZNSt3__17codecvtIDic9mbstate_tE2idE;
+    _ZNSt3__17codecvtIDic9mbstate_tED0Ev;
+    _ZNSt3__17codecvtIDic9mbstate_tED1Ev;
+    _ZNSt3__17codecvtIDic9mbstate_tED2Ev;
+    _ZNSt3__17codecvtIDsc9mbstate_tE2idE;
+    _ZNSt3__17codecvtIDsc9mbstate_tED0Ev;
+    _ZNSt3__17codecvtIDsc9mbstate_tED1Ev;
+    _ZNSt3__17codecvtIDsc9mbstate_tED2Ev;
+    _ZNSt3__17codecvtIwc9mbstate_tE2idE;
+    _ZNSt3__17codecvtIwc9mbstate_tEC1Ej;
+    _ZNSt3__17codecvtIwc9mbstate_tEC1EPKcj;
+    _ZNSt3__17codecvtIwc9mbstate_tEC2Ej;
+    _ZNSt3__17codecvtIwc9mbstate_tEC2EPKcj;
+    _ZNSt3__17codecvtIwc9mbstate_tED0Ev;
+    _ZNSt3__17codecvtIwc9mbstate_tED1Ev;
+    _ZNSt3__17codecvtIwc9mbstate_tED2Ev;
+    _ZNSt3__17collateIcE2idE;
+    _ZNSt3__17collateIcED0Ev;
+    _ZNSt3__17collateIcED1Ev;
+    _ZNSt3__17collateIcED2Ev;
+    _ZNSt3__17collateIwE2idE;
+    _ZNSt3__17collateIwED0Ev;
+    _ZNSt3__17collateIwED1Ev;
+    _ZNSt3__17collateIwED2Ev;
+    _ZNSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE2idE;
+    _ZNSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE2idE;
+    _ZNSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE2idE;
+    _ZNSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE2idE;
+    _ZNSt3__17promiseIvE10get_futureEv;
+    _ZNSt3__17promiseIvE13set_exceptionESt13exception_ptr;
+    _ZNSt3__17promiseIvE24set_value_at_thread_exitEv;
+    _ZNSt3__17promiseIvE28set_exception_at_thread_exitESt13exception_ptr;
+    _ZNSt3__17promiseIvE9set_valueEv;
+    _ZNSt3__17promiseIvEC1Ev;
+    _ZNSt3__17promiseIvEC2Ev;
+    _ZNSt3__17promiseIvED1Ev;
+    _ZNSt3__17promiseIvED2Ev;
+    _ZNSt3__17__sort3IRNS_6__lessIaaEEPaEEjT0_S5_S5_T_;
+    _ZNSt3__17__sort3IRNS_6__lessIccEEPcEEjT0_S5_S5_T_;
+    _ZNSt3__17__sort3IRNS_6__lessIddEEPdEEjT0_S5_S5_T_;
+    _ZNSt3__17__sort3IRNS_6__lessIeeEEPeEEjT0_S5_S5_T_;
+    _ZNSt3__17__sort3IRNS_6__lessIffEEPfEEjT0_S5_S5_T_;
+    _ZNSt3__17__sort3IRNS_6__lessIhhEEPhEEjT0_S5_S5_T_;
+    _ZNSt3__17__sort3IRNS_6__lessIiiEEPiEEjT0_S5_S5_T_;
+    _ZNSt3__17__sort3IRNS_6__lessIjjEEPjEEjT0_S5_S5_T_;
+    _ZNSt3__17__sort3IRNS_6__lessIllEEPlEEjT0_S5_S5_T_;
+    _ZNSt3__17__sort3IRNS_6__lessImmEEPmEEjT0_S5_S5_T_;
+    _ZNSt3__17__sort3IRNS_6__lessIssEEPsEEjT0_S5_S5_T_;
+    _ZNSt3__17__sort3IRNS_6__lessIttEEPtEEjT0_S5_S5_T_;
+    _ZNSt3__17__sort3IRNS_6__lessIwwEEPwEEjT0_S5_S5_T_;
+    _ZNSt3__17__sort3IRNS_6__lessIxxEEPxEEjT0_S5_S5_T_;
+    _ZNSt3__17__sort3IRNS_6__lessIyyEEPyEEjT0_S5_S5_T_;
+    _ZNSt3__17__sort4IRNS_6__lessIaaEEPaEEjT0_S5_S5_S5_T_;
+    _ZNSt3__17__sort4IRNS_6__lessIccEEPcEEjT0_S5_S5_S5_T_;
+    _ZNSt3__17__sort4IRNS_6__lessIddEEPdEEjT0_S5_S5_S5_T_;
+    _ZNSt3__17__sort4IRNS_6__lessIeeEEPeEEjT0_S5_S5_S5_T_;
+    _ZNSt3__17__sort4IRNS_6__lessIffEEPfEEjT0_S5_S5_S5_T_;
+    _ZNSt3__17__sort4IRNS_6__lessIhhEEPhEEjT0_S5_S5_S5_T_;
+    _ZNSt3__17__sort4IRNS_6__lessIiiEEPiEEjT0_S5_S5_S5_T_;
+    _ZNSt3__17__sort4IRNS_6__lessIjjEEPjEEjT0_S5_S5_S5_T_;
+    _ZNSt3__17__sort4IRNS_6__lessIllEEPlEEjT0_S5_S5_S5_T_;
+    _ZNSt3__17__sort4IRNS_6__lessImmEEPmEEjT0_S5_S5_S5_T_;
+    _ZNSt3__17__sort4IRNS_6__lessIssEEPsEEjT0_S5_S5_S5_T_;
+    _ZNSt3__17__sort4IRNS_6__lessIttEEPtEEjT0_S5_S5_S5_T_;
+    _ZNSt3__17__sort4IRNS_6__lessIwwEEPwEEjT0_S5_S5_S5_T_;
+    _ZNSt3__17__sort4IRNS_6__lessIxxEEPxEEjT0_S5_S5_S5_T_;
+    _ZNSt3__17__sort4IRNS_6__lessIyyEEPyEEjT0_S5_S5_S5_T_;
+    _ZNSt3__17__sort5IRNS_6__lessIaaEEPaEEjT0_S5_S5_S5_S5_T_;
+    _ZNSt3__17__sort5IRNS_6__lessIccEEPcEEjT0_S5_S5_S5_S5_T_;
+    _ZNSt3__17__sort5IRNS_6__lessIddEEPdEEjT0_S5_S5_S5_S5_T_;
+    _ZNSt3__17__sort5IRNS_6__lessIeeEEPeEEjT0_S5_S5_S5_S5_T_;
+    _ZNSt3__17__sort5IRNS_6__lessIffEEPfEEjT0_S5_S5_S5_S5_T_;
+    _ZNSt3__17__sort5IRNS_6__lessIhhEEPhEEjT0_S5_S5_S5_S5_T_;
+    _ZNSt3__17__sort5IRNS_6__lessIiiEEPiEEjT0_S5_S5_S5_S5_T_;
+    _ZNSt3__17__sort5IRNS_6__lessIjjEEPjEEjT0_S5_S5_S5_S5_T_;
+    _ZNSt3__17__sort5IRNS_6__lessIllEEPlEEjT0_S5_S5_S5_S5_T_;
+    _ZNSt3__17__sort5IRNS_6__lessImmEEPmEEjT0_S5_S5_S5_S5_T_;
+    _ZNSt3__17__sort5IRNS_6__lessIssEEPsEEjT0_S5_S5_S5_S5_T_;
+    _ZNSt3__17__sort5IRNS_6__lessIttEEPtEEjT0_S5_S5_S5_S5_T_;
+    _ZNSt3__17__sort5IRNS_6__lessIwwEEPwEEjT0_S5_S5_S5_S5_T_;
+    _ZNSt3__17__sort5IRNS_6__lessIxxEEPxEEjT0_S5_S5_S5_S5_T_;
+    _ZNSt3__17__sort5IRNS_6__lessIyyEEPyEEjT0_S5_S5_S5_S5_T_;
+    _ZNSt3__18__c_node5__addEPNS_8__i_nodeE;
+    _ZNSt3__18__c_nodeD0Ev;
+    _ZNSt3__18__c_nodeD1Ev;
+    _ZNSt3__18__c_nodeD2Ev;
+    _ZNSt3__18__get_dbEv;
+    _ZNSt3__18__i_nodeD1Ev;
+    _ZNSt3__18__i_nodeD2Ev;
+    _ZNSt3__18ios_base10floatfieldE;
+    _ZNSt3__18ios_base10scientificE;
+    _ZNSt3__18ios_base11adjustfieldE;
+    _ZNSt3__18ios_base15sync_with_stdioEb;
+    _ZNSt3__18ios_base16__call_callbacksENS0_5eventE;
+    _ZNSt3__18ios_base17register_callbackEPFvNS0_5eventERS0_iEi;
+    _ZNSt3__18ios_base2inE;
+    _ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv;
+    _ZNSt3__18ios_base34__set_failbit_and_consider_rethrowEv;
+    _ZNSt3__18ios_base3appE;
+    _ZNSt3__18ios_base3ateE;
+    _ZNSt3__18ios_base3decE;
+    _ZNSt3__18ios_base3hexE;
+    _ZNSt3__18ios_base3octE;
+    _ZNSt3__18ios_base3outE;
+    _ZNSt3__18ios_base4InitC1Ev;
+    _ZNSt3__18ios_base4InitC2Ev;
+    _ZNSt3__18ios_base4InitD1Ev;
+    _ZNSt3__18ios_base4InitD2Ev;
+    _ZNSt3__18ios_base4initEPv;
+    _ZNSt3__18ios_base4leftE;
+    _ZNSt3__18ios_base4moveERS0_;
+    _ZNSt3__18ios_base4swapERS0_;
+    _ZNSt3__18ios_base5clearEj;
+    _ZNSt3__18ios_base5fixedE;
+    _ZNSt3__18ios_base5imbueERKNS_6localeE;
+    _ZNSt3__18ios_base5iwordEi;
+    _ZNSt3__18ios_base5pwordEi;
+    _ZNSt3__18ios_base5rightE;
+    _ZNSt3__18ios_base5truncE;
+    _ZNSt3__18ios_base6badbitE;
+    _ZNSt3__18ios_base6binaryE;
+    _ZNSt3__18ios_base6eofbitE;
+    _ZNSt3__18ios_base6skipwsE;
+    _ZNSt3__18ios_base6xallocEv;
+    _ZNSt3__18ios_base7copyfmtERKS0_;
+    _ZNSt3__18ios_base7failbitE;
+    _ZNSt3__18ios_base7failureC1EPKcRKNS_10error_codeE;
+    _ZNSt3__18ios_base7failureC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERKNS_10error_codeE;
+    _ZNSt3__18ios_base7failureC2EPKcRKNS_10error_codeE;
+    _ZNSt3__18ios_base7failureC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERKNS_10error_codeE;
+    _ZNSt3__18ios_base7failureD0Ev;
+    _ZNSt3__18ios_base7failureD1Ev;
+    _ZNSt3__18ios_base7failureD2Ev;
+    _ZNSt3__18ios_base7goodbitE;
+    _ZNSt3__18ios_base7showposE;
+    _ZNSt3__18ios_base7unitbufE;
+    _ZNSt3__18ios_base8internalE;
+    _ZNSt3__18ios_base8showbaseE;
+    _ZNSt3__18ios_base9basefieldE;
+    _ZNSt3__18ios_base9boolalphaE;
+    _ZNSt3__18ios_base9showpointE;
+    _ZNSt3__18ios_base9uppercaseE;
+    _ZNSt3__18ios_base9__xindex_E;
+    _ZNSt3__18ios_baseD0Ev;
+    _ZNSt3__18ios_baseD1Ev;
+    _ZNSt3__18ios_baseD2Ev;
+    _ZNSt3__18messagesIcE2idE;
+    _ZNSt3__18messagesIwE2idE;
+    _ZNSt3__18numpunctIcE2idE;
+    _ZNSt3__18numpunctIcEC1Ej;
+    _ZNSt3__18numpunctIcEC2Ej;
+    _ZNSt3__18numpunctIcED0Ev;
+    _ZNSt3__18numpunctIcED1Ev;
+    _ZNSt3__18numpunctIcED2Ev;
+    _ZNSt3__18numpunctIwE2idE;
+    _ZNSt3__18numpunctIwEC1Ej;
+    _ZNSt3__18numpunctIwEC2Ej;
+    _ZNSt3__18numpunctIwED0Ev;
+    _ZNSt3__18numpunctIwED1Ev;
+    _ZNSt3__18numpunctIwED2Ev;
+    _ZNSt3__18__rs_getEv;
+    _ZNSt3__18__sp_mut4lockEv;
+    _ZNSt3__18__sp_mut6unlockEv;
+    _ZNSt3__18__sp_mutC2EPv;
+    _ZNSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE2idE;
+    _ZNSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE2idE;
+    _ZNSt3__18time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE2idE;
+    _ZNSt3__18time_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE2idE;
+    _ZNSt3__18valarrayIjE6resizeEjj;
+    _ZNSt3__18valarrayIjEC1Ej;
+    _ZNSt3__18valarrayIjEC2Ej;
+    _ZNSt3__18valarrayIjED1Ev;
+    _ZNSt3__18valarrayIjED2Ev;
+    _ZNSt3__19basic_iosIcNS_11char_traitsIcEEE7copyfmtERKS3_;
+    _ZNSt3__19basic_iosIcNS_11char_traitsIcEEED0Ev;
+    _ZNSt3__19basic_iosIcNS_11char_traitsIcEEED1Ev;
+    _ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev;
+    _ZNSt3__19basic_iosIwNS_11char_traitsIwEEE7copyfmtERKS3_;
+    _ZNSt3__19basic_iosIwNS_11char_traitsIwEEED0Ev;
+    _ZNSt3__19basic_iosIwNS_11char_traitsIwEEED1Ev;
+    _ZNSt3__19basic_iosIwNS_11char_traitsIwEEED2Ev;
+    _ZNSt3__19money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE2idE;
+    _ZNSt3__19money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEE8__do_getERS4_S4_bRKNS_6localeEjRjRbRKNS_5ctypeIcEERNS_10unique_ptrIcPFvPvEEERPcSM_;
+    _ZNSt3__19money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE2idE;
+    _ZNSt3__19money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEE8__do_getERS4_S4_bRKNS_6localeEjRjRbRKNS_5ctypeIwEERNS_10unique_ptrIwPFvPvEEERPwSM_;
+    _ZNSt3__19money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEE2idE;
+    _ZNSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEE2idE;
+    _ZNSt3__19__num_getIcE17__stage2_int_loopEciPcRS2_RjcRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPjRSD_S2_;
+    _ZNSt3__19__num_getIcE17__stage2_int_prepERNS_8ios_baseEPcRc;
+    _ZNSt3__19__num_getIcE19__stage2_float_loopEcRbRcPcRS4_ccRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPjRSE_RjS4_;
+    _ZNSt3__19__num_getIcE19__stage2_float_prepERNS_8ios_baseEPcRcS5_;
+    _ZNSt3__19__num_getIwE17__stage2_int_loopEwiPcRS2_RjwRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPjRSD_Pw;
+    _ZNSt3__19__num_getIwE17__stage2_int_prepERNS_8ios_baseEPwRw;
+    _ZNSt3__19__num_getIwE19__stage2_float_loopEwRbRcPcRS4_wwRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEPjRSE_RjPw;
+    _ZNSt3__19__num_getIwE19__stage2_float_prepERNS_8ios_baseEPwRwS5_;
+    _ZNSt3__19__num_putIcE21__widen_and_group_intEPcS2_S2_S2_RS2_S3_RKNS_6localeE;
+    _ZNSt3__19__num_putIcE23__widen_and_group_floatEPcS2_S2_S2_RS2_S3_RKNS_6localeE;
+    _ZNSt3__19__num_putIwE21__widen_and_group_intEPcS2_S2_PwRS3_S4_RKNS_6localeE;
+    _ZNSt3__19__num_putIwE23__widen_and_group_floatEPcS2_S2_PwRS3_S4_RKNS_6localeE;
+    _ZNSt3__19strstreamD0Ev;
+    _ZNSt3__19strstreamD1Ev;
+    _ZNSt3__19strstreamD2Ev;
+    _ZNSt3__19to_stringEd;
+    _ZNSt3__19to_stringEe;
+    _ZNSt3__19to_stringEf;
+    _ZNSt3__19to_stringEi;
+    _ZNSt3__19to_stringEj;
+    _ZNSt3__19to_stringEl;
+    _ZNSt3__19to_stringEm;
+    _ZNSt3__19to_stringEx;
+    _ZNSt3__19to_stringEy;
+    _ZNSt3__1plIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EEPKS6_RKS9_;
+    _ZNSt3__1plIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EERKS9_PKS6_;
+    _Znwj;
+    _ZnwjRKSt9nothrow_t;
+    _ZSt17current_exceptionv;
+    _ZSt17rethrow_exceptionSt13exception_ptr;
+    _ZSt17__throw_bad_allocv;
+    _ZSt18make_exception_ptrINSt3__112future_errorEESt13exception_ptrT_;
+    _ZSt18uncaught_exceptionv;
+    _ZSt7nothrow;
+    _ZTCNSt3__110istrstreamE0_NS_13basic_istreamIcNS_11char_traitsIcEEEE;
+    _ZTCNSt3__110ostrstreamE0_NS_13basic_ostreamIcNS_11char_traitsIcEEEE;
+    _ZTCNSt3__114basic_iostreamIcNS_11char_traitsIcEEEE0_NS_13basic_istreamIcS2_EE;
+    _ZTCNSt3__114basic_iostreamIcNS_11char_traitsIcEEEE8_NS_13basic_ostreamIcS2_EE;
+    _ZTCNSt3__19strstreamE0_NS_13basic_istreamIcNS_11char_traitsIcEEEE;
+    _ZTCNSt3__19strstreamE0_NS_14basic_iostreamIcNS_11char_traitsIcEEEE;
+    _ZTCNSt3__19strstreamE8_NS_13basic_ostreamIcNS_11char_traitsIcEEEE;
+    _ZThn8_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev;
+    _ZThn8_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev;
+    _ZThn8_NSt3__19strstreamD0Ev;
+    _ZThn8_NSt3__19strstreamD1Ev;
+    _ZTINSt12experimental19bad_optional_accessE;
+    _ZTINSt3__110ctype_baseE;
+    _ZTINSt3__110istrstreamE;
+    _ZTINSt3__110money_baseE;
+    _ZTINSt3__110moneypunctIcLb0EEE;
+    _ZTINSt3__110moneypunctIcLb1EEE;
+    _ZTINSt3__110moneypunctIwLb0EEE;
+    _ZTINSt3__110moneypunctIwLb1EEE;
+    _ZTINSt3__110ostrstreamE;
+    _ZTINSt3__110__time_getE;
+    _ZTINSt3__110__time_putE;
+    _ZTINSt3__111__money_getIcEE;
+    _ZTINSt3__111__money_getIwEE;
+    _ZTINSt3__111__money_putIcEE;
+    _ZTINSt3__111__money_putIwEE;
+    _ZTINSt3__111regex_errorE;
+    _ZTINSt3__112bad_weak_ptrE;
+    _ZTINSt3__112codecvt_baseE;
+    _ZTINSt3__112ctype_bynameIcEE;
+    _ZTINSt3__112ctype_bynameIwEE;
+    _ZTINSt3__112future_errorE;
+    _ZTINSt3__112strstreambufE;
+    _ZTINSt3__112system_errorE;
+    _ZTINSt3__113basic_istreamIcNS_11char_traitsIcEEEE;
+    _ZTINSt3__113basic_istreamIwNS_11char_traitsIwEEEE;
+    _ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE;
+    _ZTINSt3__113basic_ostreamIwNS_11char_traitsIwEEEE;
+    _ZTINSt3__113messages_baseE;
+    _ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE;
+    _ZTINSt3__114codecvt_bynameIcc9mbstate_tEE;
+    _ZTINSt3__114codecvt_bynameIDic9mbstate_tEE;
+    _ZTINSt3__114codecvt_bynameIDsc9mbstate_tEE;
+    _ZTINSt3__114codecvt_bynameIwc9mbstate_tEE;
+    _ZTINSt3__114__codecvt_utf8IDiEE;
+    _ZTINSt3__114__codecvt_utf8IDsEE;
+    _ZTINSt3__114__codecvt_utf8IwEE;
+    _ZTINSt3__114collate_bynameIcEE;
+    _ZTINSt3__114collate_bynameIwEE;
+    _ZTINSt3__114error_categoryE;
+    _ZTINSt3__114__num_get_baseE;
+    _ZTINSt3__114__num_put_baseE;
+    _ZTINSt3__114__shared_countE;
+    _ZTINSt3__115basic_streambufIcNS_11char_traitsIcEEEE;
+    _ZTINSt3__115basic_streambufIwNS_11char_traitsIwEEEE;
+    _ZTINSt3__115__codecvt_utf16IDiLb0EEE;
+    _ZTINSt3__115__codecvt_utf16IDiLb1EEE;
+    _ZTINSt3__115__codecvt_utf16IDsLb0EEE;
+    _ZTINSt3__115__codecvt_utf16IDsLb1EEE;
+    _ZTINSt3__115__codecvt_utf16IwLb0EEE;
+    _ZTINSt3__115__codecvt_utf16IwLb1EEE;
+    _ZTINSt3__115messages_bynameIcEE;
+    _ZTINSt3__115messages_bynameIwEE;
+    _ZTINSt3__115numpunct_bynameIcEE;
+    _ZTINSt3__115numpunct_bynameIwEE;
+    _ZTINSt3__115time_get_bynameIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTINSt3__115time_get_bynameIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTINSt3__115time_put_bynameIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTINSt3__115time_put_bynameIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTINSt3__116__narrow_to_utf8ILj16EEE;
+    _ZTINSt3__116__narrow_to_utf8ILj32EEE;
+    _ZTINSt3__117__assoc_sub_stateE;
+    _ZTINSt3__117moneypunct_bynameIcLb0EEE;
+    _ZTINSt3__117moneypunct_bynameIcLb1EEE;
+    _ZTINSt3__117moneypunct_bynameIwLb0EEE;
+    _ZTINSt3__117moneypunct_bynameIwLb1EEE;
+    _ZTINSt3__117__widen_from_utf8ILj16EEE;
+    _ZTINSt3__117__widen_from_utf8ILj32EEE;
+    _ZTINSt3__118__time_get_storageIcEE;
+    _ZTINSt3__118__time_get_storageIwEE;
+    _ZTINSt3__119__shared_weak_countE;
+    _ZTINSt3__120__codecvt_utf8_utf16IDiEE;
+    _ZTINSt3__120__codecvt_utf8_utf16IDsEE;
+    _ZTINSt3__120__codecvt_utf8_utf16IwEE;
+    _ZTINSt3__120__time_get_c_storageIcEE;
+    _ZTINSt3__120__time_get_c_storageIwEE;
+    _ZTINSt3__15ctypeIcEE;
+    _ZTINSt3__15ctypeIwEE;
+    _ZTINSt3__16locale5facetE;
+    _ZTINSt3__17codecvtIcc9mbstate_tEE;
+    _ZTINSt3__17codecvtIDic9mbstate_tEE;
+    _ZTINSt3__17codecvtIDsc9mbstate_tEE;
+    _ZTINSt3__17codecvtIwc9mbstate_tEE;
+    _ZTINSt3__17collateIcEE;
+    _ZTINSt3__17collateIwEE;
+    _ZTINSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTINSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTINSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTINSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTINSt3__18__c_nodeE;
+    _ZTINSt3__18ios_base7failureE;
+    _ZTINSt3__18ios_baseE;
+    _ZTINSt3__18messagesIcEE;
+    _ZTINSt3__18messagesIwEE;
+    _ZTINSt3__18numpunctIcEE;
+    _ZTINSt3__18numpunctIwEE;
+    _ZTINSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTINSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTINSt3__18time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTINSt3__18time_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTINSt3__19basic_iosIcNS_11char_traitsIcEEEE;
+    _ZTINSt3__19basic_iosIwNS_11char_traitsIwEEEE;
+    _ZTINSt3__19money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTINSt3__19money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTINSt3__19money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTINSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTINSt3__19__num_getIcEE;
+    _ZTINSt3__19__num_getIwEE;
+    _ZTINSt3__19__num_putIcEE;
+    _ZTINSt3__19__num_putIwEE;
+    _ZTINSt3__19strstreamE;
+    _ZTINSt3__19time_baseE;
+    _ZTISt16nested_exception;
+    _ZTSNSt12experimental19bad_optional_accessE;
+    _ZTSNSt3__110ctype_baseE;
+    _ZTSNSt3__110istrstreamE;
+    _ZTSNSt3__110money_baseE;
+    _ZTSNSt3__110moneypunctIcLb0EEE;
+    _ZTSNSt3__110moneypunctIcLb1EEE;
+    _ZTSNSt3__110moneypunctIwLb0EEE;
+    _ZTSNSt3__110moneypunctIwLb1EEE;
+    _ZTSNSt3__110ostrstreamE;
+    _ZTSNSt3__110__time_getE;
+    _ZTSNSt3__110__time_putE;
+    _ZTSNSt3__111__money_getIcEE;
+    _ZTSNSt3__111__money_getIwEE;
+    _ZTSNSt3__111__money_putIcEE;
+    _ZTSNSt3__111__money_putIwEE;
+    _ZTSNSt3__111regex_errorE;
+    _ZTSNSt3__112bad_weak_ptrE;
+    _ZTSNSt3__112codecvt_baseE;
+    _ZTSNSt3__112ctype_bynameIcEE;
+    _ZTSNSt3__112ctype_bynameIwEE;
+    _ZTSNSt3__112future_errorE;
+    _ZTSNSt3__112strstreambufE;
+    _ZTSNSt3__112system_errorE;
+    _ZTSNSt3__113basic_istreamIcNS_11char_traitsIcEEEE;
+    _ZTSNSt3__113basic_istreamIwNS_11char_traitsIwEEEE;
+    _ZTSNSt3__113basic_ostreamIcNS_11char_traitsIcEEEE;
+    _ZTSNSt3__113basic_ostreamIwNS_11char_traitsIwEEEE;
+    _ZTSNSt3__113messages_baseE;
+    _ZTSNSt3__114basic_iostreamIcNS_11char_traitsIcEEEE;
+    _ZTSNSt3__114codecvt_bynameIcc9mbstate_tEE;
+    _ZTSNSt3__114codecvt_bynameIDic9mbstate_tEE;
+    _ZTSNSt3__114codecvt_bynameIDsc9mbstate_tEE;
+    _ZTSNSt3__114codecvt_bynameIwc9mbstate_tEE;
+    _ZTSNSt3__114__codecvt_utf8IDiEE;
+    _ZTSNSt3__114__codecvt_utf8IDsEE;
+    _ZTSNSt3__114__codecvt_utf8IwEE;
+    _ZTSNSt3__114collate_bynameIcEE;
+    _ZTSNSt3__114collate_bynameIwEE;
+    _ZTSNSt3__114error_categoryE;
+    _ZTSNSt3__114__num_get_baseE;
+    _ZTSNSt3__114__num_put_baseE;
+    _ZTSNSt3__114__shared_countE;
+    _ZTSNSt3__115basic_streambufIcNS_11char_traitsIcEEEE;
+    _ZTSNSt3__115basic_streambufIwNS_11char_traitsIwEEEE;
+    _ZTSNSt3__115__codecvt_utf16IDiLb0EEE;
+    _ZTSNSt3__115__codecvt_utf16IDiLb1EEE;
+    _ZTSNSt3__115__codecvt_utf16IDsLb0EEE;
+    _ZTSNSt3__115__codecvt_utf16IDsLb1EEE;
+    _ZTSNSt3__115__codecvt_utf16IwLb0EEE;
+    _ZTSNSt3__115__codecvt_utf16IwLb1EEE;
+    _ZTSNSt3__115messages_bynameIcEE;
+    _ZTSNSt3__115messages_bynameIwEE;
+    _ZTSNSt3__115numpunct_bynameIcEE;
+    _ZTSNSt3__115numpunct_bynameIwEE;
+    _ZTSNSt3__115time_get_bynameIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTSNSt3__115time_get_bynameIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTSNSt3__115time_put_bynameIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTSNSt3__115time_put_bynameIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTSNSt3__116__narrow_to_utf8ILj16EEE;
+    _ZTSNSt3__116__narrow_to_utf8ILj32EEE;
+    _ZTSNSt3__117__assoc_sub_stateE;
+    _ZTSNSt3__117moneypunct_bynameIcLb0EEE;
+    _ZTSNSt3__117moneypunct_bynameIcLb1EEE;
+    _ZTSNSt3__117moneypunct_bynameIwLb0EEE;
+    _ZTSNSt3__117moneypunct_bynameIwLb1EEE;
+    _ZTSNSt3__117__widen_from_utf8ILj16EEE;
+    _ZTSNSt3__117__widen_from_utf8ILj32EEE;
+    _ZTSNSt3__118__time_get_storageIcEE;
+    _ZTSNSt3__118__time_get_storageIwEE;
+    _ZTSNSt3__119__shared_weak_countE;
+    _ZTSNSt3__120__codecvt_utf8_utf16IDiEE;
+    _ZTSNSt3__120__codecvt_utf8_utf16IDsEE;
+    _ZTSNSt3__120__codecvt_utf8_utf16IwEE;
+    _ZTSNSt3__120__time_get_c_storageIcEE;
+    _ZTSNSt3__120__time_get_c_storageIwEE;
+    _ZTSNSt3__15ctypeIcEE;
+    _ZTSNSt3__15ctypeIwEE;
+    _ZTSNSt3__16locale5facetE;
+    _ZTSNSt3__17codecvtIcc9mbstate_tEE;
+    _ZTSNSt3__17codecvtIDic9mbstate_tEE;
+    _ZTSNSt3__17codecvtIDsc9mbstate_tEE;
+    _ZTSNSt3__17codecvtIwc9mbstate_tEE;
+    _ZTSNSt3__17collateIcEE;
+    _ZTSNSt3__17collateIwEE;
+    _ZTSNSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTSNSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTSNSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTSNSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTSNSt3__18__c_nodeE;
+    _ZTSNSt3__18ios_base7failureE;
+    _ZTSNSt3__18ios_baseE;
+    _ZTSNSt3__18messagesIcEE;
+    _ZTSNSt3__18messagesIwEE;
+    _ZTSNSt3__18numpunctIcEE;
+    _ZTSNSt3__18numpunctIwEE;
+    _ZTSNSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTSNSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTSNSt3__18time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTSNSt3__18time_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTSNSt3__19basic_iosIcNS_11char_traitsIcEEEE;
+    _ZTSNSt3__19basic_iosIwNS_11char_traitsIwEEEE;
+    _ZTSNSt3__19money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTSNSt3__19money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTSNSt3__19money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTSNSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTSNSt3__19__num_getIcEE;
+    _ZTSNSt3__19__num_getIwEE;
+    _ZTSNSt3__19__num_putIcEE;
+    _ZTSNSt3__19__num_putIwEE;
+    _ZTSNSt3__19strstreamE;
+    _ZTSNSt3__19time_baseE;
+    _ZTSSt16nested_exception;
+    _ZTTNSt3__110istrstreamE;
+    _ZTTNSt3__110ostrstreamE;
+    _ZTTNSt3__113basic_istreamIcNS_11char_traitsIcEEEE;
+    _ZTTNSt3__113basic_istreamIwNS_11char_traitsIwEEEE;
+    _ZTTNSt3__113basic_ostreamIcNS_11char_traitsIcEEEE;
+    _ZTTNSt3__113basic_ostreamIwNS_11char_traitsIwEEEE;
+    _ZTTNSt3__114basic_iostreamIcNS_11char_traitsIcEEEE;
+    _ZTTNSt3__19strstreamE;
+    _ZTv0_n12_NSt3__110istrstreamD0Ev;
+    _ZTv0_n12_NSt3__110istrstreamD1Ev;
+    _ZTv0_n12_NSt3__110ostrstreamD0Ev;
+    _ZTv0_n12_NSt3__110ostrstreamD1Ev;
+    _ZTv0_n12_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev;
+    _ZTv0_n12_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev;
+    _ZTv0_n12_NSt3__113basic_istreamIwNS_11char_traitsIwEEED0Ev;
+    _ZTv0_n12_NSt3__113basic_istreamIwNS_11char_traitsIwEEED1Ev;
+    _ZTv0_n12_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev;
+    _ZTv0_n12_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev;
+    _ZTv0_n12_NSt3__113basic_ostreamIwNS_11char_traitsIwEEED0Ev;
+    _ZTv0_n12_NSt3__113basic_ostreamIwNS_11char_traitsIwEEED1Ev;
+    _ZTv0_n12_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev;
+    _ZTv0_n12_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev;
+    _ZTv0_n12_NSt3__19strstreamD0Ev;
+    _ZTv0_n12_NSt3__19strstreamD1Ev;
+    _ZTVNSt12experimental19bad_optional_accessE;
+    _ZTVNSt3__110istrstreamE;
+    _ZTVNSt3__110moneypunctIcLb0EEE;
+    _ZTVNSt3__110moneypunctIcLb1EEE;
+    _ZTVNSt3__110moneypunctIwLb0EEE;
+    _ZTVNSt3__110moneypunctIwLb1EEE;
+    _ZTVNSt3__110ostrstreamE;
+    _ZTVNSt3__111regex_errorE;
+    _ZTVNSt3__112bad_weak_ptrE;
+    _ZTVNSt3__112ctype_bynameIcEE;
+    _ZTVNSt3__112ctype_bynameIwEE;
+    _ZTVNSt3__112future_errorE;
+    _ZTVNSt3__112strstreambufE;
+    _ZTVNSt3__112system_errorE;
+    _ZTVNSt3__113basic_istreamIcNS_11char_traitsIcEEEE;
+    _ZTVNSt3__113basic_istreamIwNS_11char_traitsIwEEEE;
+    _ZTVNSt3__113basic_ostreamIcNS_11char_traitsIcEEEE;
+    _ZTVNSt3__113basic_ostreamIwNS_11char_traitsIwEEEE;
+    _ZTVNSt3__114basic_iostreamIcNS_11char_traitsIcEEEE;
+    _ZTVNSt3__114codecvt_bynameIcc9mbstate_tEE;
+    _ZTVNSt3__114codecvt_bynameIDic9mbstate_tEE;
+    _ZTVNSt3__114codecvt_bynameIDsc9mbstate_tEE;
+    _ZTVNSt3__114codecvt_bynameIwc9mbstate_tEE;
+    _ZTVNSt3__114__codecvt_utf8IDiEE;
+    _ZTVNSt3__114__codecvt_utf8IDsEE;
+    _ZTVNSt3__114__codecvt_utf8IwEE;
+    _ZTVNSt3__114collate_bynameIcEE;
+    _ZTVNSt3__114collate_bynameIwEE;
+    _ZTVNSt3__114error_categoryE;
+    _ZTVNSt3__114__shared_countE;
+    _ZTVNSt3__115basic_streambufIcNS_11char_traitsIcEEEE;
+    _ZTVNSt3__115basic_streambufIwNS_11char_traitsIwEEEE;
+    _ZTVNSt3__115__codecvt_utf16IDiLb0EEE;
+    _ZTVNSt3__115__codecvt_utf16IDiLb1EEE;
+    _ZTVNSt3__115__codecvt_utf16IDsLb0EEE;
+    _ZTVNSt3__115__codecvt_utf16IDsLb1EEE;
+    _ZTVNSt3__115__codecvt_utf16IwLb0EEE;
+    _ZTVNSt3__115__codecvt_utf16IwLb1EEE;
+    _ZTVNSt3__115messages_bynameIcEE;
+    _ZTVNSt3__115messages_bynameIwEE;
+    _ZTVNSt3__115numpunct_bynameIcEE;
+    _ZTVNSt3__115numpunct_bynameIwEE;
+    _ZTVNSt3__115time_get_bynameIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTVNSt3__115time_get_bynameIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTVNSt3__115time_put_bynameIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTVNSt3__115time_put_bynameIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTVNSt3__116__narrow_to_utf8ILj16EEE;
+    _ZTVNSt3__116__narrow_to_utf8ILj32EEE;
+    _ZTVNSt3__117__assoc_sub_stateE;
+    _ZTVNSt3__117moneypunct_bynameIcLb0EEE;
+    _ZTVNSt3__117moneypunct_bynameIcLb1EEE;
+    _ZTVNSt3__117moneypunct_bynameIwLb0EEE;
+    _ZTVNSt3__117moneypunct_bynameIwLb1EEE;
+    _ZTVNSt3__117__widen_from_utf8ILj16EEE;
+    _ZTVNSt3__117__widen_from_utf8ILj32EEE;
+    _ZTVNSt3__119__shared_weak_countE;
+    _ZTVNSt3__120__codecvt_utf8_utf16IDiEE;
+    _ZTVNSt3__120__codecvt_utf8_utf16IDsEE;
+    _ZTVNSt3__120__codecvt_utf8_utf16IwEE;
+    _ZTVNSt3__120__time_get_c_storageIcEE;
+    _ZTVNSt3__120__time_get_c_storageIwEE;
+    _ZTVNSt3__15ctypeIcEE;
+    _ZTVNSt3__15ctypeIwEE;
+    _ZTVNSt3__16locale5facetE;
+    _ZTVNSt3__17codecvtIcc9mbstate_tEE;
+    _ZTVNSt3__17codecvtIDic9mbstate_tEE;
+    _ZTVNSt3__17codecvtIDsc9mbstate_tEE;
+    _ZTVNSt3__17codecvtIwc9mbstate_tEE;
+    _ZTVNSt3__17collateIcEE;
+    _ZTVNSt3__17collateIwEE;
+    _ZTVNSt3__17num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTVNSt3__17num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTVNSt3__17num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTVNSt3__17num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTVNSt3__18__c_nodeE;
+    _ZTVNSt3__18ios_base7failureE;
+    _ZTVNSt3__18ios_baseE;
+    _ZTVNSt3__18messagesIcEE;
+    _ZTVNSt3__18messagesIwEE;
+    _ZTVNSt3__18numpunctIcEE;
+    _ZTVNSt3__18numpunctIwEE;
+    _ZTVNSt3__18time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTVNSt3__18time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTVNSt3__18time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTVNSt3__18time_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTVNSt3__19basic_iosIcNS_11char_traitsIcEEEE;
+    _ZTVNSt3__19basic_iosIwNS_11char_traitsIwEEEE;
+    _ZTVNSt3__19money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTVNSt3__19money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTVNSt3__19money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEE;
+    _ZTVNSt3__19money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEE;
+    _ZTVNSt3__19strstreamE;
+    _ZTVSt16nested_exception;
+    _ZZNKSt3__120__time_get_c_storageIcE3__cEvE1s;
+    _ZZNKSt3__120__time_get_c_storageIcE3__rEvE1s;
+    _ZZNKSt3__120__time_get_c_storageIcE3__xEvE1s;
+    _ZZNKSt3__120__time_get_c_storageIcE3__XEvE1s;
+    _ZZNKSt3__120__time_get_c_storageIcE7__am_pmEvE5am_pm;
+    _ZZNKSt3__120__time_get_c_storageIcE7__weeksEvE5weeks;
+    _ZZNKSt3__120__time_get_c_storageIcE8__monthsEvE6months;
+    _ZZNKSt3__120__time_get_c_storageIwE3__cEvE1s;
+    _ZZNKSt3__120__time_get_c_storageIwE3__rEvE1s;
+    _ZZNKSt3__120__time_get_c_storageIwE3__xEvE1s;
+    _ZZNKSt3__120__time_get_c_storageIwE3__XEvE1s;
+    _ZZNKSt3__120__time_get_c_storageIwE7__am_pmEvE5am_pm;
+    _ZZNKSt3__120__time_get_c_storageIwE7__weeksEvE5weeks;
+    _ZZNKSt3__120__time_get_c_storageIwE8__monthsEvE6months;
+    atan2l;
+    atan2l;
+    coshl;
+    cosl;
+    expl;
+    hypotl;
+    log2;
+    logbl;
+    logl;
+    nan;
+    nexttoward;
+    sinhl;
+    sinl;
+    sqrtl;
+    strtold_l;
+    strtoll_l;
+    strtoull_l;
+    uselocale;
+  local: *;
+};
diff --git a/sources/cxx-stl/llvm-libc++/libcxx/include/__config b/sources/cxx-stl/llvm-libc++/libcxx/include/__config
index d2ab7ac..0ea1fcb 100644
--- a/sources/cxx-stl/llvm-libc++/libcxx/include/__config
+++ b/sources/cxx-stl/llvm-libc++/libcxx/include/__config
@@ -349,7 +349,11 @@
 #endif
 
 #if __has_feature(underlying_type)
-#  define _LIBCXX_UNDERLYING_TYPE(T) __underlying_type(T)
+#  define _LIBCPP_UNDERLYING_TYPE(T) __underlying_type(T)
+#endif
+
+#if __has_feature(is_literal)
+#  define _LIBCPP_IS_LITERAL(T) __is_literal(T)
 #endif
 
 // Inline namespaces are available in Clang regardless of C++ dialect.
@@ -381,6 +385,11 @@
 
 #define _LIBCPP_NORETURN __attribute__((noreturn))
 
+#if _GNUC_VER >= 407
+#define _LIBCPP_UNDERLYING_TYPE(T) __underlying_type(T)
+#define _LIBCPP_IS_LITERAL(T) __is_literal_type(T)
+#endif
+
 #if !__EXCEPTIONS
 #define _LIBCPP_NO_EXCEPTIONS
 #endif
@@ -460,13 +469,14 @@
 #endif
 
 // Emulation of clang's __has_feature() for GCC on known cases
-#ifndef __has_feature
+#undef __has_feature
+#define __has_feature(__x) __gxx__ ## __x
 
 #define __gxx__cxx_access_control_sfinae          !defined(_LIBCPP_HAS_NO_TRAILING_RETURN) || !defined(_LIBCPP_HAS_NO_ADVANCED_SFINAE) // Also see usage in 7 tests
 #define __gxx__cxx_alias_templates                !defined(_LIBCPP_HAS_NO_TEMPLATE_ALIASES)
 #define __gxx__cxx_address_sanitizer              !defined(_LIBCPP_HAS_NO_ASAN)
 #define __gxx__cxx_alignas                        0  // Not sure, doesn't matter.
-#define __gxx__cxx_atomic                         0  // (_GNUC_VER >= 409) seems to support _Atomic in -std=c11 not -std=c++11 !
+#define __gxx__cxx_atomic                         (_GNUC_VER >= 407)
 #define __gxx__cxx_attributes                     0  // Not sure. Also see usage in libcxx/test/utilities/meta/meta.unary/meta.unary.prop/is_polymorphic.pass.cpp
 #define __gxx__cxx_auto_type                      !defined(_LIBCPP_HAS_NO_AUTO_TYPE)
 #define __gxx__cxx_constexpr                      !defined(_LIBCPP_HAS_NO_CONSTEXPR)
@@ -503,7 +513,7 @@
 #define __gxx__is_empty                           1  // Not sure.  Also see usage in libcxx/include/type_traits
 #define __gxx__is_enum                            (_GNUC_VER >= 403)  // See usage in libcxx/include/type_traits
 #define __gxx__is_final                           (_GNUC_VER >= 408)  // Not if 4.7 work. 4.6 certainly not.  Also see usage in libcxx/include/unordered_map,tuple,ext/hash_map,map,memory
-#define __gxx__is_literal                         0  // Not supported in GCC 4.8.  Also see usage in libcxx/include/type_traits
+#define __gxx__is_literal                         defined(_LIBCPP_IS_LITERAL)
 #define __gxx__is_pod                             (_GNUC_VER >= 403)  // See usage in libcxx/include/type_traits
 #define __gxx__is_polymorphic                     1  // Not sure.  Also see usage in libcxx/include/type_traits
 #define __gxx__is_standard_layout                 1  // Not sure.  Also see usage in libcxx/include/type_traits
@@ -513,11 +523,8 @@
 #define __gxx__is_union                           (_GNUC_VER >= 403)  // See usage in libcxx/include/type_traits
 #define __gxx__objc_arc                           defined(_LIBCPP_HAS_OBJC_ARC)
 #define __gxx__objc_arc_weak                      defined(_LIBCPP_HAS_OBJC_ARC_WEAK)
-#define __gxx__underlying_type                    1  // Not sure.  Also see usage in libcxx/include/type_traits
+#define __gxx__underlying_type                    defined(_LIBCPP_UNDERLYING_TYPE)
 
-#define __has_feature(__x) __gxx__ ## __x
-
-#endif // __has_feature
 
 #elif defined(_LIBCPP_MSVC)
 
diff --git a/sources/cxx-stl/llvm-libc++/libcxx/include/atomic b/sources/cxx-stl/llvm-libc++/libcxx/include/atomic
index f6ab1cb..120d3a1 100644
--- a/sources/cxx-stl/llvm-libc++/libcxx/include/atomic
+++ b/sources/cxx-stl/llvm-libc++/libcxx/include/atomic
@@ -545,6 +545,266 @@
     memory_order_release, memory_order_acq_rel, memory_order_seq_cst
 } memory_order;
 
+#if !defined(__clang__)
+
+namespace __gcc_atomic {
+template <typename T>
+struct __gcc_atomic_t {
+  __gcc_atomic_t() _NOEXCEPT {}
+  explicit __gcc_atomic_t(T value) _NOEXCEPT : __a_value(value) {}
+  T __a_value;
+};
+#define _Atomic(x) __gcc_atomic::__gcc_atomic_t<x>
+
+template <typename T> T __create();
+
+template <typename __Tp, typename __Td,
+          typename = decltype(__Tp()->__a_value = __create<__Td>())>
+char __test_atomic_assignable(int);
+template <typename T, typename U>
+__two __test_atomic_assignable(...);
+
+template <typename __Tp, typename __Td>
+struct __can_assign {
+  static const bool value =
+      sizeof(__test_atomic_assignable<__Tp, __Td>(1)) == sizeof(char);
+};
+
+static inline int __to_gcc_order(memory_order __order) {
+  switch (__order) {
+    case memory_order_relaxed:
+      return __ATOMIC_RELAXED;
+    case memory_order_consume:
+      return __ATOMIC_CONSUME;
+    case memory_order_acquire:
+      return __ATOMIC_ACQUIRE;
+    case memory_order_release:
+      return __ATOMIC_RELEASE;
+    case memory_order_acq_rel:
+      return __ATOMIC_ACQ_REL;
+    case memory_order_seq_cst:
+      return __ATOMIC_SEQ_CST;
+  }
+}
+
+} // namespace __gcc_atomic
+
+template <typename _Tp>
+static inline
+typename enable_if<
+    __gcc_atomic::__can_assign<volatile _Atomic(_Tp)*, _Tp>::value>::type
+__c11_atomic_init(volatile _Atomic(_Tp)* __a,  _Tp __val) {
+  __a->__a_value = __val;
+}
+
+template <typename _Tp>
+static inline
+typename enable_if<
+    !__gcc_atomic::__can_assign<volatile _Atomic(_Tp)*, _Tp>::value &&
+     __gcc_atomic::__can_assign<         _Atomic(_Tp)*, _Tp>::value>::type
+__c11_atomic_init(volatile _Atomic(_Tp)* __a,  _Tp __val) {
+  // [atomics.types.generic]p1 guarantees _Tp is trivially copyable. Because
+  // the default operator= in an object is not volatile, a byte-by-byte copy
+  // is required.
+  volatile char* to = reinterpret_cast<volatile char*>(&__a->__a_value);
+  volatile char* end = to + sizeof(_Tp);
+  char* from = reinterpret_cast<char*>(&__val);
+  while (to != end) {
+    *to++ = *from++;
+  }
+}
+
+template <typename _Tp>
+static inline void __c11_atomic_init(_Atomic(_Tp)* __a,  _Tp __val) {
+  __a->__a_value = __val;
+}
+
+static inline void __c11_atomic_thread_fence(memory_order __order) {
+  __atomic_thread_fence(__gcc_atomic::__to_gcc_order(__order));
+}
+
+static inline void __c11_atomic_signal_fence(memory_order __order) {
+  __atomic_signal_fence(__gcc_atomic::__to_gcc_order(__order));
+}
+
+static inline bool __c11_atomic_is_lock_free(size_t __size) {
+  return __atomic_is_lock_free(__size, 0);
+}
+
+template <typename _Tp>
+static inline void __c11_atomic_store(volatile _Atomic(_Tp)* __a,  _Tp __val,
+                                      memory_order __order) {
+  return __atomic_store(&__a->__a_value, &__val,
+                        __gcc_atomic::__to_gcc_order(__order));
+}
+
+template <typename _Tp>
+static inline void __c11_atomic_store(_Atomic(_Tp)* __a,  _Tp __val,
+                                      memory_order __order) {
+  return __atomic_store(&__a->__a_value, &__val,
+                        __gcc_atomic::__to_gcc_order(__order));
+}
+
+template <typename _Tp>
+static inline _Tp __c11_atomic_load(volatile _Atomic(_Tp)* __a,
+                                    memory_order __order) {
+  _Tp __ret;
+  __atomic_load(&__a->__a_value, &__ret,
+                __gcc_atomic::__to_gcc_order(__order));
+  return __ret;
+}
+
+template <typename _Tp>
+static inline _Tp __c11_atomic_load(_Atomic(_Tp)* __a, memory_order __order) {
+  _Tp __ret;
+  __atomic_load(&__a->__a_value, &__ret,
+                __gcc_atomic::__to_gcc_order(__order));
+  return __ret;
+}
+
+template <typename _Tp>
+static inline _Tp __c11_atomic_exchange(volatile _Atomic(_Tp)* __a,
+                                        _Tp __value, memory_order __order) {
+  _Tp __ret;
+  __atomic_exchange(&__a->__a_value, &__value, &__ret,
+                    __gcc_atomic::__to_gcc_order(__order));
+  return __ret;
+}
+
+template <typename _Tp>
+static inline _Tp __c11_atomic_exchange(_Atomic(_Tp)* __a, _Tp __value,
+                                        memory_order __order) {
+  _Tp __ret;
+  __atomic_exchange(&__a->__a_value, &__value, &__ret,
+                    __gcc_atomic::__to_gcc_order(__order));
+  return __ret;
+}
+
+template <typename _Tp>
+static inline bool __c11_atomic_compare_exchange_strong(
+    volatile _Atomic(_Tp)* __a, _Tp* __expected, _Tp __value,
+    memory_order __success, memory_order __failure) {
+  return __atomic_compare_exchange(&__a->__a_value, __expected, &__value,
+                                   false,
+                                   __gcc_atomic::__to_gcc_order(__success),
+                                   __gcc_atomic::__to_gcc_order(__failure));
+}
+
+template <typename _Tp>
+static inline bool __c11_atomic_compare_exchange_strong(
+    _Atomic(_Tp)* __a, _Tp* __expected, _Tp __value, memory_order __success,
+    memory_order __failure) {
+  return __atomic_compare_exchange(&__a->__a_value, __expected, &__value,
+                                   false,
+                                   __gcc_atomic::__to_gcc_order(__success),
+                                   __gcc_atomic::__to_gcc_order(__failure));
+}
+
+template <typename _Tp>
+static inline bool __c11_atomic_compare_exchange_weak(
+    volatile _Atomic(_Tp)* __a, _Tp* __expected, _Tp __value,
+    memory_order __success, memory_order __failure) {
+  return __atomic_compare_exchange(&__a->__a_value, __expected, &__value,
+                                   true,
+                                   __gcc_atomic::__to_gcc_order(__success),
+                                   __gcc_atomic::__to_gcc_order(__failure));
+}
+
+template <typename _Tp>
+static inline bool __c11_atomic_compare_exchange_weak(
+    _Atomic(_Tp)* __a, _Tp* __expected, _Tp __value, memory_order __success,
+    memory_order __failure) {
+  return __atomic_compare_exchange(&__a->__a_value, __expected, &__value,
+                                   true,
+                                   __gcc_atomic::__to_gcc_order(__success),
+                                   __gcc_atomic::__to_gcc_order(__failure));
+}
+
+template <typename _Tp>
+struct __skip_amt { enum {value = 1}; };
+
+template <typename _Tp>
+struct __skip_amt<_Tp*> { enum {value = sizeof(_Tp)}; };
+
+// FIXME: Haven't figured out what the spec says about using arrays with
+// atomic_fetch_add. Force a failure rather than creating bad behavior.
+template <typename _Tp>
+struct __skip_amt<_Tp[]> { };
+template <typename _Tp, int n>
+struct __skip_amt<_Tp[n]> { };
+
+template <typename _Tp, typename _Td>
+static inline _Tp __c11_atomic_fetch_add(volatile _Atomic(_Tp)* __a,
+                                         _Td __delta, memory_order __order) {
+  return __atomic_fetch_add(&__a->__a_value, __delta * __skip_amt<_Tp>::value,
+                            __gcc_atomic::__to_gcc_order(__order));
+}
+
+template <typename _Tp, typename _Td>
+static inline _Tp __c11_atomic_fetch_add(_Atomic(_Tp)* __a, _Td __delta,
+                                         memory_order __order) {
+  return __atomic_fetch_add(&__a->__a_value, __delta * __skip_amt<_Tp>::value,
+                            __gcc_atomic::__to_gcc_order(__order));
+}
+
+template <typename _Tp, typename _Td>
+static inline _Tp __c11_atomic_fetch_sub(volatile _Atomic(_Tp)* __a,
+                                         _Td __delta, memory_order __order) {
+  return __atomic_fetch_sub(&__a->__a_value, __delta * __skip_amt<_Tp>::value,
+                            __gcc_atomic::__to_gcc_order(__order));
+}
+
+template <typename _Tp, typename _Td>
+static inline _Tp __c11_atomic_fetch_sub(_Atomic(_Tp)* __a, _Td __delta,
+                                         memory_order __order) {
+  return __atomic_fetch_sub(&__a->__a_value, __delta * __skip_amt<_Tp>::value,
+                            __gcc_atomic::__to_gcc_order(__order));
+}
+
+template <typename _Tp>
+static inline _Tp __c11_atomic_fetch_and(volatile _Atomic(_Tp)* __a,
+                                         _Tp __pattern, memory_order __order) {
+  return __atomic_fetch_and(&__a->__a_value, __pattern,
+                            __gcc_atomic::__to_gcc_order(__order));
+}
+
+template <typename _Tp>
+static inline _Tp __c11_atomic_fetch_and(_Atomic(_Tp)* __a,
+                                         _Tp __pattern, memory_order __order) {
+  return __atomic_fetch_and(&__a->__a_value, __pattern,
+                            __gcc_atomic::__to_gcc_order(__order));
+}
+
+template <typename _Tp>
+static inline _Tp __c11_atomic_fetch_or(volatile _Atomic(_Tp)* __a,
+                                        _Tp __pattern, memory_order __order) {
+  return __atomic_fetch_or(&__a->__a_value, __pattern,
+                           __gcc_atomic::__to_gcc_order(__order));
+}
+
+template <typename _Tp>
+static inline _Tp __c11_atomic_fetch_or(_Atomic(_Tp)* __a, _Tp __pattern,
+                                        memory_order __order) {
+  return __atomic_fetch_or(&__a->__a_value, __pattern,
+                           __gcc_atomic::__to_gcc_order(__order));
+}
+
+template <typename _Tp>
+static inline _Tp __c11_atomic_fetch_xor(volatile _Atomic(_Tp)* __a,
+                                         _Tp __pattern, memory_order __order) {
+  return __atomic_fetch_xor(&__a->__a_value, __pattern,
+                            __gcc_atomic::__to_gcc_order(__order));
+}
+
+template <typename _Tp>
+static inline _Tp __c11_atomic_fetch_xor(_Atomic(_Tp)* __a, _Tp __pattern,
+                                         memory_order __order) {
+  return __atomic_fetch_xor(&__a->__a_value, __pattern,
+                            __gcc_atomic::__to_gcc_order(__order));
+}
+
+#endif // !__clang__
+
 template <class _Tp>
 inline _LIBCPP_INLINE_VISIBILITY
 _Tp
diff --git a/sources/cxx-stl/llvm-libc++/libcxx/include/cstddef b/sources/cxx-stl/llvm-libc++/libcxx/include/cstddef
index c3ca64a..b4a2283 100644
--- a/sources/cxx-stl/llvm-libc++/libcxx/include/cstddef
+++ b/sources/cxx-stl/llvm-libc++/libcxx/include/cstddef
@@ -49,6 +49,11 @@
 #if defined(__CLANG_MAX_ALIGN_T_DEFINED) || defined(_GCC_MAX_ALIGN_T)
 // Re-use the compiler's <stddef.h> max_align_t where possible.
 using ::max_align_t;
+#elif defined(__ANDROID__) && !__LP64__
+// If compiler doesn't have max_align_t (ie. clang), and it's on 32-bit Android, typedef max_align_t to
+// "long long" instead of "long double" because 32-bit Android treats "long double" the same as "double"
+// which is smaller than "long long"
+typedef long long max_align_t;
 #else
 typedef long double max_align_t;
 #endif
diff --git a/sources/cxx-stl/llvm-libc++/libcxx/include/future b/sources/cxx-stl/llvm-libc++/libcxx/include/future
index c776c59..9a3af54 100644
--- a/sources/cxx-stl/llvm-libc++/libcxx/include/future
+++ b/sources/cxx-stl/llvm-libc++/libcxx/include/future
@@ -407,7 +407,7 @@
 
 #ifndef _LIBCPP_HAS_NO_STRONG_ENUMS
 
-#ifdef _LIBCXX_UNDERLYING_TYPE
+#ifdef _LIBCPP_UNDERLYING_TYPE
 typedef underlying_type<launch>::type __launch_underlying_type;
 #else
 typedef int __launch_underlying_type;
diff --git a/sources/cxx-stl/llvm-libc++/libcxx/include/type_traits b/sources/cxx-stl/llvm-libc++/libcxx/include/type_traits
index 6846af5..239c183 100644
--- a/sources/cxx-stl/llvm-libc++/libcxx/include/type_traits
+++ b/sources/cxx-stl/llvm-libc++/libcxx/include/type_traits
@@ -382,7 +382,7 @@
 
 // is_union
 
-#if __has_feature(is_union) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(is_union) || defined(_LIBCPP_HAS_TYPE_TRAITS)
 
 template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_union
     : public integral_constant<bool, __is_union(_Tp)> {};
@@ -397,7 +397,7 @@
 
 // is_class
 
-#if __has_feature(is_class) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(is_class) || defined(_LIBCPP_HAS_TYPE_TRAITS)
 
 template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_class
     : public integral_constant<bool, __is_class(_Tp)> {};
@@ -484,7 +484,7 @@
 
 // is_enum
 
-#if __has_feature(is_enum) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(is_enum) || defined(_LIBCPP_HAS_TYPE_TRAITS)
 
 template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_enum
     : public integral_constant<bool, __is_enum(_Tp)> {};
@@ -797,7 +797,7 @@
 struct _LIBCPP_TYPE_VIS_ONLY is_base_of
     : public integral_constant<bool, __is_base_of(_Bp, _Dp)> {};
 
-#else  // __has_feature(is_base_of)
+#else  // _LIBCPP_HAS_IS_BASE_OF
 
 namespace __is_base_of_imp
 {
@@ -822,7 +822,7 @@
     : public integral_constant<bool, is_class<_Bp>::value &&
                                      sizeof(__is_base_of_imp::__test<_Bp, _Dp>(0)) == 2> {};
 
-#endif  // __has_feature(is_base_of)
+#endif  // _LIBCPP_HAS_IS_BASE_OF
 
 // is_convertible
 
@@ -836,14 +836,18 @@
 
 namespace __is_convertible_imp
 {
-template <class _Tp> char  __test(_Tp);
-template <class _Tp> __two __test(...);
+// Test taken directly from definition of is_convertible predicate in [meta.rel]p4.
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-template <class _Tp> _Tp&& __source();
+template <class _Tp> typename add_rvalue_reference<_Tp>::type __create();
 #else
-template <class _Tp> typename remove_reference<_Tp>::type& __source();
+template <class _Tp> typename remove_reference<_Tp>::type& __create();
 #endif
 
+template <class _Tp> void helper(_Tp);
+
+template <class _Tp, class _Tf, class = decltype(helper<_Tp>(__create<_Tf>()))> char  __test(int);
+template <class _Tp, class _Tf> __two __test(...);
+
 template <class _Tp, bool _IsArray =    is_array<_Tp>::value,
                      bool _IsFunction = is_function<_Tp>::value,
                      bool _IsVoid =     is_void<_Tp>::value>
@@ -872,9 +876,9 @@
 struct __is_convertible
     : public integral_constant<bool,
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-        sizeof(__is_convertible_imp::__test<_T2>(__is_convertible_imp::__source<_T1>())) == 1
+        sizeof(__is_convertible_imp::__test<_T2, _T1>(1)) == 1
 #else
-        sizeof(__is_convertible_imp::__test<_T2>(__is_convertible_imp::__source<_T1>())) == 1
+        sizeof(__is_convertible_imp::__test<_T2, _T1>(1)) == 1
          && !(!is_function<_T1>::value && !is_reference<_T1>::value && is_reference<_T2>::value
               && (!is_const<typename remove_reference<_T2>::type>::value
                   || is_volatile<typename remove_reference<_T2>::type>::value)
@@ -887,12 +891,12 @@
 
 template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 0> : false_type {};
 
-template <class _T1> struct __is_convertible<_T1, const _T1&, 1, 0> : true_type {};
+template <class _T1> struct __is_convertible<_T1, const typename remove_const<_T1>::type&, 1, 0> : true_type {};
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
 template <class _T1> struct __is_convertible<_T1, _T1&&, 1, 0> : true_type {};
-template <class _T1> struct __is_convertible<_T1, const _T1&&, 1, 0> : true_type {};
-template <class _T1> struct __is_convertible<_T1, volatile _T1&&, 1, 0> : true_type {};
-template <class _T1> struct __is_convertible<_T1, const volatile _T1&&, 1, 0> : true_type {};
+template <class _T1> struct __is_convertible<_T1, const typename remove_const<_T1>::type&&, 1, 0> : true_type {};
+template <class _T1> struct __is_convertible<_T1, volatile typename remove_volatile<_T1>::type&&, 1, 0> : true_type {};
+template <class _T1> struct __is_convertible<_T1, const volatile typename remove_cv<_T1>::type&&, 1, 0> : true_type {};
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 
 template <class _T1, class _T2> struct __is_convertible<_T1, _T2*, 1, 0>
@@ -917,18 +921,22 @@
 template <class _T1>            struct __is_convertible<_T1, _T1*volatile, 2, 0>       : public true_type {};
 template <class _T1>            struct __is_convertible<_T1, _T1*const volatile, 2, 0> : public true_type {};
 
+// Per N2255 on is_convertible, void -> !void is not convertible.
 template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 3, 0> : public false_type {};
 
+// Per N2255 on is_convertible, * -> array is not converitble.
 template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 0, 1> : public false_type {};
 template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 1> : public false_type {};
 template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 2, 1> : public false_type {};
 template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 3, 1> : public false_type {};
 
+// Per N2255 on is_convertible, * -> function is not converitble.
 template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 0, 2> : public false_type {};
 template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 2> : public false_type {};
 template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 2, 2> : public false_type {};
 template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 3, 2> : public false_type {};
 
+// Per N2255 on is_convertible, only void -> void is convertible.
 template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 0, 3> : public false_type {};
 template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 3> : public false_type {};
 template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 2, 3> : public false_type {};
@@ -945,7 +953,7 @@
 
 // is_empty
 
-#if __has_feature(is_empty)
+#if __has_feature(is_empty) || (_GNUC_VER >= 407)
 
 template <class _Tp>
 struct _LIBCPP_TYPE_VIS_ONLY is_empty
@@ -996,7 +1004,7 @@
 
 // has_virtual_destructor
 
-#if __has_feature(has_virtual_destructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(has_virtual_destructor) || defined(_LIBCPP_HAS_TYPE_TRAITS)
 
 template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY has_virtual_destructor
     : public integral_constant<bool, __has_virtual_destructor(_Tp)> {};
@@ -2434,7 +2442,7 @@
 
 template <class _Tp>
 struct _LIBCPP_TYPE_VIS_ONLY is_trivially_constructible<_Tp>
-#if __has_feature(has_trivial_constructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(has_trivial_constructor) || defined(_LIBCPP_HAS_TYPE_TRAITS)
     : integral_constant<bool, __has_trivial_constructor(_Tp)>
 #else
     : integral_constant<bool, is_scalar<_Tp>::value>
@@ -2563,7 +2571,7 @@
 
 // is_trivially_assignable
 
-#if __has_feature(is_trivially_constructible)
+#if __has_feature(is_trivially_assignable)
 
 template <class _Tp, class _Arg>
 struct is_trivially_assignable
@@ -2571,7 +2579,7 @@
 {
 };
 
-#else  // !__has_feature(is_trivially_constructible)
+#else  // !__has_feature(is_trivially_assignable)
 
 template <class _Tp, class _Arg>
 struct is_trivially_assignable
@@ -2597,7 +2605,7 @@
 
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 
-#endif  // !__has_feature(is_trivially_constructible)
+#endif  // !__has_feature(is_trivially_assignable)
 
 // is_trivially_copy_assignable
 
@@ -2619,7 +2627,7 @@
 
 // is_trivially_destructible
 
-#if __has_feature(has_trivial_destructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(has_trivial_destructor) || defined(_LIBCPP_HAS_TYPE_TRAITS)
 
 template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_trivially_destructible
     : public integral_constant<bool, __has_trivial_destructor(_Tp)> {};
@@ -2648,7 +2656,7 @@
 
 #ifndef _LIBCPP_HAS_NO_VARIADICS
 
-#if __has_feature(cxx_noexcept)
+#if __has_feature(cxx_noexcept) || (_GNUC_VER >= 407)
 
 template <bool, class _Tp, class... _Args> struct __libcpp_is_nothrow_constructible;
 
@@ -2686,7 +2694,7 @@
 
 template <class _Tp>
 struct _LIBCPP_TYPE_VIS_ONLY is_nothrow_constructible<_Tp>
-#if __has_feature(has_nothrow_constructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(has_nothrow_constructor) || defined(_LIBCPP_HAS_TYPE_TRAITS)
     : integral_constant<bool, __has_nothrow_constructor(_Tp)>
 #else
     : integral_constant<bool, is_scalar<_Tp>::value>
@@ -2700,7 +2708,7 @@
 #else
 struct _LIBCPP_TYPE_VIS_ONLY is_nothrow_constructible<_Tp, _Tp>
 #endif
-#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(has_nothrow_copy) || defined(_LIBCPP_HAS_TYPE_TRAITS)
     : integral_constant<bool, __has_nothrow_copy(_Tp)>
 #else
     : integral_constant<bool, is_scalar<_Tp>::value>
@@ -2710,7 +2718,7 @@
 
 template <class _Tp>
 struct _LIBCPP_TYPE_VIS_ONLY is_nothrow_constructible<_Tp, const _Tp&>
-#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(has_nothrow_copy) || defined(_LIBCPP_HAS_TYPE_TRAITS)
     : integral_constant<bool, __has_nothrow_copy(_Tp)>
 #else
     : integral_constant<bool, is_scalar<_Tp>::value>
@@ -2720,7 +2728,7 @@
 
 template <class _Tp>
 struct _LIBCPP_TYPE_VIS_ONLY is_nothrow_constructible<_Tp, _Tp&>
-#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(has_nothrow_copy) || defined(_LIBCPP_HAS_TYPE_TRAITS)
     : integral_constant<bool, __has_nothrow_copy(_Tp)>
 #else
     : integral_constant<bool, is_scalar<_Tp>::value>
@@ -2742,7 +2750,7 @@
 template <class _Tp>
 struct _LIBCPP_TYPE_VIS_ONLY is_nothrow_constructible<_Tp, __is_construct::__nat,
                                                        __is_construct::__nat>
-#if __has_feature(has_nothrow_constructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(has_nothrow_constructor) || defined(_LIBCPP_HAS_TYPE_TRAITS)
     : integral_constant<bool, __has_nothrow_constructor(_Tp)>
 #else
     : integral_constant<bool, is_scalar<_Tp>::value>
@@ -2753,7 +2761,7 @@
 template <class _Tp>
 struct _LIBCPP_TYPE_VIS_ONLY is_nothrow_constructible<_Tp, _Tp,
                                                        __is_construct::__nat>
-#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(has_nothrow_copy) || defined(_LIBCPP_HAS_TYPE_TRAITS)
     : integral_constant<bool, __has_nothrow_copy(_Tp)>
 #else
     : integral_constant<bool, is_scalar<_Tp>::value>
@@ -2764,7 +2772,7 @@
 template <class _Tp>
 struct _LIBCPP_TYPE_VIS_ONLY is_nothrow_constructible<_Tp, const _Tp&,
                                                        __is_construct::__nat>
-#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(has_nothrow_copy) || defined(_LIBCPP_HAS_TYPE_TRAITS)
     : integral_constant<bool, __has_nothrow_copy(_Tp)>
 #else
     : integral_constant<bool, is_scalar<_Tp>::value>
@@ -2775,7 +2783,7 @@
 template <class _Tp>
 struct _LIBCPP_TYPE_VIS_ONLY is_nothrow_constructible<_Tp, _Tp&,
                                                        __is_construct::__nat>
-#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(has_nothrow_copy) || defined(_LIBCPP_HAS_TYPE_TRAITS)
     : integral_constant<bool, __has_nothrow_copy(_Tp)>
 #else
     : integral_constant<bool, is_scalar<_Tp>::value>
@@ -2810,7 +2818,7 @@
 
 // is_nothrow_assignable
 
-#if __has_feature(cxx_noexcept)
+#if __has_feature(cxx_noexcept) || (_GNUC_VER >= 407)
 
 template <bool, class _Tp, class _Arg> struct __libcpp_is_nothrow_assignable;
 
@@ -2840,7 +2848,7 @@
 
 template <class _Tp>
 struct _LIBCPP_TYPE_VIS_ONLY is_nothrow_assignable<_Tp&, _Tp>
-#if __has_feature(has_nothrow_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(has_nothrow_assign) || defined(_LIBCPP_HAS_TYPE_TRAITS)
     : integral_constant<bool, __has_nothrow_assign(_Tp)> {};
 #else
     : integral_constant<bool, is_scalar<_Tp>::value> {};
@@ -2848,7 +2856,7 @@
 
 template <class _Tp>
 struct _LIBCPP_TYPE_VIS_ONLY is_nothrow_assignable<_Tp&, _Tp&>
-#if __has_feature(has_nothrow_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(has_nothrow_assign) || defined(_LIBCPP_HAS_TYPE_TRAITS)
     : integral_constant<bool, __has_nothrow_assign(_Tp)> {};
 #else
     : integral_constant<bool, is_scalar<_Tp>::value> {};
@@ -2856,7 +2864,7 @@
 
 template <class _Tp>
 struct _LIBCPP_TYPE_VIS_ONLY is_nothrow_assignable<_Tp&, const _Tp&>
-#if __has_feature(has_nothrow_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(has_nothrow_assign) || defined(_LIBCPP_HAS_TYPE_TRAITS)
     : integral_constant<bool, __has_nothrow_assign(_Tp)> {};
 #else
     : integral_constant<bool, is_scalar<_Tp>::value> {};
@@ -2866,7 +2874,7 @@
 
 template <class _Tp>
 struct is_nothrow_assignable<_Tp&, _Tp&&>
-#if __has_feature(has_nothrow_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(has_nothrow_assign) || defined(_LIBCPP_HAS_TYPE_TRAITS)
     : integral_constant<bool, __has_nothrow_assign(_Tp)> {};
 #else
     : integral_constant<bool, is_scalar<_Tp>::value> {};
@@ -2896,7 +2904,7 @@
 
 // is_nothrow_destructible
 
-#if __has_feature(cxx_noexcept)
+#if __has_feature(cxx_noexcept) || (_GNUC_VER >= 407)
 
 template <bool, class _Tp> struct __libcpp_is_nothrow_destructible;
 
@@ -2953,7 +2961,7 @@
 
 // is_pod
 
-#if __has_feature(is_pod) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#if __has_feature(is_pod) || defined(_LIBCPP_HAS_TYPE_TRAITS)
 
 template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_pod
     : public integral_constant<bool, __is_pod(_Tp)> {};
@@ -2971,8 +2979,8 @@
 // is_literal_type;
 
 template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_literal_type
-#if __has_feature(is_literal)
-    : public integral_constant<bool, __is_literal(_Tp)>
+#ifdef _LIBCPP_IS_LITERAL
+    : public integral_constant<bool, _LIBCPP_IS_LITERAL(_Tp)>
 #else
     : integral_constant<bool, is_scalar<typename remove_all_extents<_Tp>::type>::value ||
                               is_reference<typename remove_all_extents<_Tp>::type>::value>
@@ -2982,7 +2990,7 @@
 // is_standard_layout;
 
 template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_standard_layout
-#if __has_feature(is_standard_layout)
+#if __has_feature(is_standard_layout) || (_GNUC_VER >= 407)
     : public integral_constant<bool, __is_standard_layout(_Tp)>
 #else
     : integral_constant<bool, is_scalar<typename remove_all_extents<_Tp>::type>::value>
@@ -3002,7 +3010,7 @@
 // is_trivial;
 
 template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_trivial
-#if __has_feature(is_trivial)
+#if __has_feature(is_trivial) || (_GNUC_VER >= 407)
     : public integral_constant<bool, __is_trivial(_Tp)>
 #else
     : integral_constant<bool, is_trivially_copyable<_Tp>::value &&
@@ -3332,7 +3340,7 @@
 {
 };
 
-#if __has_feature(cxx_noexcept)
+#if __has_feature(cxx_noexcept) || (_GNUC_VER >= 407)
 
 template <bool, class _Tp>
 struct __is_nothrow_swappable_imp
@@ -3363,19 +3371,19 @@
 
 #endif  // __has_feature(cxx_noexcept)
 
-#ifdef _LIBCXX_UNDERLYING_TYPE
+#ifdef _LIBCPP_UNDERLYING_TYPE
 
 template <class _Tp>
 struct underlying_type
 {
-    typedef _LIBCXX_UNDERLYING_TYPE(_Tp) type;
+    typedef _LIBCPP_UNDERLYING_TYPE(_Tp) type;
 };
 
 #if _LIBCPP_STD_VER > 11
 template <class _Tp> using underlying_type_t = typename underlying_type<_Tp>::type;
 #endif
 
-#else  // _LIBCXX_UNDERLYING_TYPE
+#else  // _LIBCPP_UNDERLYING_TYPE
 
 template <class _Tp, bool _Support = false>
 struct underlying_type
@@ -3385,7 +3393,7 @@
                             "libc++ does not know how to use it.");
 };
 
-#endif // _LIBCXX_UNDERLYING_TYPE
+#endif // _LIBCPP_UNDERLYING_TYPE
 
 #ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE
 
diff --git a/sources/cxx-stl/llvm-libc++/libcxx/src/chrono.cpp b/sources/cxx-stl/llvm-libc++/libcxx/src/chrono.cpp
index 331de3d..f3e594d 100644
--- a/sources/cxx-stl/llvm-libc++/libcxx/src/chrono.cpp
+++ b/sources/cxx-stl/llvm-libc++/libcxx/src/chrono.cpp
@@ -108,11 +108,6 @@
 }
 
 #else  // __APPLE__
-// FIXME: We assume that clock_gettime(CLOCK_MONOTONIC) works on
-// non-apple systems.  Instead, we should check _POSIX_TIMERS and
-// _POSIX_MONOTONIC_CLOCK and fall back to something else if those
-// don't exist.
-
 // Warning:  If this is not truly steady, then it is non-conforming.  It is
 //  better for it to not exist and have the rest of libc++ use system_clock
 //  instead.
@@ -120,15 +115,16 @@
 steady_clock::time_point
 steady_clock::now() _NOEXCEPT
 {
-#if defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK > 0
+#if (defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0) && \
+    (defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK > 0)
     struct timespec tp;
     if (0 != clock_gettime(CLOCK_MONOTONIC, &tp))
         __throw_system_error(errno, "clock_gettime(CLOCK_MONOTONIC) failed");
     return time_point(seconds(tp.tv_sec) + nanoseconds(tp.tv_nsec));
 #else
-#warning posix doesn't have a monotonic clock on this system \
-         so we're falling back to std::steady_clock (which may \
-         not be monotonic, and therefore may not be conforming)
+#warning According to unistd.h, there is no monotonic clock on this system so \
+         we are falling back to std::system_clock (which may not be \
+         monotonic, and therefore may not be conforming).
     return time_point(system_clock::now().time_since_epoch());
 #endif
 }
diff --git a/sources/cxx-stl/llvm-libc++/libcxx/src/new.cpp b/sources/cxx-stl/llvm-libc++/libcxx/src/new.cpp
index 9130ab3..24d50f6 100644
--- a/sources/cxx-stl/llvm-libc++/libcxx/src/new.cpp
+++ b/sources/cxx-stl/llvm-libc++/libcxx/src/new.cpp
@@ -35,7 +35,8 @@
     #endif  // _LIBCPPABI_VERSION
 #endif
 
-#ifndef __GLIBCXX__
+// libc++abi provides operator new and delete as part of the abi layer.
+#if !defined(__GLIBCXX__) && !defined(_LIBCPPABI_VERSION)
 
 // Implement all new and delete operators as weak definitions
 // in this shared library, so that they can be overriden by programs
@@ -145,7 +146,7 @@
     ::operator delete[](ptr);
 }
 
-#endif // !__GLIBCXX__
+#endif // !defined(__GLIBCXX__) && !defined(_LIBCPPABI_VERSION)
 
 namespace std
 {
diff --git a/sources/cxx-stl/llvm-libc++/libcxx/src/string.cpp b/sources/cxx-stl/llvm-libc++/libcxx/src/string.cpp
index fde5212..653198c 100644
--- a/sources/cxx-stl/llvm-libc++/libcxx/src/string.cpp
+++ b/sources/cxx-stl/llvm-libc++/libcxx/src/string.cpp
@@ -186,7 +186,7 @@
     const typename S::value_type* const p = str.c_str();
     typename remove_reference<decltype(errno)>::type errno_save = errno;
     errno = 0;
-    V r = f(p, &ptr);
+    V r = static_cast<V>(f(p, &ptr));
     swap(errno, errno_save);
     if (errno_save == ERANGE)
         throw_from_string_out_of_range(func);
@@ -206,7 +206,7 @@
 float
 as_float( const string& func, const string& s, size_t* idx )
 {
-    return as_float_helper<float>( func, s, idx, strtof );
+    return as_float_helper<float>( func, s, idx, strtod );
 }
 
 template<>
@@ -230,7 +230,7 @@
 float
 as_float( const string& func, const wstring& s, size_t* idx )
 {
-    return as_float_helper<float>( func, s, idx, wcstof );
+    return as_float_helper<float>( func, s, idx, wcstod );
 }
 
 template<>
diff --git a/sources/cxx-stl/llvm-libc++/libcxx/src/thread.cpp b/sources/cxx-stl/llvm-libc++/libcxx/src/thread.cpp
index 1ffef7a..c03a42f 100644
--- a/sources/cxx-stl/llvm-libc++/libcxx/src/thread.cpp
+++ b/sources/cxx-stl/llvm-libc++/libcxx/src/thread.cpp
@@ -123,8 +123,9 @@
             ts.tv_sec = ts_sec_max;
             ts.tv_nsec = giga::num - 1;
         }
-#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309L
-        nanosleep(&ts, 0);
+#if (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309L) || defined(__ANDROID__)
+        while (nanosleep(&ts, &ts) == -1 && errno == EINTR)
+            ;
 #else
 #warning sleep_for not yet implemented
 #endif
diff --git a/sources/cxx-stl/llvm-libc++/libcxx/test/containers/MoveOnly.h b/sources/cxx-stl/llvm-libc++/libcxx/test/containers/MoveOnly.h
index cf988cf..e4d9f64 100644
--- a/sources/cxx-stl/llvm-libc++/libcxx/test/containers/MoveOnly.h
+++ b/sources/cxx-stl/llvm-libc++/libcxx/test/containers/MoveOnly.h
@@ -17,14 +17,7 @@
 
 class MoveOnly
 {
-#if !defined(__clang__)
-// GCC 4.8 when compile containers/associative/map/map.cons/move_alloc.pass.cpp, etc,
-// complains about the following being private
-public:
-    MoveOnly(const MoveOnly&) {}
-#else
     MoveOnly(const MoveOnly&);
-#endif
     MoveOnly& operator=(const MoveOnly&);
 
     int data_;
diff --git a/sources/cxx-stl/llvm-libc++/libcxx/test/depr/depr.c.headers/math_h.pass.cpp b/sources/cxx-stl/llvm-libc++/libcxx/test/depr/depr.c.headers/math_h.pass.cpp
index f26f10d..a789707 100644
--- a/sources/cxx-stl/llvm-libc++/libcxx/test/depr/depr.c.headers/math_h.pass.cpp
+++ b/sources/cxx-stl/llvm-libc++/libcxx/test/depr/depr.c.headers/math_h.pass.cpp
@@ -221,7 +221,7 @@
 void test_isinf()
 {
     static_assert((std::is_same<decltype(isinf((float)0)), bool>::value), "");
-#if !(defined(__ANDROID__) && (__LP64__ || __ANDROID_API__ >= 20))
+#if !(defined(__ANDROID__) && (__LP64__ || __ANDROID_API__ >= 21))
  // 64-bit bionic isinf(double) returns int.  
     static_assert((std::is_same<decltype(isinf((double)0)), bool>::value), "");
 #endif
diff --git a/sources/cxx-stl/llvm-libc++/libcxx/test/numerics/c.math/cmath.pass.cpp b/sources/cxx-stl/llvm-libc++/libcxx/test/numerics/c.math/cmath.pass.cpp
index b526cac..24f281b 100644
--- a/sources/cxx-stl/llvm-libc++/libcxx/test/numerics/c.math/cmath.pass.cpp
+++ b/sources/cxx-stl/llvm-libc++/libcxx/test/numerics/c.math/cmath.pass.cpp
@@ -481,7 +481,7 @@
 #error isinf defined
 #endif
     static_assert((std::is_same<decltype(std::isinf((float)0)), bool>::value), "");
-#if !(defined(__ANDROID__) && (__LP64__ || __ANDROID_API__ >= 20))
+#if !(defined(__ANDROID__) && (__LP64__ || __ANDROID_API__ >= 21))
  // bionic isnan(double) returns int.
     static_assert((std::is_same<decltype(std::isinf((double)0)), bool>::value), "");
 #endif
diff --git a/sources/cxx-stl/llvm-libc++/libcxx/test/strings/string.conversions/stof.pass.cpp b/sources/cxx-stl/llvm-libc++/libcxx/test/strings/string.conversions/stof.pass.cpp
index 65809cb..6d80f1d 100644
--- a/sources/cxx-stl/llvm-libc++/libcxx/test/strings/string.conversions/stof.pass.cpp
+++ b/sources/cxx-stl/llvm-libc++/libcxx/test/strings/string.conversions/stof.pass.cpp
@@ -38,21 +38,27 @@
     idx = 0;
     try
     {
+        // 21.5p4 and p6: "call strtod [...] Throws out_of_range if strtod
+        // [...] sets errno to ERANGE".  1.e60 fits in a double, so while this
+        // does return INFINITY it shouldn't throw according to the standard.
         assert(std::stof("1.e60", &idx) == INFINITY);
-        assert(false);
+        assert(idx == 5);
     }
     catch (const std::out_of_range&)
     {
-        assert(idx == 0);
+        assert(false);
     }
     try
     {
+        // 21.5p11 and p13: "call wcstod [...] Throws out_of_range if wcstod
+        // [...] sets errno to ERANGE".  1.e60 fits in a double, so while this
+        // does return INFINITY it shouldn't throw according to the standard.
         assert(std::stof(L"1.e60", &idx) == INFINITY);
-        assert(false);
+        assert(idx == 5);
     }
     catch (const std::out_of_range&)
     {
-        assert(idx == 0);
+        assert(false);
     }
     idx = 0;
     try
diff --git a/sources/cxx-stl/llvm-libc++/libcxx/test/utilities/meta/meta.rel/is_convertible.pass.cpp b/sources/cxx-stl/llvm-libc++/libcxx/test/utilities/meta/meta.rel/is_convertible.pass.cpp
index 718e0ff..9d3589b 100644
--- a/sources/cxx-stl/llvm-libc++/libcxx/test/utilities/meta/meta.rel/is_convertible.pass.cpp
+++ b/sources/cxx-stl/llvm-libc++/libcxx/test/utilities/meta/meta.rel/is_convertible.pass.cpp
@@ -38,6 +38,13 @@
   NonCopyable(NonCopyable&);
 };
 
+class MoveOnly {
+  MoveOnly(const MoveOnly &);
+  MoveOnly& operator =(const MoveOnly&);
+public:
+    MoveOnly(MoveOnly&& x);
+};
+
 int main()
 {
     // void
@@ -177,13 +184,17 @@
     static_assert(( std::is_convertible<const char*, const char*>::value), "");
 
     // NonCopyable
-    static_assert((std::is_convertible<NonCopyable&, NonCopyable&>::value), "");
-    static_assert((std::is_convertible<NonCopyable&, const NonCopyable&>::value), "");
-    static_assert((std::is_convertible<NonCopyable&, const volatile NonCopyable&>::value), "");
-    static_assert((std::is_convertible<NonCopyable&, volatile NonCopyable&>::value), "");
-    static_assert((std::is_convertible<const NonCopyable&, const NonCopyable&>::value), "");
-    static_assert((std::is_convertible<const NonCopyable&, const volatile NonCopyable&>::value), "");
-    static_assert((std::is_convertible<volatile NonCopyable&, const volatile NonCopyable&>::value), "");
-    static_assert((std::is_convertible<const volatile NonCopyable&, const volatile NonCopyable&>::value), "");
+    static_assert(( std::is_convertible<NonCopyable&, NonCopyable&>::value), "");
+    static_assert(( std::is_convertible<NonCopyable&, const NonCopyable&>::value), "");
+    static_assert(( std::is_convertible<NonCopyable&, const volatile NonCopyable&>::value), "");
+    static_assert(( std::is_convertible<NonCopyable&, volatile NonCopyable&>::value), "");
+    static_assert(( std::is_convertible<const NonCopyable&, const NonCopyable&>::value), "");
+    static_assert(( std::is_convertible<const NonCopyable&, const volatile NonCopyable&>::value), "");
+    static_assert(( std::is_convertible<volatile NonCopyable&, const volatile NonCopyable&>::value), "");
+    static_assert(( std::is_convertible<const volatile NonCopyable&, const volatile NonCopyable&>::value), "");
     static_assert((!std::is_convertible<const NonCopyable&, NonCopyable&>::value), "");
+
+    // MoveOnly
+    static_assert(( std::is_convertible<MoveOnly, MoveOnly>::value), "");
+    static_assert((!std::is_convertible<const MoveOnly, MoveOnly>::value), "");
 }
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/LICENSE.TXT b/sources/cxx-stl/llvm-libc++abi/libcxxabi/LICENSE.TXT
index b04ba2c..17969ae 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/LICENSE.TXT
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/LICENSE.TXT
@@ -14,7 +14,7 @@
 University of Illinois/NCSA
 Open Source License
 
-Copyright (c) 2009-2013 by the contributors listed in CREDITS.TXT
+Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT
 
 All rights reserved.
 
@@ -55,7 +55,7 @@
 
 ==============================================================================
 
-Copyright (c) 2009-2013 by the contributors listed in CREDITS.TXT
+Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/include/cxxabi.h b/sources/cxx-stl/llvm-libc++abi/libcxxabi/include/cxxabi.h
index 66ef6d4..8fb079b 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/include/cxxabi.h
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/include/cxxabi.h
@@ -21,6 +21,14 @@
 #define _LIBCPPABI_VERSION 1001
 #define LIBCXXABI_NORETURN  __attribute__((noreturn))
 
+// TODO(danakj): This is also in unwind.h and libunwind.h, can we consolidate?
+#if !defined(__USING_SJLJ_EXCEPTIONS__) && defined(__arm__) && \
+    !defined(__ARM_DWARF_EH__) && !defined(__APPLE__)
+#define LIBCXXABI_ARM_EHABI 1
+#else
+#define LIBCXXABI_ARM_EHABI 0
+#endif
+
 #ifdef __cplusplus
 
 namespace std {
@@ -44,6 +52,10 @@
 extern void * __cxa_get_exception_ptr(void * exceptionObject) throw();
 extern void * __cxa_begin_catch(void * exceptionObject) throw();
 extern void __cxa_end_catch();
+#if LIBCXXABI_ARM_EHABI
+extern bool __cxa_begin_cleanup(void * exceptionObject) throw();
+extern void __cxa_end_cleanup();
+#endif
 extern std::type_info * __cxa_current_exception_type();
 
 // 2.5.4 Rethrowing Exceptions
@@ -168,8 +180,8 @@
   } // extern "C"
 } // namespace __cxxabiv1
 
-#endif // __cplusplus
-
 namespace abi = __cxxabiv1;
 
+#endif // __cplusplus
+
 #endif // __CXXABI_H 
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/include/libunwind.h b/sources/cxx-stl/llvm-libc++abi/libcxxabi/include/libunwind.h
index 1b2990d..ab97c41 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/include/libunwind.h
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/include/libunwind.h
@@ -17,6 +17,14 @@
 #include <stdint.h>
 #include <stddef.h>
 
+// TODO(danakj): This is also in unwind.h and cxxabi.h, can we consolidate?
+#if !defined(__USING_SJLJ_EXCEPTIONS__) && defined(__arm__) && \
+    !defined(__ARM_DWARF_EH__) && !defined(__APPLE__)
+#define LIBCXXABI_ARM_EHABI 1
+#else
+#define LIBCXXABI_ARM_EHABI 0
+#endif
+
 #if __APPLE__
   #include <Availability.h>
     #if __arm__
@@ -56,8 +64,17 @@
 typedef struct unw_addr_space *unw_addr_space_t;
 
 typedef int unw_regnum_t;
+#if __arm__
+typedef uint32_t unw_word_t;
+#else
 typedef uint64_t unw_word_t;
+#endif
+
+#if __arm__
+typedef uint64_t unw_fpreg_t;
+#else
 typedef double unw_fpreg_t;
+#endif
 
 struct unw_proc_info_t {
   unw_word_t  start_ip;         /* start address of function */
@@ -87,6 +104,12 @@
 extern int unw_set_fpreg(unw_cursor_t *, unw_regnum_t, unw_fpreg_t)  LIBUNWIND_AVAIL;
 extern int unw_resume(unw_cursor_t *) LIBUNWIND_AVAIL;
 
+#if __arm__
+/* Save VFP registers in FSTMX format (instead of FSTMD). */
+extern void unw_save_vfp_as_X(unw_cursor_t *) LIBUNWIND_AVAIL;
+#endif
+
+
 extern const char *unw_regname(unw_cursor_t *, unw_regnum_t) LIBUNWIND_AVAIL;
 extern int unw_get_proc_info(unw_cursor_t *, unw_proc_info_t *) LIBUNWIND_AVAIL;
 extern int unw_is_fpreg(unw_cursor_t *, unw_regnum_t) LIBUNWIND_AVAIL;
@@ -353,4 +376,134 @@
   UNW_ARM64_D31 = 95,
 };
 
+// 32-bit ARM registers. Numbers match DWARF for ARM spec #3.1 Table 1.
+// Naming scheme uses recommendations given in Note 4 for VFP-v2 and VFP-v3.
+// In this scheme, even though the 64-bit floating point registers D0-D31
+// overlap physically with the 32-bit floating pointer registers S0-S31,
+// they are given a non-overlapping range of register numbers.
+//
+// Commented out ranges are not preserved during unwinding.
+enum {
+  UNW_ARM_R0  = 0,
+  UNW_ARM_R1  = 1,
+  UNW_ARM_R2  = 2,
+  UNW_ARM_R3  = 3,
+  UNW_ARM_R4  = 4,
+  UNW_ARM_R5  = 5,
+  UNW_ARM_R6  = 6,
+  UNW_ARM_R7  = 7,
+  UNW_ARM_R8  = 8,
+  UNW_ARM_R9  = 9,
+  UNW_ARM_R10 = 10,
+  UNW_ARM_R11 = 11,
+  UNW_ARM_R12 = 12,
+  UNW_ARM_SP  = 13,  // Logical alias for UNW_REG_SP
+  UNW_ARM_R13 = 13,
+  UNW_ARM_LR  = 14,
+  UNW_ARM_R14 = 14,
+  UNW_ARM_IP  = 15,  // Logical alias for UNW_REG_IP
+  UNW_ARM_R15 = 15,
+  // 16-63 -- OBSOLETE. Used in VFP1 to represent both S0-S31 and D0-D31.
+  UNW_ARM_S0  = 64,
+  UNW_ARM_S1  = 65,
+  UNW_ARM_S2  = 66,
+  UNW_ARM_S3  = 67,
+  UNW_ARM_S4  = 68,
+  UNW_ARM_S5  = 69,
+  UNW_ARM_S6  = 70,
+  UNW_ARM_S7  = 71,
+  UNW_ARM_S8  = 72,
+  UNW_ARM_S9  = 73,
+  UNW_ARM_S10 = 74,
+  UNW_ARM_S11 = 75,
+  UNW_ARM_S12 = 76,
+  UNW_ARM_S13 = 77,
+  UNW_ARM_S14 = 78,
+  UNW_ARM_S15 = 79,
+  UNW_ARM_S16 = 80,
+  UNW_ARM_S17 = 81,
+  UNW_ARM_S18 = 82,
+  UNW_ARM_S19 = 83,
+  UNW_ARM_S20 = 84,
+  UNW_ARM_S21 = 85,
+  UNW_ARM_S22 = 86,
+  UNW_ARM_S23 = 87,
+  UNW_ARM_S24 = 88,
+  UNW_ARM_S25 = 89,
+  UNW_ARM_S26 = 90,
+  UNW_ARM_S27 = 91,
+  UNW_ARM_S28 = 92,
+  UNW_ARM_S29 = 93,
+  UNW_ARM_S30 = 94,
+  UNW_ARM_S31 = 95,
+  //  96-103 -- OBSOLETE. F0-F7. Used by the FPA system. Superseded by VFP.
+  // 104-111 -- wCGR0-wCGR7, ACC0-ACC7 (Intel wireless MMX)
+  UNW_ARM_WR0 = 112,
+  UNW_ARM_WR1 = 113,
+  UNW_ARM_WR2 = 114,
+  UNW_ARM_WR3 = 115,
+  UNW_ARM_WR4 = 116,
+  UNW_ARM_WR5 = 117,
+  UNW_ARM_WR6 = 118,
+  UNW_ARM_WR7 = 119,
+  UNW_ARM_WR8 = 120,
+  UNW_ARM_WR9 = 121,
+  UNW_ARM_WR10 = 122,
+  UNW_ARM_WR11 = 123,
+  UNW_ARM_WR12 = 124,
+  UNW_ARM_WR13 = 125,
+  UNW_ARM_WR14 = 126,
+  UNW_ARM_WR15 = 127,
+  // 128-133 -- SPSR, SPSR_{FIQ|IRQ|ABT|UND|SVC}
+  // 134-143 -- Reserved
+  // 144-150 -- R8_USR–R14_USR
+  // 151-157 -- R8_FIQ–R14_FIQ
+  // 158-159 -- R13_IRQ–R14_IRQ
+  // 160-161 -- R13_ABT–R14_ABT
+  // 162-163 -- R13_UND–R14_UND
+  // 164-165 -- R13_SVC–R14_SVC
+  // 166-191 -- Reserved
+  UNW_ARM_WC0 = 192,
+  UNW_ARM_WC1 = 193,
+  UNW_ARM_WC2 = 194,
+  UNW_ARM_WC3 = 195,
+  // 196-199 -- wC4-wC7 (Intel wireless MMX control)
+  // 200-255 -- Reserved
+  UNW_ARM_D0  = 256,
+  UNW_ARM_D1  = 257,
+  UNW_ARM_D2  = 258,
+  UNW_ARM_D3  = 259,
+  UNW_ARM_D4  = 260,
+  UNW_ARM_D5  = 261,
+  UNW_ARM_D6  = 262,
+  UNW_ARM_D7  = 263,
+  UNW_ARM_D8  = 264,
+  UNW_ARM_D9  = 265,
+  UNW_ARM_D10 = 266,
+  UNW_ARM_D11 = 267,
+  UNW_ARM_D12 = 268,
+  UNW_ARM_D13 = 269,
+  UNW_ARM_D14 = 270,
+  UNW_ARM_D15 = 271,
+  UNW_ARM_D16 = 272,
+  UNW_ARM_D17 = 273,
+  UNW_ARM_D18 = 274,
+  UNW_ARM_D19 = 275,
+  UNW_ARM_D20 = 276,
+  UNW_ARM_D21 = 277,
+  UNW_ARM_D22 = 278,
+  UNW_ARM_D23 = 279,
+  UNW_ARM_D24 = 280,
+  UNW_ARM_D25 = 281,
+  UNW_ARM_D26 = 282,
+  UNW_ARM_D27 = 283,
+  UNW_ARM_D28 = 284,
+  UNW_ARM_D29 = 285,
+  UNW_ARM_D30 = 286,
+  UNW_ARM_D31 = 287,
+  // 288-319 -- Reserved for VFP/Neon
+  // 320-8191 -- Reserved
+  // 8192-16383 -- Unspecified vendor co-processor register.
+};
+
 #endif
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/include/mach-o/compact_unwind_encoding.h b/sources/cxx-stl/llvm-libc++abi/libcxxabi/include/mach-o/compact_unwind_encoding.h
index 6110688..3e9b054 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/include/mach-o/compact_unwind_encoding.h
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/include/mach-o/compact_unwind_encoding.h
@@ -265,15 +265,13 @@
 //
 
 
-#ifndef __OPEN_SOURCE__
-
 // ARM64
 //
 // 1-bit: start
 // 1-bit: has lsda
 // 2-bit: personality index
 //
-// 4-bits: 4=frame-based, 2=frameless, 3=dwarf
+// 4-bits: 4=frame-based, 3=dwarf, 2=frameless
 //  frameless:
 //        12-bits of stack size
 //  frame-based:
@@ -298,15 +296,6 @@
     UNWIND_ARM64_FRAME_D12_D13_PAIR            = 0x00000400,
     UNWIND_ARM64_FRAME_D14_D15_PAIR            = 0x00000800,
 
-    UNWIND_ARM64_FRAME_X21_X22_PAIR_OLD        = 0x00000001,
-    UNWIND_ARM64_FRAME_X23_X24_PAIR_OLD        = 0x00000002,
-    UNWIND_ARM64_FRAME_X25_X26_PAIR_OLD        = 0x00000004,
-    UNWIND_ARM64_FRAME_X27_X28_PAIR_OLD        = 0x00000008,
-    UNWIND_ARM64_FRAME_D8_D9_PAIR_OLD          = 0x00000010,
-    UNWIND_ARM64_FRAME_D10_D11_PAIR_OLD        = 0x00000020,
-    UNWIND_ARM64_FRAME_D12_D13_PAIR_OLD        = 0x00000040,
-    UNWIND_ARM64_FRAME_D14_D15_PAIR_OLD        = 0x00000080,
-
     UNWIND_ARM64_FRAMELESS_STACK_SIZE_MASK     = 0x00FFF000,
     UNWIND_ARM64_DWARF_SECTION_OFFSET          = 0x00FFFFFF,
 };
@@ -333,8 +322,6 @@
 //    function.
 //
 
-#endif // __OPEN_SOURCE__
-
 
 
 
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/include/unwind.h b/sources/cxx-stl/llvm-libc++abi/libcxxabi/include/unwind.h
index bd791da..1f715b1 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/include/unwind.h
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/include/unwind.h
@@ -17,8 +17,23 @@
 #include <stdint.h>
 #include <stddef.h>
 
+#if defined(__APPLE__)
+#define LIBUNWIND_UNAVAIL __attribute__ (( unavailable ))
+#else
+#define LIBUNWIND_UNAVAIL
+#endif
+
+// TODO(danakj): This is also in cxxabi.h and libunwind.h, can we consolidate?
+#if !defined(__USING_SJLJ_EXCEPTIONS__) && defined(__arm__) && \
+    !defined(__ARM_DWARF_EH__) && !defined(__APPLE__)
+#define LIBCXXABI_ARM_EHABI 1
+#else
+#define LIBCXXABI_ARM_EHABI 0
+#endif
+
 typedef enum {
   _URC_NO_REASON = 0,
+  _URC_OK = 0,
   _URC_FOREIGN_EXCEPTION_CAUGHT = 1,
   _URC_FATAL_PHASE2_ERROR = 2,
   _URC_FATAL_PHASE1_ERROR = 3,
@@ -26,7 +41,10 @@
   _URC_END_OF_STACK = 5,
   _URC_HANDLER_FOUND = 6,
   _URC_INSTALL_CONTEXT = 7,
-  _URC_CONTINUE_UNWIND = 8
+  _URC_CONTINUE_UNWIND = 8,
+#if LIBCXXABI_ARM_EHABI
+  _URC_FAILURE = 9,
+#endif
 } _Unwind_Reason_Code;
 
 typedef enum {
@@ -37,13 +55,70 @@
   _UA_END_OF_STACK = 16 // gcc extension to C++ ABI
 } _Unwind_Action;
 
+typedef struct _Unwind_Context _Unwind_Context;   // opaque
+
+#if LIBCXXABI_ARM_EHABI
+typedef uint32_t _Unwind_State;
+
+static const _Unwind_State _US_VIRTUAL_UNWIND_FRAME   = 0;
+static const _Unwind_State _US_UNWIND_FRAME_STARTING  = 1;
+static const _Unwind_State _US_UNWIND_FRAME_RESUME    = 2;
+
+typedef uint32_t _Unwind_EHT_Header;
+
+struct _Unwind_Control_Block;
+typedef struct _Unwind_Control_Block _Unwind_Control_Block;
+typedef struct _Unwind_Control_Block _Unwind_Exception; /* Alias */
+
+struct _Unwind_Control_Block {
+  uint64_t exception_class;
+  void (*exception_cleanup)(_Unwind_Reason_Code, _Unwind_Control_Block*);
+  /* Unwinder cache, private fields for the unwinder's use */
+  struct {
+    uint32_t reserved1; /* init reserved1 to 0, then don't touch */
+    uint32_t reserved2;
+    uint32_t reserved3;
+    uint32_t reserved4;
+    uint32_t reserved5;
+  } unwinder_cache;
+  /* Propagation barrier cache (valid after phase 1): */
+  struct {
+    uint32_t sp;
+    uint32_t bitpattern[5];
+  } barrier_cache;
+  /* Cleanup cache (preserved over cleanup): */
+  struct {
+    uint32_t bitpattern[4];
+  } cleanup_cache;
+  /* Pr cache (for pr's benefit): */
+  struct {
+    uint32_t fnstart; /* function start address */
+    _Unwind_EHT_Header* ehtp; /* pointer to EHT entry header word */
+    uint32_t additional; /* additional data */
+    uint32_t reserved1;
+  } pr_cache;
+
+  long long int :0; /* Enforce the 8-byte alignment */
+};
+
+typedef _Unwind_Reason_Code (*_Unwind_Stop_Fn)
+      (_Unwind_State state,
+       _Unwind_Exception* exceptionObject,
+       struct _Unwind_Context* context);
+
+typedef _Unwind_Reason_Code (*__personality_routine)
+      (_Unwind_State state,
+       _Unwind_Exception* exceptionObject,
+       struct _Unwind_Context* context);
+#else
 struct _Unwind_Context;   // opaque
 struct _Unwind_Exception; // forward declaration
+typedef struct _Unwind_Exception _Unwind_Exception;
 
 struct _Unwind_Exception {
   uint64_t exception_class;
   void (*exception_cleanup)(_Unwind_Reason_Code reason,
-                            struct _Unwind_Exception *exc);
+                            _Unwind_Exception *exc);
   uintptr_t private_1; // non-zero means forced unwind
   uintptr_t private_2; // holds sp that phase1 found for phase2 to use
 #if !__LP64__
@@ -55,20 +130,13 @@
 #endif
 };
 
-typedef _Unwind_Reason_Code (*_Unwind_Stop_Fn)
-    (int version,
-     _Unwind_Action actions,
-     uint64_t exceptionClass,
-     struct _Unwind_Exception* exceptionObject,
-     struct _Unwind_Context* context,
-     void* stop_parameter );
-
 typedef _Unwind_Reason_Code (*__personality_routine)
       (int version,
        _Unwind_Action actions,
        uint64_t exceptionClass,
-       struct _Unwind_Exception* exceptionObject,
+       _Unwind_Exception* exceptionObject,
        struct _Unwind_Context* context);
+#endif
 
 #ifdef __cplusplus
 extern "C" {
@@ -77,35 +145,111 @@
 //
 // The following are the base functions documented by the C++ ABI
 //
-#if __arm__
+#if __USING_SJLJ_EXCEPTIONS__
 extern _Unwind_Reason_Code
-    _Unwind_SjLj_RaiseException(struct _Unwind_Exception *exception_object);
-extern void _Unwind_SjLj_Resume(struct _Unwind_Exception *exception_object);
+    _Unwind_SjLj_RaiseException(_Unwind_Exception *exception_object);
+extern void _Unwind_SjLj_Resume(_Unwind_Exception *exception_object);
 #else
 extern _Unwind_Reason_Code
-    _Unwind_RaiseException(struct _Unwind_Exception *exception_object);
-extern void _Unwind_Resume(struct _Unwind_Exception *exception_object);
+    _Unwind_RaiseException(_Unwind_Exception *exception_object);
+extern void _Unwind_Resume(_Unwind_Exception *exception_object);
 #endif
-extern void _Unwind_DeleteException(struct _Unwind_Exception *exception_object);
+extern void _Unwind_DeleteException(_Unwind_Exception *exception_object);
+
+#if LIBCXXABI_ARM_EHABI
+typedef enum {
+  _UVRSC_CORE = 0, /* integer register */
+  _UVRSC_VFP = 1, /* vfp */
+  _UVRSC_WMMXD = 3, /* Intel WMMX data register */
+  _UVRSC_WMMXC = 4 /* Intel WMMX control register */
+} _Unwind_VRS_RegClass;
+
+typedef enum {
+  _UVRSD_UINT32 = 0,
+  _UVRSD_VFPX = 1,
+  _UVRSD_UINT64 = 3,
+  _UVRSD_FLOAT = 4,
+  _UVRSD_DOUBLE = 5
+} _Unwind_VRS_DataRepresentation;
+
+typedef enum {
+  _UVRSR_OK = 0,
+  _UVRSR_NOT_IMPLEMENTED = 1,
+  _UVRSR_FAILED = 2
+} _Unwind_VRS_Result;
+
+extern void _Unwind_Complete(_Unwind_Exception* exception_object);
+
+extern _Unwind_VRS_Result _Unwind_VRS_Get(_Unwind_Context* context,
+                                          _Unwind_VRS_RegClass regclass,
+                                          uint32_t regno,
+                                          _Unwind_VRS_DataRepresentation representation,
+                                          void *valuep);
+
+extern _Unwind_VRS_Result _Unwind_VRS_Set(_Unwind_Context* context,
+                                          _Unwind_VRS_RegClass regclass,
+                                          uint32_t regno,
+                                          _Unwind_VRS_DataRepresentation representation,
+                                          void *valuep);
+
+extern _Unwind_VRS_Result _Unwind_VRS_Pop(_Unwind_Context *context,
+                                          _Unwind_VRS_RegClass regclass,
+                                          uint32_t discriminator,
+                                          _Unwind_VRS_DataRepresentation representation);
+
+// TODO(ajwong): This is not part of the EHABI. Decide if the name is right.
+extern _Unwind_Reason_Code _Unwind_VRS_Interpret(_Unwind_Context* context,
+                                                 uint32_t* data,
+                                                 size_t offset,
+                                                 size_t len);
+
+// TODO(ajwong) Should these {Set,Get}/{GR,IP} be removed in favor of
+// VRS_Get/VRS_Set? Is the thumb bit inference in SetIP correct?
+static inline uintptr_t _Unwind_GetGR(struct _Unwind_Context* context,
+                                      int index) {
+  uintptr_t value = 0;
+  _Unwind_VRS_Get(context, _UVRSC_CORE, (uint32_t)index, _UVRSD_UINT32, &value);
+  return value;
+}
+
+static inline void _Unwind_SetGR(struct _Unwind_Context* context, int index,
+                                 uintptr_t new_value) {
+  _Unwind_VRS_Set(context, _UVRSC_CORE, (uint32_t)index,
+                  _UVRSD_UINT32, &new_value);
+}
+
+static inline uintptr_t _Unwind_GetIP(struct _Unwind_Context* context) {
+  // remove the thumb-bit before returning
+  return (_Unwind_GetGR(context, 15) & (~(uintptr_t)0x1));
+}
+
+static inline void _Unwind_SetIP(struct _Unwind_Context* context,
+                                 uintptr_t new_value) {
+  uintptr_t thumb_bit = _Unwind_GetGR(context, 15) & ((uintptr_t)0x1);
+  _Unwind_SetGR(context, 15, new_value | thumb_bit);
+}
+#else // LIBCXXABI_ARM_EHABI
 extern uintptr_t _Unwind_GetGR(struct _Unwind_Context *context, int index);
 extern void _Unwind_SetGR(struct _Unwind_Context *context, int index,
                           uintptr_t new_value);
 extern uintptr_t _Unwind_GetIP(struct _Unwind_Context *context);
 extern void _Unwind_SetIP(struct _Unwind_Context *, uintptr_t new_value);
+#endif // LIBCXXABI_ARM_EHABI
+
 extern uintptr_t _Unwind_GetRegionStart(struct _Unwind_Context *context);
 extern uintptr_t
     _Unwind_GetLanguageSpecificData(struct _Unwind_Context *context);
-#if __arm__
+#if __USING_SJLJ_EXCEPTIONS__
 extern _Unwind_Reason_Code
-    _Unwind_SjLj_ForcedUnwind(struct _Unwind_Exception *exception_object,
+    _Unwind_SjLj_ForcedUnwind(_Unwind_Exception *exception_object,
                               _Unwind_Stop_Fn stop, void *stop_parameter);
-#else
+#else // !__USING_SJLJ_EXCEPTIONS__
 extern _Unwind_Reason_Code
-    _Unwind_ForcedUnwind(struct _Unwind_Exception *exception_object,
+    _Unwind_ForcedUnwind(_Unwind_Exception *exception_object,
                          _Unwind_Stop_Fn stop, void *stop_parameter);
-#endif
+#endif // !__USING_SJLJ_EXCEPTIONS__
 
-#if __arm__
+#if __USING_SJLJ_EXCEPTIONS__
 typedef struct _Unwind_FunctionContext *_Unwind_FunctionContext_t;
 extern void _Unwind_SjLj_Register(_Unwind_FunctionContext_t fc);
 extern void _Unwind_SjLj_Unregister(_Unwind_FunctionContext_t fc);
@@ -118,12 +262,12 @@
 //
 //  called by __cxa_rethrow().
 //
-#if __arm__
+#if __USING_SJLJ_EXCEPTIONS__
 extern _Unwind_Reason_Code
-    _Unwind_SjLj_Resume_or_Rethrow(struct _Unwind_Exception *exception_object);
+    _Unwind_SjLj_Resume_or_Rethrow(_Unwind_Exception *exception_object);
 #else
 extern _Unwind_Reason_Code
-    _Unwind_Resume_or_Rethrow(struct _Unwind_Exception *exception_object);
+    _Unwind_Resume_or_Rethrow(_Unwind_Exception *exception_object);
 #endif
 
 // _Unwind_Backtrace() is a gcc extension that walks the stack and calls the
@@ -181,28 +325,28 @@
 // Mac OS X does not support text-rel and data-rel addressing so these functions
 // are unimplemented
 extern uintptr_t _Unwind_GetDataRelBase(struct _Unwind_Context *context)
-    __attribute__((unavailable));
+    LIBUNWIND_UNAVAIL;
 extern uintptr_t _Unwind_GetTextRelBase(struct _Unwind_Context *context)
-    __attribute__((unavailable));
+    LIBUNWIND_UNAVAIL;
 
 // Mac OS X 10.4 and 10.5 had implementations of these functions in
 // libgcc_s.dylib, but they never worked.  
 /// These functions are no longer available on Mac OS X.
 extern void __register_frame_info_bases(const void *fde, void *ob, void *tb,
-                                        void *db) __attribute__((unavailable));
+                                        void *db) LIBUNWIND_UNAVAIL;
 extern void __register_frame_info(const void *fde, void *ob)
-    __attribute__((unavailable));
+    LIBUNWIND_UNAVAIL;
 extern void __register_frame_info_table_bases(const void *fde, void *ob,
                                               void *tb, void *db)
-    __attribute__((unavailable));
+    LIBUNWIND_UNAVAIL;
 extern void __register_frame_info_table(const void *fde, void *ob)
-    __attribute__((unavailable));
+    LIBUNWIND_UNAVAIL;
 extern void __register_frame_table(const void *fde)
-    __attribute__((unavailable));
+    LIBUNWIND_UNAVAIL;
 extern void *__deregister_frame_info(const void *fde)
-    __attribute__((unavailable));
+    LIBUNWIND_UNAVAIL;
 extern void *__deregister_frame_info_bases(const void *fde)
-    __attribute__((unavailable));
+    LIBUNWIND_UNAVAIL;
 
 #ifdef __cplusplus
 }
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/lib/buildit b/sources/cxx-stl/llvm-libc++abi/libcxxabi/lib/buildit
new file mode 100755
index 0000000..ea4359d
--- /dev/null
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/lib/buildit
@@ -0,0 +1,159 @@
+#! /bin/sh
+#
+# Set the $TRIPLE environment variable to your system's triple before
+# running this script.  If you set $CXX, that will be used to compile
+# the library.  Otherwise we'll use clang++.
+
+set -e
+
+if [ `basename $(pwd)` != "lib" ]
+then
+	echo "current directory must be lib"
+	exit 1
+fi
+
+if [ -z "$CXX" ]
+then
+	CXX=clang++
+fi
+
+if [ -z "$CC" ]
+then
+    CC=clang
+fi
+
+if [ -z "$AR" ]
+then
+    AR=ar
+fi
+
+if [ -z "$RANLIB" ]
+then
+    RANLIB=ranlib
+fi
+
+if [ -z "$AR" ]
+then
+    AR=ar
+fi
+
+if [ -z "$RANLIB" ]
+then
+    RANLIB=ranlib
+fi
+
+if [ -z $RC_ProjectSourceVersion ]
+then
+  RC_ProjectSourceVersion=1
+fi
+
+EXTRA_CC_FLAGS="-std=c11"
+EXTRA_CXX_FLAGS="-std=c++11 -stdlib=libc++"
+EXTRA_FLAGS="-fstrict-aliasing -Wstrict-aliasing=2 \
+             -Wsign-conversion -Wshadow -Wconversion -Wunused-variable \
+             -Wmissing-field-initializers -Wchar-subscripts -Wmismatched-tags \
+             -Wmissing-braces -Wshorten-64-to-32 -Wsign-compare \
+             -Wstrict-aliasing=2 -Wstrict-overflow=4 -Wunused-parameter \
+             -Wnewline-eof"
+
+case $TRIPLE in
+  *-apple-*)
+    if [ -z $RC_XBS ]
+    then
+      RC_CFLAGS="-arch i386 -arch x86_64"
+    fi
+    SOEXT=dylib
+    if [ -n "$SDKROOT" ]
+    then
+        EXTRA_CXX_FLAGS+="-isysroot ${SDKROOT}"
+        CXX=`xcrun -sdk "${SDKROOT}"  -find clang++`
+        CC=`xcrun -sdk "${SDKROOT}"  -find clang`
+    fi
+    LDSHARED_FLAGS="-o libc++abi.dylib \
+        -dynamiclib -nodefaultlibs  \
+        -current_version ${RC_ProjectSourceVersion} \
+        -compatibility_version 1 \
+        -install_name /usr/lib/libc++abi.dylib \
+        -lSystem"
+	if [ -f "${SDKROOT}/usr/local/lib/libCrashReporterClient.a" ]
+	then
+		LDSHARED_FLAGS+=" -lCrashReporterClient"
+	fi
+    ;;
+  *-*-mingw*)
+    # FIXME: removing libgcc and libsupc++ dependencies means porting libcxxrt and LLVM/compiler-rt
+    SOEXT=dll
+    LDSHARED_FLAGS="-o libc++abi.dll \
+        -shared -nodefaultlibs -Wl,--export-all-symbols -Wl,--allow-multiple-definition -Wl,--out-implib,libc++abi.dll.a \
+        -lsupc++ -lpthread -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcr100 -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt"
+	;;
+  *-none-eabi*)
+    RC_CFLAGS="-fPIC"
+    SOEXT=so
+    EXTRA_FLAGS+=" -target $TRIPLE --sysroot=$SYSROOT -no-integrated-as -funwind-tables -DLIBCXXABI_BARE_METAL=1"
+  ;;
+  *)
+    RC_CFLAGS="-fPIC"
+    SOEXT=so
+    LDSHARED_FLAGS="-o libc++abi.so.1.0 \
+        -shared -nodefaultlibs -Wl,-soname,libc++abi.so.1 \
+        -lpthread -lrt -lc -lstdc++"
+    ;;
+esac
+
+if [ -z $RC_XBS ]
+then
+    rm -f libc++abi.1.$SOEXT*
+fi
+
+set -x
+
+# Build the generic bits
+for FILE in ../src/*.cpp; do
+  $CXX -c -g -O0 $RC_CFLAGS $EXTRA_CXX_FLAGS $EXTRA_FLAGS -I../include $OPTIONS $FILE
+done
+case $TRIPLE in
+  *-*-mingw*)
+    for FILE in ../src/support/win32/*.cpp; do
+      $CXX -c -g -O0 $RC_CFLAGS $EXTRA_CXX_FLAGS $EXTRA_FLAGS -I../include $OPTIONS $FILE
+    done
+    ;;
+  *-apple-*)
+    for FILE in ../src/support/apple/*.cpp; do
+      $CXX -c -g -O0 $RC_CFLAGS $EXTRA_CXX_FLAGS $EXTRA_FLAGS -I../include $OPTIONS $FILE
+    done
+    ;;
+  *)
+    ;;
+esac
+
+# Build the Unwinder
+case $TRIPLE in
+  *-none-eabi*)
+    for FILE in ../src/Unwind/*.S; do
+      $CC -c -g -O0 $RC_CFLAGS $EXTRA_CC_FLAGS $EXTRA_FLAGS -I../include $OPTIONS $FILE
+    done
+    for FILE in ../src/Unwind/*.c; do
+      $CC -c -g -O0 $RC_CFLAGS $EXTRA_CC_FLAGS $EXTRA_FLAGS -I../include $OPTIONS $FILE
+    done
+    for FILE in ../src/Unwind/*.cpp; do
+      $CXX -c -g -O0 $RC_CFLAGS $EXTRA_CXX_FLAGS $EXTRA_FLAGS -I../include $OPTIONS $FILE
+    done
+  ;;
+esac
+
+# Package everything up in a library (shared or static)
+case $TRIPLE in
+  *-none-eabi*)
+    $AR rc libc++abi.a *.o
+    $RANLIB libc++abi.a
+  ;;
+  *)
+    $CC *.o $RC_CFLAGS $LDSHARED_FLAGS $EXTRA_CXX_FLAGS $EXTRA_FLAGS
+  ;;
+esac
+
+if [ -z $RC_XBS ]
+then
+    rm *.o
+fi
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/AddressSpace.hpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/AddressSpace.hpp
index 9efe8bf..7fc89aa 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/AddressSpace.hpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/AddressSpace.hpp
@@ -16,10 +16,14 @@
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
+
+#if !_LIBUNWIND_IS_BAREMETAL
 #include <dlfcn.h>
+#endif
 
 #if __APPLE__
-#include <mach-o/dyld_priv.h>
+#include <mach-o/getsect.h>
 namespace libunwind {
    bool checkKeyMgrRegisteredFDEs(uintptr_t targetAddr, void *&fde);
 }
@@ -30,23 +34,55 @@
 #include "dwarf2.h"
 #include "Registers.hpp"
 
+#if LIBCXXABI_ARM_EHABI
+#if __LINUX__
+ // Emulate the BSD dl_unwind_find_exidx API when on a GNU libdl system.
+ typedef long unsigned int *_Unwind_Ptr;
+ extern "C" _Unwind_Ptr __gnu_Unwind_Find_exidx(_Unwind_Ptr targetAddr, int *length);
+ _Unwind_Ptr (*dl_unwind_find_exidx)(_Unwind_Ptr targetAddr, int *length) =
+     __gnu_Unwind_Find_exidx;
+#else
+ #include <link.h>
+#endif
+#endif  // LIBCXXABI_ARM_EHABI
+
+#if LIBCXXABI_ARM_EHABI && _LIBUNWIND_IS_BAREMETAL
+// When statically linked on bare-metal, the symbols for the EH table are looked
+// up without going through the dynamic loader.
+// TODO(jroelofs): since Newlib on arm-none-eabi doesn't
+//                 have dl_unwind_find_exidx...
+struct EHTEntry {
+  uint32_t functionOffset;
+  uint32_t unwindOpcodes;
+};
+extern EHTEntry __exidx_start;
+extern EHTEntry __exidx_end;
+#endif
+
 namespace libunwind {
 
 /// Used by findUnwindSections() to return info about needed sections.
 struct UnwindInfoSections {
-  uintptr_t        dso_base;
 #if _LIBUNWIND_SUPPORT_DWARF_UNWIND
+  uintptr_t       dso_base;
   uintptr_t       dwarf_section;
   uintptr_t       dwarf_section_length;
 #endif
 #if _LIBUNWIND_SUPPORT_DWARF_INDEX
+  uintptr_t       dso_base;
   uintptr_t       dwarf_index_section;
   uintptr_t       dwarf_index_section_length;
 #endif
 #if _LIBUNWIND_SUPPORT_COMPACT_UNWIND
+  uintptr_t       dso_base;
   uintptr_t       compact_unwind_section;
   uintptr_t       compact_unwind_section_length;
 #endif
+#if LIBCXXABI_ARM_EHABI
+  // No dso_base for ARM EHABI.
+  uintptr_t       arm_section;
+  uintptr_t       arm_section_length;
+#endif
 };
 
 
@@ -62,12 +98,36 @@
   typedef uint32_t pint_t;
   typedef int32_t  sint_t;
 #endif
-  uint8_t         get8(pint_t addr)      { return *((uint8_t *)addr); }
-  uint16_t        get16(pint_t addr)     { return *((uint16_t *)addr); }
-  uint32_t        get32(pint_t addr)     { return *((uint32_t *)addr); }
-  uint64_t        get64(pint_t addr)     { return *((uint64_t *)addr); }
-  double          getDouble(pint_t addr) { return *((double *)addr); }
-  v128            getVector(pint_t addr) { return *((v128 *)addr); }
+  uint8_t         get8(pint_t addr) {
+    uint8_t val;
+    memcpy(&val, (void *)addr, sizeof(val));
+    return val;
+  }
+  uint16_t         get16(pint_t addr) {
+    uint16_t val;
+    memcpy(&val, (void *)addr, sizeof(val));
+    return val;
+  }
+  uint32_t         get32(pint_t addr) {
+    uint32_t val;
+    memcpy(&val, (void *)addr, sizeof(val));
+    return val;
+  }
+  uint64_t         get64(pint_t addr) {
+    uint64_t val;
+    memcpy(&val, (void *)addr, sizeof(val));
+    return val;
+  }
+  double           getDouble(pint_t addr) {
+    double val;
+    memcpy(&val, (void *)addr, sizeof(val));
+    return val;
+  }
+  v128             getVector(pint_t addr) {
+    v128 val;
+    memcpy(&val, (void *)addr, sizeof(val));
+    return val;
+  }
   uintptr_t       getP(pint_t addr);
   static uint64_t getULEB128(pint_t &addr, pint_t end);
   static int64_t  getSLEB128(pint_t &addr, pint_t end);
@@ -81,7 +141,6 @@
   static LocalAddressSpace sThisAddressSpace;
 };
 
-
 inline uintptr_t LocalAddressSpace::getP(pint_t addr) {
 #if __LP64__
   return get64(addr);
@@ -172,12 +231,14 @@
     result = (pint_t)getSLEB128(addr, end);
     break;
   case DW_EH_PE_sdata2:
-    result = (uint16_t)get16(addr);
+    // Sign extend from signed 16-bit value.
+    result = (pint_t)(int16_t)get16(addr);
     p += 2;
     addr = (pint_t) p;
     break;
   case DW_EH_PE_sdata4:
-    result = (uint32_t)get32(addr);
+    // Sign extend from signed 32-bit value.
+    result = (pint_t)(int32_t)get32(addr);
     p += 4;
     addr = (pint_t) p;
     break;
@@ -221,6 +282,48 @@
   return result;
 }
 
+#if __APPLE__ 
+  struct dyld_unwind_sections
+  {
+    const struct mach_header*   mh;
+    const void*                 dwarf_section;
+    uintptr_t                   dwarf_section_length;
+    const void*                 compact_unwind_section;
+    uintptr_t                   compact_unwind_section_length;
+  };
+  #if (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) \
+                                 && (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1070)) \
+      || defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
+    // In 10.7.0 or later, libSystem.dylib implements this function.
+    extern "C" bool _dyld_find_unwind_sections(void *, dyld_unwind_sections *);
+  #else
+    // In 10.6.x and earlier, we need to implement this functionality.
+    static inline bool _dyld_find_unwind_sections(void* addr, 
+                                                    dyld_unwind_sections* info) {
+      // Find mach-o image containing address.
+      Dl_info dlinfo;
+      if (!dladdr(addr, &dlinfo))
+        return false;
+      const mach_header *mh = (const mach_header *)dlinfo.dli_saddr;
+      
+      // Find dwarf unwind section in that image.
+      unsigned long size;
+      const uint8_t *p = getsectiondata(mh, "__TEXT", "__eh_frame", &size);
+      if (!p)
+        return false;
+      
+      // Fill in return struct.
+      info->mh = mh;
+      info->dwarf_section = p;
+      info->dwarf_section_length = size;
+      info->compact_unwind_section = 0;
+      info->compact_unwind_section_length = 0;
+     
+      return true;
+    }
+  #endif
+#endif
+
 inline bool LocalAddressSpace::findUnwindSections(pint_t targetAddr,
                                                   UnwindInfoSections &info) {
 #if __APPLE__
@@ -235,9 +338,21 @@
     info.compact_unwind_section_length = dyldInfo.compact_unwind_section_length;
     return true;
   }
-#else
-  // TO DO
-
+#elif LIBCXXABI_ARM_EHABI
+ #if !_LIBUNWIND_IS_BAREMETAL
+  int length = 0;
+  info.arm_section = (uintptr_t) dl_unwind_find_exidx(
+      (_Unwind_Ptr) targetAddr, &length);
+  info.arm_section_length = length;
+ #else
+  // Bare metal, statically linked
+  info.arm_section =        (uintptr_t)(&__exidx_start);
+  info.arm_section_length = (uintptr_t)(&__exidx_end - &__exidx_start);
+ #endif
+  _LIBUNWIND_TRACE_UNWINDING("findUnwindSections: section %X length %x\n",
+                             info.arm_section, info.arm_section_length);
+  if (info.arm_section && info.arm_section_length)
+    return true;
 #endif
 
   return false;
@@ -256,7 +371,8 @@
 inline bool LocalAddressSpace::findFunctionName(pint_t addr, char *buf,
                                                 size_t bufLen,
                                                 unw_word_t *offset) {
-  dl_info dyldInfo;
+#if !_LIBUNWIND_IS_BAREMETAL
+  Dl_info dyldInfo;
   if (dladdr((void *)addr, &dyldInfo)) {
     if (dyldInfo.dli_sname != NULL) {
       strlcpy(buf, dyldInfo.dli_sname, bufLen);
@@ -264,6 +380,7 @@
       return true;
     }
   }
+#endif
   return false;
 }
 
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/DwarfInstructions.hpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/DwarfInstructions.hpp
index 158bad8..dbce2e8 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/DwarfInstructions.hpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/DwarfInstructions.hpp
@@ -63,33 +63,17 @@
   static v128 getSavedVectorRegister(A &addressSpace, const R &registers,
                                   pint_t cfa, const RegisterLocation &savedReg);
 
-  // x86 specific variants
-  static int lastRestoreReg(const Registers_x86 &);
-  static bool isReturnAddressRegister(int regNum, const Registers_x86 &);
   static pint_t getCFA(A &addressSpace, const PrologInfo &prolog,
-                       const Registers_x86 &);
-
-  // x86_64 specific variants
-  static int lastRestoreReg(const Registers_x86_64 &);
-  static bool isReturnAddressRegister(int regNum, const Registers_x86_64 &);
-  static pint_t getCFA(A &addressSpace,
-                       const PrologInfo &prolog,
-                       const Registers_x86_64 &);
-
-  // ppc specific variants
-  static int lastRestoreReg(const Registers_ppc &);
-  static bool isReturnAddressRegister(int regNum, const Registers_ppc &);
-  static pint_t getCFA(A &addressSpace,
-                       const PrologInfo &prolog,
-                       const Registers_ppc &);
-
-  // arm64 specific variants
-  static bool isReturnAddressRegister(int regNum, const Registers_arm64 &);
-  static int lastRestoreReg(const Registers_arm64 &);
-  static pint_t getCFA(A &addressSpace,
-                       const PrologInfo &prolog,
-                       const Registers_arm64 &);
-
+                       const R &registers) {
+    if (prolog.cfaRegister != 0)
+      return (pint_t)((sint_t)registers.getRegister((int)prolog.cfaRegister) +
+             prolog.cfaRegisterOffset);
+    if (prolog.cfaExpression != 0)
+      return evaluateExpression((pint_t)prolog.cfaExpression, addressSpace, 
+                                registers, 0);
+    assert(0 && "getCFA(): unknown location");
+    __builtin_unreachable();
+  }
 };
 
 
@@ -177,17 +161,21 @@
     PrologInfo prolog;
     if (CFI_Parser<A>::parseFDEInstructions(addressSpace, fdeInfo, cieInfo, pc,
                                                                      &prolog)) {
-      R newRegisters = registers;
-
       // get pointer to cfa (architecture specific)
       pint_t cfa = getCFA(addressSpace, prolog, registers);
 
-      // restore registers that dwarf says were saved
+       // restore registers that dwarf says were saved
+      R newRegisters = registers;
       pint_t returnAddress = 0;
-      for (int i = 0; i <= lastRestoreReg(newRegisters); ++i) {
-        if (prolog.savedRegisters[i].location !=
-            CFI_Parser<A>::kRegisterUnused) {
-          if (registers.validFloatRegister(i))
+      const int lastReg = R::lastDwarfRegNum();
+      assert((int)CFI_Parser<A>::kMaxRegisterNumber > lastReg
+                                                && "register range too large");
+      assert(lastReg <= (int)cieInfo.returnAddressRegister
+                 && "register range does not contain return address register");
+      for (int i = 0; i <= lastReg; ++i) {
+         if (prolog.savedRegisters[i].location !=
+             CFI_Parser<A>::kRegisterUnused) {
+           if (registers.validFloatRegister(i))
             newRegisters.setFloatRegister(
                 i, getSavedFloatRegister(addressSpace, registers, cfa,
                                          prolog.savedRegisters[i]));
@@ -195,7 +183,7 @@
             newRegisters.setVectorRegister(
                 i, getSavedVectorRegister(addressSpace, registers, cfa,
                                           prolog.savedRegisters[i]));
-          else if (isReturnAddressRegister(i, registers))
+          else if (i == (int)cieInfo.returnAddressRegister)
             returnAddress = getSavedRegister(addressSpace, registers, cfa,
                                              prolog.savedRegisters[i]);
           else if (registers.validRegister(i))
@@ -764,123 +752,6 @@
   return *sp;
 }
 
-//
-//  x86_64 specific functions
-//
-template <typename A, typename R>
-int DwarfInstructions<A, R>::lastRestoreReg(const Registers_x86_64 &) {
-  static_assert((int)CFI_Parser<A>::kMaxRegisterNumber
-              > (int)DW_X86_64_RET_ADDR, "register number out of range");
-  return DW_X86_64_RET_ADDR;
-}
-
-template <typename A, typename R>
-bool
-DwarfInstructions<A, R>::isReturnAddressRegister(int regNum,
-                                                 const Registers_x86_64 &) {
-  return (regNum == DW_X86_64_RET_ADDR);
-}
-
-template <typename A, typename R>
-typename A::pint_t DwarfInstructions<A, R>::getCFA(
-    A &addressSpace, const PrologInfo &prolog,
-    const Registers_x86_64 &registers) {
-  if (prolog.cfaRegister != 0)
-    return (pint_t)((sint_t)registers.getRegister((int)prolog.cfaRegister)
-                                                    + prolog.cfaRegisterOffset);
-  else if (prolog.cfaExpression != 0)
-    return evaluateExpression((pint_t)prolog.cfaExpression, addressSpace, registers, 0);
-  else
-    _LIBUNWIND_ABORT("getCFA(): unknown location for x86_64 cfa");
-}
-
-
-//
-//  x86 specific functions
-//
-template <typename A, typename R>
-int DwarfInstructions<A, R>::lastRestoreReg(const Registers_x86 &) {
-  static_assert((int)CFI_Parser<A>::kMaxRegisterNumber
-              > (int)DW_X86_RET_ADDR, "register number out of range");
-  return DW_X86_RET_ADDR;
-}
-
-template <typename A, typename R>
-bool DwarfInstructions<A, R>::isReturnAddressRegister(int regNum,
-                                                      const Registers_x86 &) {
-  return (regNum == DW_X86_RET_ADDR);
-}
-
-template <typename A, typename R>
-typename A::pint_t DwarfInstructions<A, R>::getCFA(
-    A &addressSpace, const PrologInfo &prolog,
-    const Registers_x86 &registers) {
-  if (prolog.cfaRegister != 0)
-    return (pint_t)((sint_t)registers.getRegister((int)prolog.cfaRegister)
-                                                    + prolog.cfaRegisterOffset);
-  else if (prolog.cfaExpression != 0)
-    return evaluateExpression((pint_t)prolog.cfaExpression, addressSpace,
-                                                                  registers, 0);
-  else
-    _LIBUNWIND_ABORT("getCFA(): unknown location for x86 cfa");
-}
-
-
-//
-//  ppc specific functions
-//
-template <typename A, typename R>
-int DwarfInstructions<A, R>::lastRestoreReg(const Registers_ppc &) {
-  static_assert((int)CFI_Parser<A>::kMaxRegisterNumber
-              > (int)UNW_PPC_SPEFSCR, "register number out of range");
-  return UNW_PPC_SPEFSCR;
-}
-
-template <typename A, typename R>
-bool DwarfInstructions<A, R>::isReturnAddressRegister(int regNum,
-                                                      const Registers_ppc &) {
-  return (regNum == UNW_PPC_LR);
-}
-
-template <typename A, typename R>
-typename A::pint_t DwarfInstructions<A, R>::getCFA(
-    A &addressSpace, const PrologInfo &prolog,
-    const Registers_ppc &registers) {
-  if (prolog.cfaRegister != 0)
-    return registers.getRegister(prolog.cfaRegister) + prolog.cfaRegisterOffset;
-  else if (prolog.cfaExpression != 0)
-    return evaluateExpression((pint_t)prolog.cfaExpression, addressSpace,
-                                                                  registers, 0);
-  else
-    _LIBUNWIND_ABORT("getCFA(): unknown location for ppc cfa");
-}
-
-
-
-//
-// arm64 specific functions
-//
-template <typename A, typename R>
-bool DwarfInstructions<A, R>::isReturnAddressRegister(int regNum,
-                                                      const Registers_arm64 &) {
-  return (regNum == UNW_ARM64_LR);
-}
-
-template <typename A, typename R>
-int DwarfInstructions<A, R>::lastRestoreReg(const Registers_arm64 &) {
-  static_assert((int)CFI_Parser<A>::kMaxRegisterNumber
-              > (int)UNW_ARM64_D31, "register number out of range");
-  return UNW_ARM64_D31;
-}
-
-template <typename A, typename R>
-typename A::pint_t DwarfInstructions<A, R>::getCFA(A&, const PrologInfo &prolog,
-                                             const Registers_arm64 &registers) {
-  if (prolog.cfaRegister != 0)
-    return registers.getRegister(prolog.cfaRegister) + prolog.cfaRegisterOffset;
-  else
-    _LIBUNWIND_ABORT("getCFA(): unsupported location for arm64 cfa");
-}
 
 
 } // namespace libunwind
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/DwarfParser.hpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/DwarfParser.hpp
index 152baab..2ba0c9c 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/DwarfParser.hpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/DwarfParser.hpp
@@ -49,6 +49,7 @@
     int       dataAlignFactor;
     bool      isSignalFrame;
     bool      fdesHaveAugmentationData;
+    uint8_t   returnAddressRegister;
   };
 
   /// Information about an FDE (Frame Description Entry)
@@ -149,7 +150,7 @@
   if (cieInfo->fdesHaveAugmentationData) {
     pint_t augLen = (pint_t)addressSpace.getULEB128(p, nextCFI);
     pint_t endOfAug = p + augLen;
-    if (cieInfo->lsdaEncoding != 0) {
+    if (cieInfo->lsdaEncoding != DW_EH_PE_omit) {
       // peek at value (without indirection).  Zero means no lsda
       pint_t lsdaStart = p;
       if (addressSpace.getEncodedP(p, nextCFI, cieInfo->lsdaEncoding & 0x0F) !=
@@ -216,7 +217,7 @@
             if (cieInfo->fdesHaveAugmentationData) {
               pint_t augLen = (pint_t)addressSpace.getULEB128(p, nextCFI);
               pint_t endOfAug = p + augLen;
-              if (cieInfo->lsdaEncoding != 0) {
+              if (cieInfo->lsdaEncoding != DW_EH_PE_omit) {
                 // peek at value (without indirection).  Zero means no lsda
                 pint_t lsdaStart = p;
                 if (addressSpace.getEncodedP(
@@ -255,7 +256,7 @@
 const char *CFI_Parser<A>::parseCIE(A &addressSpace, pint_t cie,
                                     CIE_Info *cieInfo) {
   cieInfo->pointerEncoding = 0;
-  cieInfo->lsdaEncoding = 0;
+  cieInfo->lsdaEncoding = DW_EH_PE_omit;
   cieInfo->personalityEncoding = 0;
   cieInfo->personalityOffsetInCIE = 0;
   cieInfo->personality = 0;
@@ -295,7 +296,9 @@
   // parse data alignment factor
   cieInfo->dataAlignFactor = (int)addressSpace.getSLEB128(p, cieContentEnd);
   // parse return address register
-  addressSpace.getULEB128(p, cieContentEnd);
+  uint64_t raReg = addressSpace.getULEB128(p, cieContentEnd);
+  assert(raReg < 255 && "return address register too large");
+  cieInfo->returnAddressRegister = (uint8_t)raReg;
   // parse augmentation data based on augmentation string
   const char *result = NULL;
   if (addressSpace.get8(strStart) == 'z') {
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/Registers.hpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/Registers.hpp
index a0050dd..8c1acfc 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/Registers.hpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/Registers.hpp
@@ -15,6 +15,7 @@
 
 #include <stdint.h>
 #include <strings.h>
+#include <string.h>
 
 #include "libunwind.h"
 #include "config.h"
@@ -43,6 +44,7 @@
   void        setVectorRegister(int num, v128 value);
   const char *getRegisterName(int num);
   void        jumpto();
+  static int  lastDwarfRegNum() { return 8; }
 
   uint32_t  getSP() const          { return _registers.__esp; }
   void      setSP(uint32_t value)  { _registers.__esp = value; }
@@ -91,7 +93,7 @@
 }
 
 inline Registers_x86::Registers_x86() {
-  bzero(&_registers, sizeof(_registers));
+  memset(&_registers, 0, sizeof(_registers));
 }
 
 inline bool Registers_x86::validRegister(int regNum) const {
@@ -230,6 +232,7 @@
   void        setVectorRegister(int num, v128 value);
   const char *getRegisterName(int num);
   void        jumpto();
+  static int  lastDwarfRegNum() { return 16; }
 
   uint64_t  getSP() const          { return _registers.__rsp; }
   void      setSP(uint64_t value)  { _registers.__rsp = value; }
@@ -282,7 +285,7 @@
 }
 
 inline Registers_x86_64::Registers_x86_64() {
-  bzero(&_registers, sizeof(_registers));
+  memset(&_registers, 0, sizeof(_registers));
 }
 
 inline bool Registers_x86_64::validRegister(int regNum) const {
@@ -477,6 +480,7 @@
   void        setVectorRegister(int num, v128 value);
   const char *getRegisterName(int num);
   void        jumpto();
+  static int  lastDwarfRegNum() { return 112; }
 
   uint64_t  getSP() const         { return _registers.__r1; }
   void      setSP(uint32_t value) { _registers.__r1 = value; }
@@ -548,9 +552,9 @@
 }
 
 inline Registers_ppc::Registers_ppc() {
-  bzero(&_registers, sizeof(_registers));
-  bzero(&_floatRegisters, sizeof(_floatRegisters));
-  bzero(&_vectorRegisters, sizeof(_vectorRegisters));
+  memset(&_registers, 0, sizeof(_registers));
+  memset(&_floatRegisters, 0, sizeof(_floatRegisters));
+  memset(&_vectorRegisters, 0, sizeof(_vectorRegisters));
 }
 
 inline bool Registers_ppc::validRegister(int regNum) const {
@@ -1030,6 +1034,7 @@
   void        setVectorRegister(int num, v128 value);
   const char *getRegisterName(int num);
   void        jumpto();
+  static int  lastDwarfRegNum() { return 95; }
 
   uint64_t  getSP() const         { return _registers.__sp; }
   void      setSP(uint64_t value) { _registers.__sp = value; }
@@ -1065,8 +1070,8 @@
 }
 
 inline Registers_arm64::Registers_arm64() {
-  bzero(&_registers, sizeof(_registers));
-  bzero(&_registers, sizeof(_vectorHalfRegisters));
+  memset(&_registers, 0, sizeof(_registers));
+  memset(&_vectorHalfRegisters, 0, sizeof(_vectorHalfRegisters));
 }
 
 inline bool Registers_arm64::validRegister(int regNum) const {
@@ -1273,6 +1278,428 @@
   _LIBUNWIND_ABORT("no arm64 vector register support yet");
 }
 
+/// Registers_arm holds the register state of a thread in a 32-bit arm
+/// process.
+///
+/// NOTE: Assumes VFPv3. On ARM processors without a floating point unit,
+/// this uses more memory than required.
+class _LIBUNWIND_HIDDEN Registers_arm {
+public:
+  Registers_arm();
+  Registers_arm(const void *registers);
+
+  bool        validRegister(int num) const;
+  uint32_t    getRegister(int num);
+  void        setRegister(int num, uint32_t value);
+  bool        validFloatRegister(int num) const;
+  unw_fpreg_t getFloatRegister(int num);
+  void        setFloatRegister(int num, unw_fpreg_t value);
+  bool        validVectorRegister(int num) const;
+  v128        getVectorRegister(int num) const;
+  void        setVectorRegister(int num, v128 value);
+  const char *getRegisterName(int num);
+  void        jumpto() {
+    restoreSavedFloatRegisters();
+    restoreCoreAndJumpTo();
+  }
+
+  uint32_t  getSP() const         { return _registers.__sp; }
+  void      setSP(uint32_t value) { _registers.__sp = value; }
+  uint32_t  getIP() const         { return _registers.__pc; }
+  void      setIP(uint32_t value) { _registers.__pc = value; }
+
+  void saveVFPAsX() {
+    assert(_use_X_for_vfp_save || !_saved_vfp_d0_d15);
+    _use_X_for_vfp_save = true;
+  }
+
+  void restoreSavedFloatRegisters() {
+    if (_saved_vfp_d0_d15) {
+      if (_use_X_for_vfp_save)
+        restoreVFPWithFLDMX(_vfp_d0_d15_pad);
+      else
+        restoreVFPWithFLDMD(_vfp_d0_d15_pad);
+    }
+    if (_saved_vfp_d16_d31)
+      restoreVFPv3(_vfp_d16_d31);
+    if (_saved_iwmmx)
+      restoreiWMMX(_iwmmx);
+    if (_saved_iwmmx_control)
+      restoreiWMMXControl(_iwmmx_control);
+  }
+
+private:
+  struct GPRs {
+    uint32_t __r[13]; // r0-r12
+    uint32_t __sp;    // Stack pointer r13
+    uint32_t __lr;    // Link register r14
+    uint32_t __pc;    // Program counter r15
+  };
+
+  static void saveVFPWithFSTMD(unw_fpreg_t*);
+  static void saveVFPWithFSTMX(unw_fpreg_t*);
+  static void saveVFPv3(unw_fpreg_t*);
+  static void saveiWMMX(unw_fpreg_t*);
+  static void saveiWMMXControl(uint32_t*);
+  static void restoreVFPWithFLDMD(unw_fpreg_t*);
+  static void restoreVFPWithFLDMX(unw_fpreg_t*);
+  static void restoreVFPv3(unw_fpreg_t*);
+  static void restoreiWMMX(unw_fpreg_t*);
+  static void restoreiWMMXControl(uint32_t*);
+  void restoreCoreAndJumpTo();
+
+  // ARM registers
+  GPRs _registers;
+
+  // We save floating point registers lazily because we can't know ahead of
+  // time which ones are used. See EHABI #4.7.
+
+  // Whether D0-D15 are saved in the FTSMX instead of FSTMD format.
+  //
+  // See EHABI #7.5 that explains how matching instruction sequences for load
+  // and store need to be used to correctly restore the exact register bits.
+  bool _use_X_for_vfp_save;
+  // Whether VFP D0-D15 are saved.
+  bool _saved_vfp_d0_d15;
+  // Whether VFPv3 D16-D31 are saved.
+  bool _saved_vfp_d16_d31;
+  // Whether iWMMX data registers are saved.
+  bool _saved_iwmmx;
+  // Whether iWMMX control registers are saved.
+  bool _saved_iwmmx_control;
+  // VFP registers D0-D15, + padding if saved using FSTMX
+  unw_fpreg_t _vfp_d0_d15_pad[17];
+  // VFPv3 registers D16-D31, always saved using FSTMD
+  unw_fpreg_t _vfp_d16_d31[16];
+  // iWMMX registers
+  unw_fpreg_t _iwmmx[16];
+  // iWMMX control registers
+  uint32_t _iwmmx_control[4];
+};
+
+inline Registers_arm::Registers_arm(const void *registers)
+  : _use_X_for_vfp_save(false),
+    _saved_vfp_d0_d15(false),
+    _saved_vfp_d16_d31(false),
+    _saved_iwmmx(false),
+    _saved_iwmmx_control(false) {
+  static_assert(sizeof(Registers_arm) < sizeof(unw_context_t),
+                    "arm registers do not fit into unw_context_t");
+  // See unw_getcontext() note about data.
+  memcpy(&_registers, registers, sizeof(_registers));
+  memset(&_vfp_d0_d15_pad, 0, sizeof(_vfp_d0_d15_pad));
+  memset(&_vfp_d16_d31, 0, sizeof(_vfp_d16_d31));
+  memset(&_iwmmx, 0, sizeof(_iwmmx));
+  memset(&_iwmmx_control, 0, sizeof(_iwmmx_control));
+}
+
+inline Registers_arm::Registers_arm()
+  : _use_X_for_vfp_save(false),
+    _saved_vfp_d0_d15(false),
+    _saved_vfp_d16_d31(false),
+    _saved_iwmmx(false),
+    _saved_iwmmx_control(false) {
+  memset(&_registers, 0, sizeof(_registers));
+  memset(&_vfp_d0_d15_pad, 0, sizeof(_vfp_d0_d15_pad));
+  memset(&_vfp_d16_d31, 0, sizeof(_vfp_d16_d31));
+  memset(&_iwmmx, 0, sizeof(_iwmmx));
+  memset(&_iwmmx_control, 0, sizeof(_iwmmx_control));
+}
+
+inline bool Registers_arm::validRegister(int regNum) const {
+  // Returns true for all non-VFP registers supported by the EHABI
+  // virtual register set (VRS).
+  if (regNum == UNW_REG_IP)
+    return true;
+  if (regNum == UNW_REG_SP)
+    return true;
+  if (regNum >= UNW_ARM_R0 && regNum <= UNW_ARM_R15)
+    return true;
+  if (regNum >= UNW_ARM_WC0 && regNum <= UNW_ARM_WC3)
+    return true;
+  return false;
+}
+
+inline uint32_t Registers_arm::getRegister(int regNum) {
+  if (regNum == UNW_REG_SP || regNum == UNW_ARM_SP)
+    return _registers.__sp;
+  if (regNum == UNW_ARM_LR)
+    return _registers.__lr;
+  if (regNum == UNW_REG_IP || regNum == UNW_ARM_IP)
+    return _registers.__pc;
+  if (regNum >= UNW_ARM_R0 && regNum <= UNW_ARM_R12)
+    return _registers.__r[regNum];
+  if (regNum >= UNW_ARM_WC0 && regNum <= UNW_ARM_WC3) {
+    if (!_saved_iwmmx_control) {
+      _saved_iwmmx_control = true;
+      saveiWMMXControl(_iwmmx_control);
+    }
+    return _iwmmx_control[regNum - UNW_ARM_WC0];
+  }
+  _LIBUNWIND_ABORT("unsupported arm register");
+}
+
+inline void Registers_arm::setRegister(int regNum, uint32_t value) {
+  if (regNum == UNW_REG_SP || regNum == UNW_ARM_SP)
+    _registers.__sp = value;
+  else if (regNum == UNW_ARM_LR)
+    _registers.__lr = value;
+  else if (regNum == UNW_REG_IP || regNum == UNW_ARM_IP)
+    _registers.__pc = value;
+  else if (regNum >= UNW_ARM_R0 && regNum <= UNW_ARM_R12)
+    _registers.__r[regNum] = value;
+  else if (regNum >= UNW_ARM_WC0 && regNum <= UNW_ARM_WC3) {
+    if (!_saved_iwmmx_control) {
+      _saved_iwmmx_control = true;
+      saveiWMMXControl(_iwmmx_control);
+    }
+    _iwmmx_control[regNum - UNW_ARM_WC0] = value;
+  } else
+    _LIBUNWIND_ABORT("unsupported arm register");
+}
+
+inline const char *Registers_arm::getRegisterName(int regNum) {
+  switch (regNum) {
+  case UNW_REG_IP:
+  case UNW_ARM_IP: // UNW_ARM_R15 is alias
+    return "pc";
+  case UNW_ARM_LR: // UNW_ARM_R14 is alias
+    return "lr";
+  case UNW_REG_SP:
+  case UNW_ARM_SP: // UNW_ARM_R13 is alias
+    return "sp";
+  case UNW_ARM_R0:
+    return "r0";
+  case UNW_ARM_R1:
+    return "r1";
+  case UNW_ARM_R2:
+    return "r2";
+  case UNW_ARM_R3:
+    return "r3";
+  case UNW_ARM_R4:
+    return "r4";
+  case UNW_ARM_R5:
+    return "r5";
+  case UNW_ARM_R6:
+    return "r6";
+  case UNW_ARM_R7:
+    return "r7";
+  case UNW_ARM_R8:
+    return "r8";
+  case UNW_ARM_R9:
+    return "r9";
+  case UNW_ARM_R10:
+    return "r10";
+  case UNW_ARM_R11:
+    return "r11";
+  case UNW_ARM_R12:
+    return "r12";
+  case UNW_ARM_S0:
+    return "s0";
+  case UNW_ARM_S1:
+    return "s1";
+  case UNW_ARM_S2:
+    return "s2";
+  case UNW_ARM_S3:
+    return "s3";
+  case UNW_ARM_S4:
+    return "s4";
+  case UNW_ARM_S5:
+    return "s5";
+  case UNW_ARM_S6:
+    return "s6";
+  case UNW_ARM_S7:
+    return "s7";
+  case UNW_ARM_S8:
+    return "s8";
+  case UNW_ARM_S9:
+    return "s9";
+  case UNW_ARM_S10:
+    return "s10";
+  case UNW_ARM_S11:
+    return "s11";
+  case UNW_ARM_S12:
+    return "s12";
+  case UNW_ARM_S13:
+    return "s13";
+  case UNW_ARM_S14:
+    return "s14";
+  case UNW_ARM_S15:
+    return "s15";
+  case UNW_ARM_S16:
+    return "s16";
+  case UNW_ARM_S17:
+    return "s17";
+  case UNW_ARM_S18:
+    return "s18";
+  case UNW_ARM_S19:
+    return "s19";
+  case UNW_ARM_S20:
+    return "s20";
+  case UNW_ARM_S21:
+    return "s21";
+  case UNW_ARM_S22:
+    return "s22";
+  case UNW_ARM_S23:
+    return "s23";
+  case UNW_ARM_S24:
+    return "s24";
+  case UNW_ARM_S25:
+    return "s25";
+  case UNW_ARM_S26:
+    return "s26";
+  case UNW_ARM_S27:
+    return "s27";
+  case UNW_ARM_S28:
+    return "s28";
+  case UNW_ARM_S29:
+    return "s29";
+  case UNW_ARM_S30:
+    return "s30";
+  case UNW_ARM_S31:
+    return "s31";
+  case UNW_ARM_D0:
+    return "d0";
+  case UNW_ARM_D1:
+    return "d1";
+  case UNW_ARM_D2:
+    return "d2";
+  case UNW_ARM_D3:
+    return "d3";
+  case UNW_ARM_D4:
+    return "d4";
+  case UNW_ARM_D5:
+    return "d5";
+  case UNW_ARM_D6:
+    return "d6";
+  case UNW_ARM_D7:
+    return "d7";
+  case UNW_ARM_D8:
+    return "d8";
+  case UNW_ARM_D9:
+    return "d9";
+  case UNW_ARM_D10:
+    return "d10";
+  case UNW_ARM_D11:
+    return "d11";
+  case UNW_ARM_D12:
+    return "d12";
+  case UNW_ARM_D13:
+    return "d13";
+  case UNW_ARM_D14:
+    return "d14";
+  case UNW_ARM_D15:
+    return "d15";
+  case UNW_ARM_D16:
+    return "d16";
+  case UNW_ARM_D17:
+    return "d17";
+  case UNW_ARM_D18:
+    return "d18";
+  case UNW_ARM_D19:
+    return "d19";
+  case UNW_ARM_D20:
+    return "d20";
+  case UNW_ARM_D21:
+    return "d21";
+  case UNW_ARM_D22:
+    return "d22";
+  case UNW_ARM_D23:
+    return "d23";
+  case UNW_ARM_D24:
+    return "d24";
+  case UNW_ARM_D25:
+    return "d25";
+  case UNW_ARM_D26:
+    return "d26";
+  case UNW_ARM_D27:
+    return "d27";
+  case UNW_ARM_D28:
+    return "d28";
+  case UNW_ARM_D29:
+    return "d29";
+  case UNW_ARM_D30:
+    return "d30";
+  case UNW_ARM_D31:
+    return "d31";
+  default:
+    return "unknown register";
+  }
+}
+
+inline bool Registers_arm::validFloatRegister(int regNum) const {
+  // NOTE: Consider the intel MMX registers floating points so the
+  // unw_get_fpreg can be used to transmit the 64-bit data back.
+  return ((regNum >= UNW_ARM_D0) && (regNum <= UNW_ARM_D31))
+      || ((regNum >= UNW_ARM_WR0) && (regNum <= UNW_ARM_WR15));
+}
+
+inline unw_fpreg_t Registers_arm::getFloatRegister(int regNum) {
+  if (regNum >= UNW_ARM_D0 && regNum <= UNW_ARM_D15) {
+    if (!_saved_vfp_d0_d15) {
+      _saved_vfp_d0_d15 = true;
+      if (_use_X_for_vfp_save)
+        saveVFPWithFSTMX(_vfp_d0_d15_pad);
+      else
+        saveVFPWithFSTMD(_vfp_d0_d15_pad);
+    }
+    return _vfp_d0_d15_pad[regNum - UNW_ARM_D0];
+  } else if (regNum >= UNW_ARM_D16 && regNum <= UNW_ARM_D31) {
+    if (!_saved_vfp_d16_d31) {
+      _saved_vfp_d16_d31 = true;
+      saveVFPv3(_vfp_d16_d31);
+    }
+    return _vfp_d16_d31[regNum - UNW_ARM_D16];
+  } else if (regNum >= UNW_ARM_WR0 && regNum <= UNW_ARM_WR15) {
+    if (!_saved_iwmmx) {
+      _saved_iwmmx = true;
+      saveiWMMX(_iwmmx);
+    }
+    return _iwmmx[regNum - UNW_ARM_WR0];
+  } else {
+    _LIBUNWIND_ABORT("Unknown ARM float register");
+  }
+}
+
+inline void Registers_arm::setFloatRegister(int regNum, unw_fpreg_t value) {
+  if (regNum >= UNW_ARM_D0 && regNum <= UNW_ARM_D15) {
+    if (!_saved_vfp_d0_d15) {
+      _saved_vfp_d0_d15 = true;
+      if (_use_X_for_vfp_save)
+        saveVFPWithFSTMX(_vfp_d0_d15_pad);
+      else
+        saveVFPWithFSTMD(_vfp_d0_d15_pad);
+    }
+    _vfp_d0_d15_pad[regNum - UNW_ARM_D0] = value;
+  } else if (regNum >= UNW_ARM_D16 && regNum <= UNW_ARM_D31) {
+    if (!_saved_vfp_d16_d31) {
+      _saved_vfp_d16_d31 = true;
+      saveVFPv3(_vfp_d16_d31);
+    }
+    _vfp_d16_d31[regNum - UNW_ARM_D0] = value;
+  } else if (regNum >= UNW_ARM_WR0 && regNum <= UNW_ARM_WR15) {
+    if (!_saved_iwmmx) {
+      _saved_iwmmx = true;
+      saveiWMMX(_iwmmx);
+    }
+    _iwmmx[regNum - UNW_ARM_WR0] = value;
+  } else {
+    _LIBUNWIND_ABORT("Unknown ARM float register");
+  }
+}
+
+inline bool Registers_arm::validVectorRegister(int) const {
+  return false;
+}
+
+inline v128 Registers_arm::getVectorRegister(int) const {
+  _LIBUNWIND_ABORT("ARM vector support not implemented");
+}
+
+inline void Registers_arm::setVectorRegister(int, v128) {
+  _LIBUNWIND_ABORT("ARM vector support not implemented");
+}
+
 } // namespace libunwind
 
 #endif // __REGISTERS_HPP__
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/Unwind-arm.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/Unwind-arm.cpp
new file mode 100644
index 0000000..83ce7f9
--- /dev/null
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/Unwind-arm.cpp
@@ -0,0 +1,385 @@
+//===--------------------------- Unwind-arm.c ----------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//
+//  Implements ARM zero-cost C++ exceptions
+//
+//===----------------------------------------------------------------------===//
+
+#include <unwind.h>
+
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "config.h"
+#include "libunwind.h"
+#include "../private_typeinfo.h"
+
+
+#if LIBCXXABI_ARM_EHABI
+namespace {
+
+// Strange order: take words in order, but inside word, take from most to least
+// signinficant byte.
+uint8_t getByte(uint32_t* data, size_t offset) {
+  uint8_t* byteData = reinterpret_cast<uint8_t*>(data);
+  return byteData[(offset & ~0x03) + (3 - (offset&0x03))];
+}
+
+const char* getNextWord(const char* data, uint32_t* out) {
+  *out = *reinterpret_cast<const uint32_t*>(data);
+  return data + 4;
+}
+
+const char* getNextNibble(const char* data, uint32_t* out) {
+  *out = *reinterpret_cast<const uint16_t*>(data);
+  return data + 2;
+}
+
+static inline uint32_t signExtendPrel31(uint32_t data) {
+  return data | ((data & 0x40000000u) << 1);
+}
+
+struct Descriptor {
+   // See # 9.2
+   typedef enum {
+     SU16 = 0, // Short descriptor, 16-bit entries
+     LU16 = 1, // Long descriptor,  16-bit entries
+     LU32 = 3, // Long descriptor,  32-bit entries
+     RESERVED0 =  4, RESERVED1 =  5, RESERVED2  = 6,  RESERVED3  =  7,
+     RESERVED4 =  8, RESERVED5 =  9, RESERVED6  = 10, RESERVED7  = 11,
+     RESERVED8 = 12, RESERVED9 = 13, RESERVED10 = 14, RESERVED11 = 15
+   } Format;
+
+   // See # 9.2
+   typedef enum {
+     CLEANUP = 0x0,
+     FUNC    = 0x1,
+     CATCH   = 0x2,
+     INVALID = 0x4
+   } Kind;
+};
+
+_Unwind_Reason_Code ProcessDescriptors(
+    _Unwind_State state,
+    _Unwind_Control_Block* ucbp,
+    struct _Unwind_Context* context,
+    Descriptor::Format format,
+    const char* descriptorStart,
+    int flags) {
+  // EHT is inlined in the index using compact form. No descriptors. #5
+  if (flags & 0x1)
+    return _URC_CONTINUE_UNWIND;
+
+  const char* descriptor = descriptorStart;
+  uint32_t descriptorWord;
+  getNextWord(descriptor, &descriptorWord);
+  while (descriptorWord) {
+    // Read descriptor based on # 9.2.
+    uint32_t length;
+    uint32_t offset;
+    switch (format) {
+      case Descriptor::LU32:
+        descriptor = getNextWord(descriptor, &length);
+        descriptor = getNextWord(descriptor, &offset);
+      case Descriptor::LU16:
+        descriptor = getNextNibble(descriptor, &length);
+        descriptor = getNextNibble(descriptor, &offset);
+      default:
+        assert(false);
+        return _URC_FAILURE;
+    }
+
+    // See # 9.2 table for decoding the kind of descriptor. It's a 2-bit value.
+    Descriptor::Kind kind = static_cast<Descriptor::Kind>((length & 0x1) | ((offset & 0x1) << 1));
+
+    // Clear off flag from last bit.
+    length &= ~1;
+    offset &= ~1;
+    uintptr_t scopeStart = ucbp->pr_cache.fnstart + offset;
+    uintptr_t scopeEnd = scopeStart + length;
+    uintptr_t pc = _Unwind_GetIP(context);
+    bool isInScope = (scopeStart <= pc) && (pc < scopeEnd);
+
+    switch (kind) {
+      case Descriptor::CLEANUP: {
+        // TODO(ajwong): Handle cleanup descriptors.
+        break;
+      }
+      case Descriptor::FUNC: {
+        // TODO(ajwong): Handle function descriptors.
+        break;
+      }
+      case Descriptor::CATCH: {
+        // Catch descriptors require gobbling one more word.
+        uint32_t landing_pad;
+        descriptor = getNextWord(descriptor, &landing_pad);
+
+        if (isInScope) {
+          // TODO(ajwong): This is only phase1 compatible logic. Implement
+          // phase2.
+          bool is_reference_type = landing_pad & 0x80000000;
+          landing_pad = signExtendPrel31(landing_pad & ~0x80000000);
+          if (landing_pad == 0xffffffff) {
+            return _URC_HANDLER_FOUND;
+          } else if (landing_pad == 0xfffffffe ) {
+            return _URC_FAILURE;
+          } else {
+            void* matched_object;
+            /*
+            if (__cxxabiv1::__cxa_type_match(ucbp,
+                                             reinterpret_cast<const std::type_info*>(landing_pad),
+                                             is_reference_type, &matched_object) != __cxxabiv1::ctm_failed)
+                return _URC_HANDLER_FOUND;
+                */
+            _LIBUNWIND_ABORT("Type matching not implemented");
+          }
+        }
+        break;
+      }
+      default:
+        _LIBUNWIND_ABORT("Invalid descriptor kind found.");
+    };
+
+    getNextWord(descriptor, &descriptorWord);
+  }
+
+  return _URC_CONTINUE_UNWIND;
+}
+
+_Unwind_Reason_Code unwindOneFrame(
+    _Unwind_State state,
+    _Unwind_Control_Block* ucbp,
+    struct _Unwind_Context* context) {
+  // Read the compact model EHT entry's header # 6.3
+  uint32_t* unwindingData = ucbp->pr_cache.ehtp;
+  uint32_t unwindInfo = *unwindingData;
+  assert((unwindInfo & 0xf0000000) == 0x80000000 && "Must be a compact entry");
+  Descriptor::Format format = static_cast<Descriptor::Format>((unwindInfo & 0x0f000000) >> 24);
+  size_t len = 0;
+  size_t startOffset = 0;
+  switch (format) {
+    case Descriptor::SU16:
+      len = 4;
+      startOffset = 1;
+      break;
+    case Descriptor::LU16:
+    case Descriptor::LU32:
+      len = 4 + 4 * ((unwindInfo & 0x00ff0000) >> 16);
+      startOffset = 2;
+      break;
+    default:
+      return _URC_FAILURE;
+  }
+
+  // Handle descriptors before unwinding so they are processed in the context
+  // of the correct stack frame.
+  _Unwind_Reason_Code result =
+      ProcessDescriptors(
+          state, ucbp, context, format,
+          reinterpret_cast<const char*>(ucbp->pr_cache.ehtp) + len,
+          ucbp->pr_cache.additional);
+
+  if (result != _URC_CONTINUE_UNWIND)
+    return result;
+
+  return _Unwind_VRS_Interpret(context, unwindingData, startOffset, len);
+}
+
+// Generates mask discriminator for _Unwind_VRS_Pop, e.g. for _UVRSC_CORE /
+// _UVRSD_UINT32.
+uint32_t RegisterMask(uint8_t start, uint8_t count_minus_one) {
+  return ((1U << (count_minus_one + 1)) - 1) << start;
+}
+
+// Generates mask discriminator for _Unwind_VRS_Pop, e.g. for _UVRSC_VFP /
+// _UVRSD_DOUBLE.
+uint32_t RegisterRange(uint8_t start, uint8_t count_minus_one) {
+  return (start << 16) | (count_minus_one + 1);
+}
+
+} // end anonymous namespace
+
+extern "C" _Unwind_Reason_Code _Unwind_VRS_Interpret(
+    _Unwind_Context* context,
+    uint32_t* data,
+    size_t offset,
+    size_t len) {
+  bool wrotePC = false;
+  bool finish = false;
+  while (offset < len && !finish) {
+    uint8_t byte = getByte(data, offset++);
+    if ((byte & 0x80) == 0) {
+      uint32_t sp;
+      _Unwind_VRS_Get(context, _UVRSC_CORE, UNW_ARM_SP, _UVRSD_UINT32, &sp);
+      if (byte & 0x40)
+        sp -= ((byte & 0x3f) << 2) + 4;
+      else
+        sp += (byte << 2) + 4;
+      _Unwind_VRS_Set(context, _UVRSC_CORE, UNW_ARM_SP, _UVRSD_UINT32, &sp);
+    } else {
+      switch (byte & 0xf0) {
+        case 0x80: {
+          if (offset >= len)
+            return _URC_FAILURE;
+          uint16_t registers = ((byte & 0x0f) << 12) | (getByte(data, offset++) << 4);
+          if (!registers)
+            return _URC_FAILURE;
+          if (registers & (1<<15))
+            wrotePC = true;
+          _Unwind_VRS_Pop(context, _UVRSC_CORE, registers, _UVRSD_UINT32);
+          break;
+        }
+        case 0x90: {
+          uint8_t reg = byte & 0x0f;
+          if (reg == 13 || reg == 15)
+            return _URC_FAILURE;
+          uint32_t sp;
+          _Unwind_VRS_Get(context, _UVRSC_CORE, UNW_ARM_R0 + reg,
+                          _UVRSD_UINT32, &sp);
+          _Unwind_VRS_Set(context, _UVRSC_CORE, UNW_ARM_SP, _UVRSD_UINT32,
+                          &sp);
+          break;
+        }
+        case 0xa0: {
+          uint32_t registers = RegisterMask(4, byte & 0x07);
+          if (byte & 0x08)
+            registers |= 1<<14;
+          _Unwind_VRS_Pop(context, _UVRSC_CORE, registers, _UVRSD_UINT32);
+          break;
+        }
+        case 0xb0: {
+          switch (byte) {
+            case 0xb0:
+              finish = true;
+              break;
+            case 0xb1: {
+              if (offset >= len)
+                return _URC_FAILURE;
+              uint8_t registers = getByte(data, offset++);
+              if (registers & 0xf0 || !registers)
+                return _URC_FAILURE;
+              _Unwind_VRS_Pop(context, _UVRSC_CORE, registers, _UVRSD_UINT32);
+              break;
+            }
+            case 0xb2: {
+              uint32_t addend = 0;
+              uint32_t shift = 0;
+              // This decodes a uleb128 value.
+              while (true) {
+                if (offset >= len)
+                  return _URC_FAILURE;
+                uint32_t v = getByte(data, offset++);
+                addend |= (v & 0x7f) << shift;
+                if ((v & 0x80) == 0)
+                  break;
+                shift += 7;
+              }
+              uint32_t sp;
+              _Unwind_VRS_Get(context, _UVRSC_CORE, UNW_ARM_SP, _UVRSD_UINT32, &sp);
+              sp += 0x204 + (addend << 2);
+              _Unwind_VRS_Set(context, _UVRSC_CORE, UNW_ARM_SP, _UVRSD_UINT32, &sp);
+              break;
+            }
+            case 0xb3: {
+              uint8_t v = getByte(data, offset++);
+              _Unwind_VRS_Pop(context, _UVRSC_VFP, RegisterRange(v >> 4, v & 0x0f), _UVRSD_VFPX);
+              break;
+            }
+            case 0xb4:
+            case 0xb5:
+            case 0xb6:
+            case 0xb7:
+              return _URC_FAILURE;
+            default:
+              _Unwind_VRS_Pop(context, _UVRSC_VFP, RegisterRange(8, byte & 0x07), _UVRSD_VFPX);
+              break;
+          }
+          break;
+        }
+        case 0xc0: {
+          switch (byte) {
+            case 0xc0:
+            case 0xc1:
+            case 0xc2:
+            case 0xc3:
+            case 0xc4:
+            case 0xc5:
+              _Unwind_VRS_Pop(context, _UVRSC_WMMXD, RegisterRange(10, byte & 0x7), _UVRSD_DOUBLE);
+              break;
+            case 0xc6: {
+              uint8_t v = getByte(data, offset++);
+              uint8_t start = v >> 4;
+              uint8_t count_minus_one = v & 0xf;
+              if (start + count_minus_one >= 16)
+                return _URC_FAILURE;
+              _Unwind_VRS_Pop(context, _UVRSC_WMMXD, RegisterRange(start, count_minus_one), _UVRSD_DOUBLE);
+              break;
+            }
+            case 0xc7: {
+              uint8_t v = getByte(data, offset++);
+              if (!v || v & 0xf0)
+                return _URC_FAILURE;
+              _Unwind_VRS_Pop(context, _UVRSC_WMMXC, v, _UVRSD_DOUBLE);
+              break;
+            }
+            case 0xc8:
+            case 0xc9: {
+              uint8_t v = getByte(data, offset++);
+              uint8_t start = ((byte == 0xc8) ? 16 : 0) + (v >> 4);
+              uint8_t count_minus_one = v & 0xf;
+              if (start + count_minus_one >= 32)
+                return _URC_FAILURE;
+              _Unwind_VRS_Pop(context, _UVRSC_VFP, RegisterRange(start, count_minus_one), _UVRSD_DOUBLE);
+              break;
+            }
+            default:
+              return _URC_FAILURE;
+          }
+          break;
+        }
+        case 0xd0: {
+          if (byte & 0x08)
+            return _URC_FAILURE;
+          _Unwind_VRS_Pop(context, _UVRSC_VFP, RegisterRange(8, byte & 0x7), _UVRSD_DOUBLE);
+          break;
+        }
+        default:
+          return _URC_FAILURE;
+      }
+    }
+  }
+  if (!wrotePC) {
+    uint32_t lr;
+    _Unwind_VRS_Get(context, _UVRSC_CORE, UNW_ARM_LR, _UVRSD_UINT32, &lr);
+    _Unwind_VRS_Set(context, _UVRSC_CORE, UNW_ARM_IP, _UVRSD_UINT32, &lr);
+  }
+  return _URC_CONTINUE_UNWIND;
+}
+
+extern "C" _Unwind_Reason_Code __aeabi_unwind_cpp_pr0(
+    _Unwind_State state,
+    _Unwind_Control_Block *ucbp,
+    _Unwind_Context *context) {
+  return unwindOneFrame(state, ucbp, context);
+}
+
+extern "C" _Unwind_Reason_Code __aeabi_unwind_cpp_pr1(
+    _Unwind_State state,
+    _Unwind_Control_Block *ucbp,
+    _Unwind_Context *context) {
+  return unwindOneFrame(state, ucbp, context);
+}
+
+extern "C" _Unwind_Reason_Code __aeabi_unwind_cpp_pr2(
+    _Unwind_State state,
+    _Unwind_Control_Block *ucbp,
+    _Unwind_Context *context) {
+  return unwindOneFrame(state, ucbp, context);
+}
+
+#endif  // LIBCXXABI_ARM_EHABI
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindCursor.hpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindCursor.hpp
index 256a72d..c349086 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindCursor.hpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindCursor.hpp
@@ -12,10 +12,12 @@
 #ifndef __UNWINDCURSOR_HPP__
 #define __UNWINDCURSOR_HPP__
 
+#include <algorithm>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <pthread.h>
+#include <unwind.h>
 
 #if __APPLE__
   #include <mach-o/dyld.h>
@@ -151,10 +153,12 @@
   _LIBUNWIND_LOG_NON_ZERO(::pthread_rwlock_unlock(&_lock));
 }
 
+#if __APPLE__
 template <typename A>
 void DwarfFDECache<A>::dyldUnloadHook(const struct mach_header *mh, intptr_t ) {
   removeAllIn((pint_t) mh);
 }
+#endif
 
 template <typename A>
 void DwarfFDECache<A>::iterateCacheEntries(void (*func)(
@@ -363,12 +367,13 @@
 
 class _LIBUNWIND_HIDDEN AbstractUnwindCursor {
 public:
+  virtual             ~AbstractUnwindCursor() {}
   virtual bool        validReg(int) = 0;
   virtual unw_word_t  getReg(int) = 0;
   virtual void        setReg(int, unw_word_t) = 0;
   virtual bool        validFloatReg(int) = 0;
-  virtual double      getFloatReg(int) = 0;
-  virtual void        setFloatReg(int, double) = 0;
+  virtual unw_fpreg_t getFloatReg(int) = 0;
+  virtual void        setFloatReg(int, unw_fpreg_t) = 0;
   virtual int         step() = 0;
   virtual void        getInfo(unw_proc_info_t *) = 0;
   virtual void        jumpto() = 0;
@@ -376,6 +381,9 @@
   virtual bool        getFunctionName(char *bf, size_t ln, unw_word_t *off) = 0;
   virtual void        setInfoBasedOnIPRegister(bool isReturnAddr = false) = 0;
   virtual const char *getRegisterName(int num) = 0;
+#if __arm__
+  virtual void        saveVFPAsX() = 0;
+#endif
 };
 
 
@@ -392,8 +400,8 @@
   virtual unw_word_t  getReg(int);
   virtual void        setReg(int, unw_word_t);
   virtual bool        validFloatReg(int);
-  virtual double      getFloatReg(int);
-  virtual void        setFloatReg(int, double);
+  virtual unw_fpreg_t getFloatReg(int);
+  virtual void        setFloatReg(int, unw_fpreg_t);
   virtual int         step();
   virtual void        getInfo(unw_proc_info_t *);
   virtual void        jumpto();
@@ -401,11 +409,18 @@
   virtual bool        getFunctionName(char *buf, size_t len, unw_word_t *off);
   virtual void        setInfoBasedOnIPRegister(bool isReturnAddress = false);
   virtual const char *getRegisterName(int num);
+#if __arm__
+  virtual void        saveVFPAsX();
+#endif
 
   void            operator delete(void *, size_t) {}
 
 private:
 
+#if LIBCXXABI_ARM_EHABI
+  bool getInfoFromEHABISection(pint_t pc, const UnwindInfoSections &sects);
+#endif
+
 #if _LIBUNWIND_SUPPORT_DWARF_UNWIND
   bool getInfoFromDwarfSection(pint_t pc, const UnwindInfoSections &sects,
                                             uint32_t fdeSectionOffsetHint=0);
@@ -521,14 +536,13 @@
       _isSignalFrame(false) {
   static_assert(sizeof(UnwindCursor<A, R>) < sizeof(unw_cursor_t),
                 "UnwindCursor<> does not fit in unw_cursor_t");
-
-  bzero(&_info, sizeof(_info));
+  memset(&_info, 0, sizeof(_info));
 }
 
 template <typename A, typename R>
 UnwindCursor<A, R>::UnwindCursor(A &as, void *)
     : _addressSpace(as), _unwindInfoMissing(false), _isSignalFrame(false) {
-  bzero(&_info, sizeof(_info));
+  memset(&_info, 0, sizeof(_info));
   // FIXME
   // fill in _registers from thread arg
 }
@@ -555,12 +569,12 @@
 }
 
 template <typename A, typename R>
-double UnwindCursor<A, R>::getFloatReg(int regNum) {
+unw_fpreg_t UnwindCursor<A, R>::getFloatReg(int regNum) {
   return _registers.getFloatRegister(regNum);
 }
 
 template <typename A, typename R>
-void UnwindCursor<A, R>::setFloatReg(int regNum, double value) {
+void UnwindCursor<A, R>::setFloatReg(int regNum, unw_fpreg_t value) {
   _registers.setFloatRegister(regNum, value);
 }
 
@@ -568,6 +582,12 @@
   _registers.jumpto();
 }
 
+#if __arm__
+template <typename A, typename R> void UnwindCursor<A, R>::saveVFPAsX() {
+  _registers.saveVFPAsX();
+}
+#endif
+
 template <typename A, typename R>
 const char *UnwindCursor<A, R>::getRegisterName(int regNum) {
   return _registers.getRegisterName(regNum);
@@ -577,6 +597,212 @@
   return _isSignalFrame;
 }
 
+#if LIBCXXABI_ARM_EHABI
+struct EHABIIndexEntry {
+  uint32_t functionOffset;
+  uint32_t data;
+};
+
+// Unable to unwind in the ARM index table (section 5 EHABI).
+#define UNW_EXIDX_CANTUNWIND 0x1
+
+static inline uint32_t signExtendPrel31(uint32_t data) {
+  return data | ((data & 0x40000000u) << 1);
+}
+
+extern "C" _Unwind_Reason_Code __aeabi_unwind_cpp_pr0(
+    _Unwind_State state, _Unwind_Control_Block *ucbp, _Unwind_Context *context);
+extern "C" _Unwind_Reason_Code __aeabi_unwind_cpp_pr1(
+    _Unwind_State state, _Unwind_Control_Block *ucbp, _Unwind_Context *context);
+extern "C" _Unwind_Reason_Code __aeabi_unwind_cpp_pr2(
+    _Unwind_State state, _Unwind_Control_Block *ucbp, _Unwind_Context *context);
+
+template<typename A>
+struct EHABISectionIterator {
+  typedef EHABISectionIterator _Self;
+
+  typedef std::random_access_iterator_tag iterator_category;
+  typedef typename A::pint_t value_type;
+  typedef typename A::pint_t* pointer;
+  typedef typename A::pint_t& reference;
+  typedef size_t size_type;
+  typedef size_t difference_type;
+
+  static _Self begin(A& addressSpace, const UnwindInfoSections& sects) {
+    return _Self(addressSpace, sects, 0);
+  }
+  static _Self end(A& addressSpace, const UnwindInfoSections& sects) {
+    return _Self(addressSpace, sects, sects.arm_section_length);
+  }
+
+  EHABISectionIterator(A& addressSpace, const UnwindInfoSections& sects, size_t i)
+      : _addressSpace(&addressSpace), _sects(&sects), _i(i) {}
+
+  _Self& operator++() { ++_i; return *this; }
+  _Self& operator+=(size_t a) { _i += a; return *this; }
+  _Self& operator--() { assert(_i > 0); --_i; return *this; }
+  _Self& operator-=(size_t a) { assert(_i >= a); _i -= a; return *this; }
+
+  _Self operator+(size_t a) { _Self out = *this; out._i += a; return out; }
+  _Self operator-(size_t a) { assert(_i >= a); _Self out = *this; out._i -= a; return out; }
+
+  size_t operator-(const _Self& other) { return _i - other._i; }
+
+  bool operator==(const _Self& other) const {
+    assert(_addressSpace == other._addressSpace);
+    assert(_sects == other._sects);
+    return _i == other._i;
+  }
+
+  typename A::pint_t operator*() const { return functionAddress(); }
+
+  typename A::pint_t functionAddress() const {
+    typename A::pint_t indexAddr = _sects->arm_section + arrayoffsetof(
+        EHABIIndexEntry, _i, functionOffset);
+    return indexAddr + signExtendPrel31(_addressSpace->get32(indexAddr));
+  }
+
+  typename A::pint_t dataAddress() {
+    typename A::pint_t indexAddr = _sects->arm_section + arrayoffsetof(
+        EHABIIndexEntry, _i, data);
+    return indexAddr;
+  }
+
+ private:
+  size_t _i;
+  A* _addressSpace;
+  const UnwindInfoSections* _sects;
+};
+
+template <typename A, typename R>
+bool UnwindCursor<A, R>::getInfoFromEHABISection(
+    pint_t pc,
+    const UnwindInfoSections &sects) {
+  EHABISectionIterator<A> begin =
+      EHABISectionIterator<A>::begin(_addressSpace, sects);
+  EHABISectionIterator<A> end =
+      EHABISectionIterator<A>::end(_addressSpace, sects);
+
+  EHABISectionIterator<A> itNextPC = std::upper_bound(begin, end, pc);
+  if (itNextPC == begin || itNextPC == end)
+    return false;
+  EHABISectionIterator<A> itThisPC = itNextPC - 1;
+
+  pint_t thisPC = itThisPC.functionAddress();
+  pint_t nextPC = itNextPC.functionAddress();
+  pint_t indexDataAddr = itThisPC.dataAddress();
+
+  if (indexDataAddr == 0)
+    return false;
+
+  uint32_t indexData = _addressSpace.get32(indexDataAddr);
+  if (indexData == UNW_EXIDX_CANTUNWIND)
+    return false;
+
+  // If the high bit is set, the exception handling table entry is inline inside
+  // the index table entry on the second word (aka |indexDataAddr|). Otherwise,
+  // the table points at an offset in the exception handling table (section 5 EHABI).
+  pint_t exceptionTableAddr;
+  uint32_t exceptionTableData;
+  bool isSingleWordEHT;
+  if (indexData & 0x80000000) {
+    exceptionTableAddr = indexDataAddr;
+    // TODO(ajwong): Should this data be 0?
+    exceptionTableData = indexData;
+    isSingleWordEHT = true;
+  } else {
+    exceptionTableAddr = indexDataAddr + signExtendPrel31(indexData);
+    exceptionTableData = _addressSpace.get32(exceptionTableAddr);
+    isSingleWordEHT = false;
+  }
+
+  // Now we know the 3 things:
+  //   exceptionTableAddr -- exception handler table entry.
+  //   exceptionTableData -- the data inside the first word of the eht entry.
+  //   isSingleWordEHT -- whether the entry is in the index.
+  unw_word_t personalityRoutine = 0xbadf00d;
+  bool scope32 = false;
+  uintptr_t lsda = 0xbadf00d;
+
+  // If the high bit in the exception handling table entry is set, the entry is
+  // in compact form (section 6.3 EHABI).
+  if (exceptionTableData & 0x80000000) {
+    // Grab the index of the personality routine from the compact form.
+    int choice = (exceptionTableData & 0x0f000000) >> 24;
+    int extraWords = 0;
+    switch (choice) {
+      case 0:
+        personalityRoutine = (unw_word_t) &__aeabi_unwind_cpp_pr0;
+        extraWords = 0;
+        scope32 = false;
+        break;
+      case 1:
+        personalityRoutine = (unw_word_t) &__aeabi_unwind_cpp_pr1;
+        extraWords = (exceptionTableData & 0x00ff0000) >> 16;
+        scope32 = false;
+        break;
+      case 2:
+        personalityRoutine = (unw_word_t) &__aeabi_unwind_cpp_pr2;
+        extraWords = (exceptionTableData & 0x00ff0000) >> 16;
+        scope32 = true;
+        break;
+      default:
+        _LIBUNWIND_ABORT("unknown personality routine");
+        return false;
+    }
+
+    if (isSingleWordEHT) {
+      if (extraWords != 0) {
+        _LIBUNWIND_ABORT("index inlined table detected but pr function "
+                         "requires extra words");
+        return false;
+      }
+    }
+  } else {
+    pint_t personalityAddr =
+        exceptionTableAddr + signExtendPrel31(exceptionTableData);
+    personalityRoutine = personalityAddr;
+
+    // ARM EHABI # 6.2, # 9.2
+    //
+    //  +---- ehtp
+    //  v
+    // +--------------------------------------+
+    // | +--------+--------+--------+-------+ |
+    // | |0| prel31 to personalityRoutine   | |
+    // | +--------+--------+--------+-------+ |
+    // | |      N |      unwind opcodes     | |  <-- UnwindData
+    // | +--------+--------+--------+-------+ |
+    // | | Word 2        unwind opcodes     | |
+    // | +--------+--------+--------+-------+ |
+    // | ...                                  |
+    // | +--------+--------+--------+-------+ |
+    // | | Word N        unwind opcodes     | |
+    // | +--------+--------+--------+-------+ |
+    // | | LSDA                             | |  <-- lsda
+    // | | ...                              | |
+    // | +--------+--------+--------+-------+ |
+    // +--------------------------------------+
+
+    uint32_t *UnwindData = reinterpret_cast<uint32_t*>(exceptionTableAddr) + 1;
+    uint32_t FirstDataWord = *UnwindData;
+    size_t N = ((FirstDataWord >> 24) & 0xff);
+    size_t NDataWords = N + 1;
+    lsda = reinterpret_cast<uintptr_t>(UnwindData + NDataWords);
+  }
+
+  _info.start_ip = thisPC;
+  _info.end_ip = nextPC;
+  _info.handler = personalityRoutine;
+  _info.unwind_info = exceptionTableAddr;
+  _info.lsda = lsda;
+  // flags is pr_cache.additional. See EHABI #7.2 for definition of bit 0.
+  _info.flags = isSingleWordEHT ? 1 : 0 | scope32 ? 0x2 : 0;  // Use enum?
+
+  return true;
+}
+#endif
+
 #if _LIBUNWIND_SUPPORT_DWARF_UNWIND
 template <typename A, typename R>
 bool UnwindCursor<A, R>::getInfoFromDwarfSection(pint_t pc,
@@ -876,8 +1102,9 @@
                             sectionHeader.personalityArrayCount());
       return false;
     }
-    uint32_t personalityDelta = _addressSpace.get32(
-        sects.compact_unwind_section + sectionHeader.personalityArraySectionOffset() +
+    int32_t personalityDelta = (int32_t)_addressSpace.get32(
+        sects.compact_unwind_section +
+        sectionHeader.personalityArraySectionOffset() +
         personalityIndex * sizeof(uint32_t));
     pint_t personalityPointer = sects.dso_base + (pint_t)personalityDelta;
     personality = _addressSpace.getP(personalityPointer);
@@ -909,6 +1136,11 @@
 template <typename A, typename R>
 void UnwindCursor<A, R>::setInfoBasedOnIPRegister(bool isReturnAddress) {
   pint_t pc = (pint_t)this->getReg(UNW_REG_IP);
+#if LIBCXXABI_ARM_EHABI
+  // Remove the thumb bit so the IP represents the actual instruction address.
+  // This matches the behaviour of _Unwind_GetIP on arm.
+  pc &= (pint_t)~0x1;
+#endif
 
   // If the last line of a function is a "throw" the compiler sometimes
   // emits no instructions after the call to __cxa_throw.  This means
@@ -953,6 +1185,12 @@
       }
     }
 #endif
+
+#if LIBCXXABI_ARM_EHABI
+    // If there is ARM EHABI unwind info, look there next.
+    if (sects.arm_section != 0 && this->getInfoFromEHABISection(pc, sects))
+      return;
+#endif
   }
 
 #if _LIBUNWIND_SUPPORT_DWARF_UNWIND
@@ -1022,7 +1260,7 @@
 
 template <typename A, typename R>
 int UnwindCursor<A, R>::step() {
-  // Bottom of stack is defined is when no unwind info cannot be found.
+  // Bottom of stack is defined is when unwind info cannot be found.
   if (_unwindInfoMissing)
     return UNW_STEP_END;
 
@@ -1032,8 +1270,12 @@
   result = this->stepWithCompactEncoding();
 #elif _LIBUNWIND_SUPPORT_DWARF_UNWIND
   result = this->stepWithDwarfFDE();
+#elif LIBCXXABI_ARM_EHABI
+  result = UNW_STEP_SUCCESS;
 #else
-  #error Need _LIBUNWIND_SUPPORT_COMPACT_UNWIND or _LIBUNWIND_SUPPORT_DWARF_UNWIND
+  #error Need _LIBUNWIND_SUPPORT_COMPACT_UNWIND or \
+              _LIBUNWIND_SUPPORT_DWARF_UNWIND or \
+              LIBCXXABI_ARM_EHABI
 #endif
 
   // update info based on new PC
@@ -1041,6 +1283,8 @@
     this->setInfoBasedOnIPRegister(true);
     if (_unwindInfoMissing)
       return UNW_STEP_END;
+    if (_info.gp)
+      setReg(UNW_REG_SP, getReg(UNW_REG_SP) + _info.gp);
   }
 
   return result;
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindLevel1-gcc-ext.c b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindLevel1-gcc-ext.c
index c84db76..745c309 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindLevel1-gcc-ext.c
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindLevel1-gcc-ext.c
@@ -24,10 +24,21 @@
 
 ///  Called by __cxa_rethrow().
 _LIBUNWIND_EXPORT _Unwind_Reason_Code
-_Unwind_Resume_or_Rethrow(struct _Unwind_Exception *exception_object) {
+_Unwind_Resume_or_Rethrow(_Unwind_Exception *exception_object) {
   _LIBUNWIND_TRACE_API("_Unwind_Resume_or_Rethrow(ex_obj=%p), "
-                             "private_1=%ld\n",
-                              exception_object, exception_object->private_1);
+                       "private_1=%ld\n",
+                       exception_object,
+#if LIBCXXABI_ARM_EHABI
+                       (long)exception_object->unwinder_cache.reserved1);
+#else
+                       (long)exception_object->private_1);
+#endif
+
+#if LIBCXXABI_ARM_EHABI
+  // _Unwind_RaiseException on EHABI will always set the reserved1 field to 0,
+  // which is in the same position as private_1 below.
+  return _Unwind_RaiseException(exception_object);
+#else
   // If this is non-forced and a stopping place was found, then this is a
   // re-throw.
   // Call _Unwind_RaiseException() as if this was a new exception
@@ -42,6 +53,7 @@
   _Unwind_Resume(exception_object);
   _LIBUNWIND_ABORT("_Unwind_Resume_or_Rethrow() called _Unwind_RaiseException()"
                    " which unexpectedly returned");
+#endif
 }
 
 
@@ -116,7 +128,8 @@
       unw_get_proc_info(&cursor, &frameInfo);
       _LIBUNWIND_TRACE_UNWINDING(
           " _backtrace: start_ip=0x%llX, func=%s, lsda=0x%llX, context=%p\n",
-          frameInfo.start_ip, functionName, frameInfo.lsda, &cursor);
+          (long long)frameInfo.start_ip, functionName, (long long)frameInfo.lsda,
+          &cursor);
     }
 
     // call trace function with this frame
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindLevel1.c b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindLevel1.c
index b2e93c7..2ebd688 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindLevel1.c
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindLevel1.c
@@ -25,7 +25,13 @@
 #if _LIBUNWIND_BUILD_ZERO_COST_APIS
 
 static _Unwind_Reason_Code
-unwind_phase1(unw_context_t *uc, struct _Unwind_Exception *exception_object) {
+unwind_phase1(unw_context_t *uc, _Unwind_Exception *exception_object) {
+  // EHABI #7.3 discusses preserving the VRS in a "temporary VRS" during
+  // phase 1 and then restoring it to the "primary VRS" for phase 2. The
+  // effect is phase 2 doesn't see any of the VRS manipulations from phase 1.
+  // In this implementation, the phases don't share the VRS backing store.
+  // Instead, they are passed the original |uc| and they create a new VRS
+  // from scratch thus achieving the same effect.
   unw_cursor_t cursor1;
   unw_init_local(&cursor1, uc);
 
@@ -69,8 +75,8 @@
       _LIBUNWIND_TRACE_UNWINDING(
           "unwind_phase1(ex_ojb=%p): pc=0x%llX, start_ip=0x%llX, func=%s, "
           "lsda=0x%llX, personality=0x%llX\n",
-          exception_object, pc, frameInfo.start_ip, functionName,
-          frameInfo.lsda, frameInfo.handler);
+          exception_object, (long long)pc, (long long)frameInfo.start_ip, functionName,
+          (long long)frameInfo.lsda, (long long)frameInfo.handler);
     }
 
     // If there is a personality routine, ask it if it will want to stop at
@@ -81,16 +87,35 @@
       _LIBUNWIND_TRACE_UNWINDING(
           "unwind_phase1(ex_ojb=%p): calling personality function %p\n",
           exception_object, p);
+      struct _Unwind_Context *context = (struct _Unwind_Context *)(&cursor1);
+#if LIBCXXABI_ARM_EHABI
+      exception_object->pr_cache.fnstart = frameInfo.start_ip;
+      exception_object->pr_cache.ehtp = (_Unwind_EHT_Header *)frameInfo.unwind_info;
+      exception_object->pr_cache.additional = frameInfo.flags;
+      _Unwind_Reason_Code personalityResult =
+          (*p)(_US_VIRTUAL_UNWIND_FRAME, exception_object, context);
+      _LIBUNWIND_TRACE_UNWINDING("unwind_phase1(ex_ojb=%p): personality result %d "
+                                 "start_ip %x ehtp %p additional %x\n",
+                                 exception_object, personalityResult,
+                                 exception_object->pr_cache.fnstart,
+                                 exception_object->pr_cache.ehtp,
+                                 exception_object->pr_cache.additional);
+#else // !LIBCXXABI_ARM_EHABI
       _Unwind_Reason_Code personalityResult =
           (*p)(1, _UA_SEARCH_PHASE, exception_object->exception_class,
-               exception_object, (struct _Unwind_Context *)(&cursor1));
+               exception_object, context);
+#endif
       switch (personalityResult) {
       case _URC_HANDLER_FOUND:
         // found a catch clause or locals that need destructing in this frame
         // stop search and remember stack pointer at the frame
         handlerNotFound = false;
+#if LIBCXXABI_ARM_EHABI
+        // p should have initialized barrier_cache. EHABI #7.3.5
+#else
         unw_get_reg(&cursor1, UNW_REG_SP, &sp);
         exception_object->private_2 = (uintptr_t)sp;
+#endif
         _LIBUNWIND_TRACE_UNWINDING("unwind_phase1(ex_ojb=%p): "
                                    "_URC_HANDLER_FOUND \n",
                                    exception_object);
@@ -103,6 +128,12 @@
         // continue unwinding
         break;
 
+#if LIBCXXABI_ARM_EHABI
+      // EHABI #7.3.3
+      case _URC_FAILURE:
+        return _URC_FAILURE;
+#endif
+
       default:
         // something went wrong
         _LIBUNWIND_TRACE_UNWINDING(
@@ -117,17 +148,35 @@
 
 
 static _Unwind_Reason_Code
-unwind_phase2(unw_context_t *uc, struct _Unwind_Exception *exception_object) {
+unwind_phase2(unw_context_t *uc, _Unwind_Exception *exception_object, bool resume) {
+  // See comment at the start of unwind_phase1 regarding VRS integrity.
   unw_cursor_t cursor2;
   unw_init_local(&cursor2, uc);
 
   _LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p)\n", exception_object);
+  int frame_count = 0;
 
   // Walk each frame until we reach where search phase said to stop.
   while (true) {
-
     // Ask libuwind to get next frame (skip over first which is
-    // _Unwind_RaiseException).
+    // _Unwind_RaiseException or _Unwind_Resume).
+    //
+#if LIBCXXABI_ARM_EHABI
+    // Resume only ever makes sense for 1 frame.
+    _Unwind_State state =
+        resume ? _US_UNWIND_FRAME_RESUME : _US_UNWIND_FRAME_STARTING;
+    if (resume && frame_count == 1) {
+      // On a resume, first unwind the _Unwind_Resume() frame. The next frame
+      // is now the landing pad for the cleanup from a previous execution of
+      // phase2. To continue unwindingly correctly, replace VRS[15] with the
+      // IP of the frame that the previous run of phase2 installed the context
+      // for. After this, continue unwinding as if normal.
+      //
+      // See #7.4.6 for details.
+      unw_set_reg(&cursor2, UNW_REG_IP, exception_object->unwinder_cache.reserved2);
+      resume = false;
+    }
+#endif
     int stepResult = unw_step(&cursor2);
     if (stepResult == 0) {
       _LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p): unw_step() reached "
@@ -162,14 +211,24 @@
       _LIBUNWIND_TRACE_UNWINDING(
           "unwind_phase2(ex_ojb=%p): start_ip=0x%llX, func=%s, sp=0x%llX, "
           "lsda=0x%llX, personality=0x%llX\n",
-          exception_object, frameInfo.start_ip, functionName, sp,
-          frameInfo.lsda, frameInfo.handler);
+          exception_object, (long long)frameInfo.start_ip, functionName,
+          (long long)sp, (long long)frameInfo.lsda,
+          (long long)frameInfo.handler);
     }
 
     // If there is a personality routine, tell it we are unwinding.
     if (frameInfo.handler != 0) {
       __personality_routine p =
           (__personality_routine)(long)(frameInfo.handler);
+      struct _Unwind_Context *context = (struct _Unwind_Context *)(&cursor2);
+#if LIBCXXABI_ARM_EHABI
+      // EHABI #7.2
+      exception_object->pr_cache.fnstart = frameInfo.start_ip;
+      exception_object->pr_cache.ehtp = (_Unwind_EHT_Header *)frameInfo.unwind_info;
+      exception_object->pr_cache.additional = frameInfo.flags;
+      _Unwind_Reason_Code personalityResult =
+          (*p)(state, exception_object, context);
+#else
       _Unwind_Action action = _UA_CLEANUP_PHASE;
       if (sp == exception_object->private_2) {
         // Tell personality this was the frame it marked in phase 1.
@@ -177,17 +236,23 @@
       }
        _Unwind_Reason_Code personalityResult =
           (*p)(1, action, exception_object->exception_class, exception_object,
-               (struct _Unwind_Context *)(&cursor2));
+               context);
+#endif
       switch (personalityResult) {
       case _URC_CONTINUE_UNWIND:
         // Continue unwinding
         _LIBUNWIND_TRACE_UNWINDING(
             "unwind_phase2(ex_ojb=%p): _URC_CONTINUE_UNWIND\n",
             exception_object);
+#if LIBCXXABI_ARM_EHABI
+        // EHABI #7.2
+        if (sp == exception_object->barrier_cache.sp) {
+#else
         if (sp == exception_object->private_2) {
+#endif
           // Phase 1 said we would stop at this frame, but we did not...
           _LIBUNWIND_ABORT("during phase1 personality function said it would "
-                           "stop here, but now if phase2 it did not stop here");
+                           "stop here, but now in phase2 it did not stop here");
         }
         break;
       case _URC_INSTALL_CONTEXT:
@@ -202,11 +267,27 @@
           unw_get_reg(&cursor2, UNW_REG_SP, &sp);
           _LIBUNWIND_TRACE_UNWINDING("unwind_phase2(ex_ojb=%p): re-entering  "
                                      "user code with ip=0x%llX, sp=0x%llX\n",
-                                    exception_object, pc, sp);
+                                     exception_object, (long long)pc,
+                                     (long long)sp);
         }
+
+#if LIBCXXABI_ARM_EHABI
+        {
+          // EHABI #7.4.1 says we need to preserve pc for when _Unwind_Resume
+          // is called back, to find this same frame.
+          unw_word_t pc;
+          unw_get_reg(&cursor2, UNW_REG_IP, &pc);
+          exception_object->unwinder_cache.reserved2 = (uint32_t)pc;
+        }
+#endif
         unw_resume(&cursor2);
         // unw_resume() only returns if there was an error.
         return _URC_FATAL_PHASE2_ERROR;
+#if LIBCXXABI_ARM_EHABI
+      // # EHABI #7.4.3
+      case _URC_FAILURE:
+        abort();
+#endif
       default:
         // Personality routine returned an unknown result code.
         _LIBUNWIND_DEBUG_LOG("personality function returned unknown result %d",
@@ -214,6 +295,7 @@
         return _URC_FATAL_PHASE2_ERROR;
       }
     }
+    frame_count++;
   }
 
   // Clean up phase did not resume at the frame that the search phase
@@ -221,9 +303,10 @@
   return _URC_FATAL_PHASE2_ERROR;
 }
 
+#if !LIBCXXABI_ARM_EHABI
 static _Unwind_Reason_Code
 unwind_phase2_forced(unw_context_t *uc,
-                     struct _Unwind_Exception *exception_object,
+                     _Unwind_Exception *exception_object,
                      _Unwind_Stop_Fn stop, void *stop_parameter) {
   unw_cursor_t cursor2;
   unw_init_local(&cursor2, uc);
@@ -237,7 +320,7 @@
       _LIBUNWIND_TRACE_UNWINDING("unwind_phase2_forced(ex_ojb=%p): unw_step "
                                  "failed => _URC_END_OF_STACK\n",
                                  exception_object);
-      return _URC_FATAL_PHASE1_ERROR;
+      return _URC_FATAL_PHASE2_ERROR;
     }
 
     // When tracing, print state information.
@@ -320,20 +403,27 @@
   // would.
   return _URC_FATAL_PHASE2_ERROR;
 }
+#endif
 
 
 /// Called by __cxa_throw.  Only returns if there is a fatal error.
 _LIBUNWIND_EXPORT _Unwind_Reason_Code
-_Unwind_RaiseException(struct _Unwind_Exception *exception_object) {
+_Unwind_RaiseException(_Unwind_Exception *exception_object) {
   _LIBUNWIND_TRACE_API("_Unwind_RaiseException(ex_obj=%p)\n",
                              exception_object);
   unw_context_t uc;
   unw_getcontext(&uc);
 
+#if LIBCXXABI_ARM_EHABI
+  // This field for is for compatibility with GCC to say this isn't a forced
+  // unwind. EHABI #7.2
+  exception_object->unwinder_cache.reserved1 = 0;
+#else
   // Mark that this is a non-forced unwind, so _Unwind_Resume()
   // can do the right thing.
   exception_object->private_1 = 0;
   exception_object->private_2 = 0;
+#endif
 
   // phase 1: the search phase
   _Unwind_Reason_Code phase1 = unwind_phase1(&uc, exception_object);
@@ -341,10 +431,15 @@
     return phase1;
 
   // phase 2: the clean up phase
-  return unwind_phase2(&uc, exception_object);
+  return unwind_phase2(&uc, exception_object, false);
 }
 
-
+#if LIBCXXABI_ARM_EHABI
+_LIBUNWIND_EXPORT void _Unwind_Complete(_Unwind_Exception* exception_object) {
+  // This is to be called when exception handling completes to give us a chance
+  // to perform any housekeeping. EHABI #7.2. But we have nothing to do here.
+}
+#endif
 
 /// When _Unwind_RaiseException() is in phase2, it hands control
 /// to the personality function at each frame.  The personality
@@ -358,17 +453,24 @@
 /// is implemented by having the code call __cxa_rethrow() which
 /// in turn calls _Unwind_Resume_or_Rethrow().
 _LIBUNWIND_EXPORT void
-_Unwind_Resume(struct _Unwind_Exception *exception_object) {
+_Unwind_Resume(_Unwind_Exception *exception_object) {
   _LIBUNWIND_TRACE_API("_Unwind_Resume(ex_obj=%p)\n", exception_object);
   unw_context_t uc;
   unw_getcontext(&uc);
 
+#if LIBCXXABI_ARM_EHABI
+  // _Unwind_RaiseException on EHABI will always set the reserved1 field to 0,
+  // which is in the same position as private_1 below.
+  // TODO(ajwong): Who wronte the above? Why is it true?
+  unwind_phase2(&uc, exception_object, true);
+#else
   if (exception_object->private_1 != 0)
     unwind_phase2_forced(&uc, exception_object,
                          (_Unwind_Stop_Fn) exception_object->private_1,
                          (void *)exception_object->private_2);
   else
-    unwind_phase2(&uc, exception_object);
+    unwind_phase2(&uc, exception_object, true);
+#endif
 
   // Clients assume _Unwind_Resume() does not return, so all we can do is abort.
   _LIBUNWIND_ABORT("_Unwind_Resume() can't return");
@@ -376,11 +478,12 @@
 
 
 
+#if !LIBCXXABI_ARM_EHABI
 /// Not used by C++.
 /// Unwinds stack, calling "stop" function at each frame.
 /// Could be used to implement longjmp().
 _LIBUNWIND_EXPORT _Unwind_Reason_Code
-_Unwind_ForcedUnwind(struct _Unwind_Exception *exception_object,
+_Unwind_ForcedUnwind(_Unwind_Exception *exception_object,
                      _Unwind_Stop_Fn stop, void *stop_parameter) {
   _LIBUNWIND_TRACE_API("_Unwind_ForcedUnwind(ex_obj=%p, stop=%p)\n",
                   exception_object, stop);
@@ -395,6 +498,7 @@
   // do it
   return unwind_phase2_forced(&uc, exception_object, stop, stop_parameter);
 }
+#endif // !LIBCXXABI_ARM_EHABI
 
 
 /// Called by personality handler during phase 2 to get LSDA for current frame.
@@ -406,15 +510,205 @@
   if (unw_get_proc_info(cursor, &frameInfo) == UNW_ESUCCESS)
     result = (uintptr_t)frameInfo.lsda;
   _LIBUNWIND_TRACE_API("_Unwind_GetLanguageSpecificData(context=%p)"
-                             "=> 0x%lX\n", context, result);
+                       "=> 0x%llx\n", context, (long long)result);
   if (result != 0) {
     if (*((uint8_t *)result) != 0xFF)
-      _LIBUNWIND_DEBUG_LOG("lsda at 0x%lX does not start with 0xFF\n", result);
+      _LIBUNWIND_DEBUG_LOG("lsda at 0x%llx does not start with 0xFF\n",
+                           (long long)result);
   }
   return result;
 }
 
 
+#if LIBCXXABI_ARM_EHABI
+
+static uint64_t ValueAsBitPattern(_Unwind_VRS_DataRepresentation representation,
+                                  void* valuep) {
+  uint64_t value = 0;
+  switch (representation) {
+    case _UVRSD_UINT32:
+    case _UVRSD_FLOAT:
+      memcpy(&value, valuep, sizeof(uint32_t));
+      break;
+
+    case _UVRSD_VFPX:
+    case _UVRSD_UINT64:
+    case _UVRSD_DOUBLE:
+      memcpy(&value, valuep, sizeof(uint64_t));
+      break;
+  }
+  return value;
+}
+
+_Unwind_VRS_Result _Unwind_VRS_Set(
+    _Unwind_Context *context,
+    _Unwind_VRS_RegClass regclass,
+    uint32_t regno,
+    _Unwind_VRS_DataRepresentation representation,
+    void *valuep) {
+  _LIBUNWIND_TRACE_API("_Unwind_VRS_Set(context=%p, regclass=%d, reg=%d, "
+                       "rep=%d, value=0x%llX)\n", context, regclass,
+                       regno, representation,
+                       ValueAsBitPattern(representation, valuep));
+  unw_cursor_t *cursor = (unw_cursor_t *)context;
+  switch (regclass) {
+    case _UVRSC_CORE:
+      if (representation != _UVRSD_UINT32 || regno > 15)
+        return _UVRSR_FAILED;
+      return unw_set_reg(cursor, UNW_ARM_R0 + regno, *(unw_word_t*)valuep) == UNW_ESUCCESS ?
+          _UVRSR_OK : _UVRSR_FAILED;
+    case _UVRSC_WMMXC:
+      if (representation != _UVRSD_UINT32 || regno > 3)
+        return _UVRSR_FAILED;
+      return unw_set_reg(cursor, UNW_ARM_WC0 + regno, *(unw_word_t*)valuep) == UNW_ESUCCESS ?
+          _UVRSR_OK : _UVRSR_FAILED;
+    case _UVRSC_VFP:
+      if (representation != _UVRSD_VFPX && representation != _UVRSD_DOUBLE)
+        return _UVRSR_FAILED;
+      if (representation == _UVRSD_VFPX) {
+        // Can only touch d0-15 with FSTMFDX.
+        if (regno > 15)
+          return _UVRSR_FAILED;
+        unw_save_vfp_as_X(cursor);
+      } else {
+        if (regno > 31)
+          return _UVRSR_FAILED;
+      }
+      return unw_set_fpreg(cursor, UNW_ARM_D0 + regno, *(unw_fpreg_t*)valuep) == UNW_ESUCCESS ?
+          _UVRSR_OK : _UVRSR_FAILED;
+    case _UVRSC_WMMXD:
+      if (representation != _UVRSD_DOUBLE || regno > 31)
+        return _UVRSR_FAILED;
+      return unw_set_fpreg(cursor, UNW_ARM_WR0 + regno, *(unw_fpreg_t*)valuep) == UNW_ESUCCESS ?
+          _UVRSR_OK : _UVRSR_FAILED;
+  }
+}
+
+static _Unwind_VRS_Result _Unwind_VRS_Get_Internal(
+    _Unwind_Context *context,
+    _Unwind_VRS_RegClass regclass,
+    uint32_t regno,
+    _Unwind_VRS_DataRepresentation representation,
+    void *valuep) {
+  unw_cursor_t *cursor = (unw_cursor_t *)context;
+  switch (regclass) {
+    case _UVRSC_CORE:
+      if (representation != _UVRSD_UINT32 || regno > 15)
+        return _UVRSR_FAILED;
+      return unw_get_reg(cursor, UNW_ARM_R0 + regno, (unw_word_t*)valuep) == UNW_ESUCCESS ?
+          _UVRSR_OK : _UVRSR_FAILED;
+    case _UVRSC_WMMXC:
+      if (representation != _UVRSD_UINT32 || regno > 3)
+        return _UVRSR_FAILED;
+      return unw_get_reg(cursor, UNW_ARM_WC0 + regno, (unw_word_t*)valuep) == UNW_ESUCCESS ?
+          _UVRSR_OK : _UVRSR_FAILED;
+    case _UVRSC_VFP:
+      if (representation != _UVRSD_VFPX && representation != _UVRSD_DOUBLE)
+        return _UVRSR_FAILED;
+      if (representation == _UVRSD_VFPX) {
+        // Can only touch d0-15 with FSTMFDX.
+        if (regno > 15)
+          return _UVRSR_FAILED;
+        unw_save_vfp_as_X(cursor);
+      } else {
+        if (regno > 31)
+          return _UVRSR_FAILED;
+      }
+      return unw_get_fpreg(cursor, UNW_ARM_D0 + regno, (unw_fpreg_t*)valuep) == UNW_ESUCCESS ?
+          _UVRSR_OK : _UVRSR_FAILED;
+    case _UVRSC_WMMXD:
+      if (representation != _UVRSD_DOUBLE || regno > 31)
+        return _UVRSR_FAILED;
+      return unw_get_fpreg(cursor, UNW_ARM_WR0 + regno, (unw_fpreg_t*)valuep) == UNW_ESUCCESS ?
+          _UVRSR_OK : _UVRSR_FAILED;
+  }
+}
+
+_Unwind_VRS_Result _Unwind_VRS_Get(
+    _Unwind_Context *context,
+    _Unwind_VRS_RegClass regclass,
+    uint32_t regno,
+    _Unwind_VRS_DataRepresentation representation,
+    void *valuep) {
+  _Unwind_VRS_Result result =
+      _Unwind_VRS_Get_Internal(context, regclass, regno, representation,
+                               valuep);
+  _LIBUNWIND_TRACE_API("_Unwind_VRS_Get(context=%p, regclass=%d, reg=%d, "
+                       "rep=%d, value=0x%llX, result = %d)\n", context, regclass,
+                       regno, representation, 
+                       ValueAsBitPattern(representation, valuep), result);
+  return result;
+}
+
+_Unwind_VRS_Result _Unwind_VRS_Pop(
+    _Unwind_Context *context,
+    _Unwind_VRS_RegClass regclass,
+    uint32_t discriminator,
+    _Unwind_VRS_DataRepresentation representation) {
+  _LIBUNWIND_TRACE_API("_Unwind_VRS_Pop(context=%p, regclass=%d, "
+                       "discriminator=%d, representation=%d)\n",
+                        context, regclass, discriminator, representation);
+  switch (regclass) {
+    case _UVRSC_CORE:
+    case _UVRSC_WMMXC: {
+      if (representation != _UVRSD_UINT32)
+        return _UVRSR_FAILED;
+      // When popping SP from the stack, we don't want to override it from the
+      // computed new stack location. See EHABI #7.5.4 table 3.
+      bool poppedSP = false;
+      uint32_t* sp;
+      if (_Unwind_VRS_Get(context, _UVRSC_CORE, UNW_ARM_SP,
+                          _UVRSD_UINT32, &sp) != _UVRSR_OK) {
+        return _UVRSR_FAILED;
+      }
+      for (int i = 0; i < 16; ++i) {
+        if (!(discriminator & (1<<i)))
+          continue;
+        uint32_t value = *sp++;
+        if (regclass == _UVRSC_CORE && i == 13)
+          poppedSP = true;
+        if (_Unwind_VRS_Set(context, regclass, i,
+                            _UVRSD_UINT32, &value) != _UVRSR_OK) {
+          return _UVRSR_FAILED;
+        }
+      }
+      if (!poppedSP) {
+        return _Unwind_VRS_Set(context, _UVRSC_CORE, UNW_ARM_SP,
+                               _UVRSD_UINT32, &sp);
+      }
+      return _UVRSR_OK;
+    }
+    case _UVRSC_VFP:
+    case _UVRSC_WMMXD: {
+      if (representation != _UVRSD_VFPX && representation != _UVRSD_DOUBLE)
+        return _UVRSR_FAILED;
+      uint32_t first = discriminator >> 16;
+      uint32_t count = discriminator & 0xffff;
+      uint32_t end = first+count;
+      uint32_t* sp;
+      if (_Unwind_VRS_Get(context, _UVRSC_CORE, UNW_ARM_SP,
+                          _UVRSD_UINT32, &sp) != _UVRSR_OK) {
+        return _UVRSR_FAILED;
+      }
+      // For _UVRSD_VFPX, we're assuming the data is stored in FSTMX "standard
+      // format 1", which is equivalent to FSTMD + a padding word.
+      for (uint32_t i = first; i < end; ++i) {
+        // SP is only 32-bit aligned so don't copy 64-bit at a time.
+        uint64_t value = *sp++;
+        value |= ((uint64_t)(*sp++)) << 32;
+        if (_Unwind_VRS_Set(context, regclass, i, representation, &value) != _UVRSR_OK)
+          return _UVRSR_FAILED;
+      }
+      if (representation == _UVRSD_VFPX)
+        ++sp;
+      return _Unwind_VRS_Set(context, _UVRSC_CORE, UNW_ARM_SP, _UVRSD_UINT32, &sp);
+    }
+  };
+}
+
+#else  // !LIBCXXABI_ARM_EHABI
+
+// ARM EHABI provides these as inline wrappers in the public header.
 
 /// Called by personality handler during phase 2 to get register values.
 _LIBUNWIND_EXPORT uintptr_t _Unwind_GetGR(struct _Unwind_Context *context,
@@ -465,6 +759,7 @@
   unw_set_reg(cursor, UNW_REG_IP, new_value);
 }
 
+#endif // !LICXXABI_ARM_EHABI
 
 /// Called by personality handler during phase 2 to find the start of the
 /// function.
@@ -475,8 +770,8 @@
   uintptr_t result = 0;
   if (unw_get_proc_info(cursor, &frameInfo) == UNW_ESUCCESS)
     result = (uintptr_t)frameInfo.start_ip;
-  _LIBUNWIND_TRACE_API("_Unwind_GetRegionStart(context=%p) => 0x%lX\n",
-                             context, result);
+  _LIBUNWIND_TRACE_API("_Unwind_GetRegionStart(context=%p) => 0x%llX\n",
+                             context, (long long)result);
   return result;
 }
 
@@ -484,7 +779,7 @@
 /// Called by personality handler during phase 2 if a foreign exception
 // is caught.
 _LIBUNWIND_EXPORT void
-_Unwind_DeleteException(struct _Unwind_Exception *exception_object) {
+_Unwind_DeleteException(_Unwind_Exception *exception_object) {
   _LIBUNWIND_TRACE_API("_Unwind_DeleteException(ex_obj=%p)\n",
                               exception_object);
   if (exception_object->exception_cleanup != NULL)
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindRegistersSave.s b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindRegistersRestore.S
similarity index 66%
rename from sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindRegistersSave.s
rename to sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindRegistersRestore.S
index c61c354..9a8c9be 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindRegistersSave.s
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindRegistersRestore.S
@@ -1,4 +1,4 @@
-//===------------------------ UnwindRegistersSave.s -----------------------===//
+//===-------------------- UnwindRegistersRestore.S ------------------------===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -7,12 +7,12 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "assembly.h"
+
+  .text
 
 #if __i386__
-  .text
-  .globl __ZN9libunwind13Registers_x866jumptoEv
-  .private_extern __ZN9libunwind13Registers_x866jumptoEv
-__ZN9libunwind13Registers_x866jumptoEv:
+DEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_x866jumptoEv)
 #
 # void libunwind::Registers_x86::jumpto()
 #
@@ -54,10 +54,7 @@
 
 #elif __x86_64__
 
-  .text
-  .globl __ZN9libunwind16Registers_x86_646jumptoEv
-  .private_extern __ZN9libunwind16Registers_x86_646jumptoEv
-__ZN9libunwind16Registers_x86_646jumptoEv:
+DEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind16Registers_x86_646jumptoEv)
 #
 # void libunwind::Registers_x86_64::jumpto()
 #
@@ -98,10 +95,7 @@
 
 #elif __ppc__
 
-  .text
-  .globl __ZN9libunwind13Registers_ppc6jumptoEv
-  .private_extern __ZN9libunwind13Registers_ppc6jumptoEv
-__ZN9libunwind13Registers_ppc6jumptoEv:
+DEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_ppc6jumptoEv)
 ;
 ; void libunwind::Registers_ppc::jumpto()
 ;
@@ -266,16 +260,14 @@
 
 #elif __arm64__
 
-  .text
-  .globl __ZN9libunwind15Registers_arm646jumptoEv
-  .private_extern __ZN9libunwind15Registers_arm646jumptoEv
-__ZN9libunwind15Registers_arm646jumptoEv:
 ;
 ; void libunwind::Registers_arm64::jumpto()
 ;
 ; On entry:
 ;  thread_state pointer is in x0
 ;
+  .p2align 2
+DEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind15Registers_arm646jumptoEv)
   ; skip restore of x0,x1 for now
   ldp    x2, x3,  [x0, #0x010]
   ldp    x4, x5,  [x0, #0x020]
@@ -316,8 +308,107 @@
   ldp    x0, x1,  [x0, #0x000]  ; restore x0,x1
   ret    lr            ; jump to pc
 
+#elif __arm__
 
-
-
+@
+@ void libunwind::Registers_arm::restoreCoreAndJumpTo()
+@
+@ On entry:
+@  thread_state pointer is in r0
+@
+  .p2align 2
+DEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_arm20restoreCoreAndJumpToEv)
+  @ Use lr as base so that r0 can be restored.
+  mov lr, r0
+  @ 32bit thumb-2 restrictions for ldm:
+  @ . the sp (r13) cannot be in the list
+  @ . the pc (r15) and lr (r14) cannot both be in the list in an LDM instruction
+  ldm lr, {r0-r12}
+  ldr sp, [lr, #52]
+  ldr lr, [lr, #60]  @ restore pc into lr
+#if _ARM_ARCH > 4
+  bx lr
+#else
+  mov pc, lr
 #endif
 
+@
+@ static void libunwind::Registers_arm::restoreVFPWithFLDMD(unw_fpreg_t* values)
+@
+@ On entry:
+@  values pointer is in r0
+@
+  .p2align 2
+DEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_arm19restoreVFPWithFLDMDEPy)
+  fldmiad r0, {d0-d15}
+  mov pc, lr
+
+@
+@ static void libunwind::Registers_arm::restoreVFPWithFLDMX(unw_fpreg_t* values)
+@
+@ On entry:
+@  values pointer is in r0
+@
+  .p2align 2
+DEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_arm19restoreVFPWithFLDMXEPy)
+  fldmiax r0, {d0-d15}
+  mov pc, lr
+
+@
+@ static void libunwind::Registers_arm::restoreVFPv3(unw_fpreg_t* values)
+@
+@ On entry:
+@  values pointer is in r0
+@
+  .p2align 2
+DEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_arm12restoreVFPv3EPy)
+  @ d16-d31 are only available when compiling with -mfpu=vfpv3. We don't want to
+  @ do that in the library (because we don't want the compiler to generate
+  @ instructions that access those) but this is only accessed if the
+  @ personality routine needs these registers. Use of these registers implies
+  @ they are, actually, available on the target, so it's ok to execute.
+  @ So, generate the instruction using the corresponding coprocessor mnemonic.
+  ldcl p11, cr0, [r0], {#0x20}  @ vldm r0, {d16-d31}
+  mov pc, lr
+
+@
+@ static void libunwind::Registers_arm::restoreiWMMX(unw_fpreg_t* values)
+@
+@ On entry:
+@  values pointer is in r0
+@
+  .p2align 2
+DEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_arm12restoreiWMMXEPy)
+  ldcl p1, cr0, [r0], #8  @ wldrd wR0, [r0], #8
+  ldcl p1, cr1, [r0], #8  @ wldrd wR1, [r0], #8
+  ldcl p1, cr2, [r0], #8  @ wldrd wR2, [r0], #8
+  ldcl p1, cr3, [r0], #8  @ wldrd wR3, [r0], #8
+  ldcl p1, cr4, [r0], #8  @ wldrd wR4, [r0], #8
+  ldcl p1, cr5, [r0], #8  @ wldrd wR5, [r0], #8
+  ldcl p1, cr6, [r0], #8  @ wldrd wR6, [r0], #8
+  ldcl p1, cr7, [r0], #8  @ wldrd wR7, [r0], #8
+  ldcl p1, cr8, [r0], #8  @ wldrd wR8, [r0], #8
+  ldcl p1, cr9, [r0], #8  @ wldrd wR9, [r0], #8
+  ldcl p1, cr10, [r0], #8  @ wldrd wR10, [r0], #8
+  ldcl p1, cr11, [r0], #8  @ wldrd wR11, [r0], #8
+  ldcl p1, cr12, [r0], #8  @ wldrd wR12, [r0], #8
+  ldcl p1, cr13, [r0], #8  @ wldrd wR13, [r0], #8
+  ldcl p1, cr14, [r0], #8  @ wldrd wR14, [r0], #8
+  ldcl p1, cr15, [r0], #8  @ wldrd wR15, [r0], #8
+  mov pc, lr
+
+@
+@ static void libunwind::Registers_arm::restoreiWMMXControl(unw_uint32_t* values)
+@
+@ On entry:
+@  values pointer is in r0
+@
+  .p2align 2
+DEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_arm19restoreiWMMXControlEPj)
+  ldc2 p1, cr8, [r0], #4  @ wldrw wCGR0, [r0], #4
+  ldc2 p1, cr9, [r0], #4  @ wldrw wCGR1, [r0], #4
+  ldc2 p1, cr10, [r0], #4  @ wldrw wCGR2, [r0], #4
+  ldc2 p1, cr11, [r0], #4  @ wldrw wCGR3, [r0], #4
+  mov pc, lr
+
+#endif
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindRegistersRestore.s b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindRegistersRestore.s
deleted file mode 100644
index 05d29ec..0000000
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindRegistersRestore.s
+++ /dev/null
@@ -1,286 +0,0 @@
-//===-------------------- UnwindRegistersRestore.s ------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-
-    .text
-
-#if __i386__
-
-#
-# extern int unw_getcontext(unw_context_t* thread_state)
-#
-# On entry:
-#   +                       +
-#   +-----------------------+
-#   + thread_state pointer  +
-#   +-----------------------+
-#   + return address        +
-#   +-----------------------+   <-- SP
-#   +                       +
-#
-  .globl _unw_getcontext
-_unw_getcontext:
-  push  %eax
-  movl  8(%esp), %eax
-  movl  %ebx,  4(%eax)
-  movl  %ecx,  8(%eax)
-  movl  %edx, 12(%eax)
-  movl  %edi, 16(%eax)
-  movl  %esi, 20(%eax)
-  movl  %ebp, 24(%eax)
-  movl  %esp, %edx
-  addl  $8, %edx
-  movl  %edx, 28(%eax)  # store what sp was at call site as esp
-  # skip ss
-  # skip eflags
-  movl  4(%esp), %edx
-  movl  %edx, 40(%eax)  # store return address as eip
-  # skip cs
-  # skip ds
-  # skip es
-  # skip fs
-  # skip gs
-  movl  (%esp), %edx
-  movl  %edx, (%eax)  # store original eax
-  popl  %eax
-  xorl  %eax, %eax    # return UNW_ESUCCESS
-  ret
-
-#elif __x86_64__
-
-#
-# extern int unw_getcontext(unw_context_t* thread_state)
-#
-# On entry:
-#  thread_state pointer is in rdi
-#
-  .globl _unw_getcontext
-_unw_getcontext:
-  movq  %rax,   (%rdi)
-  movq  %rbx,  8(%rdi)
-  movq  %rcx, 16(%rdi)
-  movq  %rdx, 24(%rdi)
-  movq  %rdi, 32(%rdi)
-  movq  %rsi, 40(%rdi)
-  movq  %rbp, 48(%rdi)
-  movq  %rsp, 56(%rdi)
-  addq  $8,   56(%rdi)
-  movq  %r8,  64(%rdi)
-  movq  %r9,  72(%rdi)
-  movq  %r10, 80(%rdi)
-  movq  %r11, 88(%rdi)
-  movq  %r12, 96(%rdi)
-  movq  %r13,104(%rdi)
-  movq  %r14,112(%rdi)
-  movq  %r15,120(%rdi)
-  movq  (%rsp),%rsi
-  movq  %rsi,128(%rdi) # store return address as rip
-  # skip rflags
-  # skip cs
-  # skip fs
-  # skip gs
-  xorl  %eax, %eax    # return UNW_ESUCCESS
-  ret
-
-#elif __ppc__
-
-;
-; extern int unw_getcontext(unw_context_t* thread_state)
-;
-; On entry:
-;  thread_state pointer is in r3
-;
-  .globl _unw_getcontext
-_unw_getcontext:
-  stw    r0,  8(r3)
-  mflr  r0
-  stw    r0,  0(r3)  ; store lr as ssr0
-  stw    r1, 12(r3)
-  stw    r2, 16(r3)
-  stw    r3, 20(r3)
-  stw    r4, 24(r3)
-  stw    r5, 28(r3)
-  stw    r6, 32(r3)
-  stw    r7, 36(r3)
-  stw    r8, 40(r3)
-  stw    r9, 44(r3)
-  stw     r10, 48(r3)
-  stw     r11, 52(r3)
-  stw     r12, 56(r3)
-  stw     r13, 60(r3)
-  stw     r14, 64(r3)
-  stw     r15, 68(r3)
-  stw     r16, 72(r3)
-  stw     r17, 76(r3)
-  stw     r18, 80(r3)
-  stw     r19, 84(r3)
-  stw     r20, 88(r3)
-  stw     r21, 92(r3)
-  stw     r22, 96(r3)
-  stw     r23,100(r3)
-  stw     r24,104(r3)
-  stw     r25,108(r3)
-  stw     r26,112(r3)
-  stw     r27,116(r3)
-  stw     r28,120(r3)
-  stw     r29,124(r3)
-  stw     r30,128(r3)
-  stw     r31,132(r3)
-
-  ; save VRSave register
-  mfspr  r0,256
-  stw    r0,156(r3)
-  ; save CR registers
-  mfcr  r0
-  stw    r0,136(r3)
-  ; save CTR register
-  mfctr  r0
-  stw    r0,148(r3)
-
-  ; save float registers
-  stfd    f0, 160(r3)
-  stfd    f1, 168(r3)
-  stfd    f2, 176(r3)
-  stfd    f3, 184(r3)
-  stfd    f4, 192(r3)
-  stfd    f5, 200(r3)
-  stfd    f6, 208(r3)
-  stfd    f7, 216(r3)
-  stfd    f8, 224(r3)
-  stfd    f9, 232(r3)
-  stfd    f10,240(r3)
-  stfd    f11,248(r3)
-  stfd    f12,256(r3)
-  stfd    f13,264(r3)
-  stfd    f14,272(r3)
-  stfd    f15,280(r3)
-  stfd    f16,288(r3)
-  stfd    f17,296(r3)
-  stfd    f18,304(r3)
-  stfd    f19,312(r3)
-  stfd    f20,320(r3)
-  stfd    f21,328(r3)
-  stfd    f22,336(r3)
-  stfd    f23,344(r3)
-  stfd    f24,352(r3)
-  stfd    f25,360(r3)
-  stfd    f26,368(r3)
-  stfd    f27,376(r3)
-  stfd    f28,384(r3)
-  stfd    f29,392(r3)
-  stfd    f30,400(r3)
-  stfd    f31,408(r3)
-
-
-  ; save vector registers
-
-  subi  r4,r1,16
-  rlwinm  r4,r4,0,0,27  ; mask low 4-bits
-  ; r4 is now a 16-byte aligned pointer into the red zone
-
-#define SAVE_VECTOR_UNALIGNED(_vec, _offset) \
-  stvx  _vec,0,r4           @\
-  lwz    r5, 0(r4)          @\
-  stw    r5, _offset(r3)    @\
-  lwz    r5, 4(r4)          @\
-  stw    r5, _offset+4(r3)  @\
-  lwz    r5, 8(r4)          @\
-  stw    r5, _offset+8(r3)  @\
-  lwz    r5, 12(r4)         @\
-  stw    r5, _offset+12(r3)
-
-  SAVE_VECTOR_UNALIGNED( v0, 424+0x000)
-  SAVE_VECTOR_UNALIGNED( v1, 424+0x010)
-  SAVE_VECTOR_UNALIGNED( v2, 424+0x020)
-  SAVE_VECTOR_UNALIGNED( v3, 424+0x030)
-  SAVE_VECTOR_UNALIGNED( v4, 424+0x040)
-  SAVE_VECTOR_UNALIGNED( v5, 424+0x050)
-  SAVE_VECTOR_UNALIGNED( v6, 424+0x060)
-  SAVE_VECTOR_UNALIGNED( v7, 424+0x070)
-  SAVE_VECTOR_UNALIGNED( v8, 424+0x080)
-  SAVE_VECTOR_UNALIGNED( v9, 424+0x090)
-  SAVE_VECTOR_UNALIGNED(v10, 424+0x0A0)
-  SAVE_VECTOR_UNALIGNED(v11, 424+0x0B0)
-  SAVE_VECTOR_UNALIGNED(v12, 424+0x0C0)
-  SAVE_VECTOR_UNALIGNED(v13, 424+0x0D0)
-  SAVE_VECTOR_UNALIGNED(v14, 424+0x0E0)
-  SAVE_VECTOR_UNALIGNED(v15, 424+0x0F0)
-  SAVE_VECTOR_UNALIGNED(v16, 424+0x100)
-  SAVE_VECTOR_UNALIGNED(v17, 424+0x110)
-  SAVE_VECTOR_UNALIGNED(v18, 424+0x120)
-  SAVE_VECTOR_UNALIGNED(v19, 424+0x130)
-  SAVE_VECTOR_UNALIGNED(v20, 424+0x140)
-  SAVE_VECTOR_UNALIGNED(v21, 424+0x150)
-  SAVE_VECTOR_UNALIGNED(v22, 424+0x160)
-  SAVE_VECTOR_UNALIGNED(v23, 424+0x170)
-  SAVE_VECTOR_UNALIGNED(v24, 424+0x180)
-  SAVE_VECTOR_UNALIGNED(v25, 424+0x190)
-  SAVE_VECTOR_UNALIGNED(v26, 424+0x1A0)
-  SAVE_VECTOR_UNALIGNED(v27, 424+0x1B0)
-  SAVE_VECTOR_UNALIGNED(v28, 424+0x1C0)
-  SAVE_VECTOR_UNALIGNED(v29, 424+0x1D0)
-  SAVE_VECTOR_UNALIGNED(v30, 424+0x1E0)
-  SAVE_VECTOR_UNALIGNED(v31, 424+0x1F0)
-
-  li  r3, 0    ; return UNW_ESUCCESS
-  blr
-
-
-#elif __arm64__
-
-;
-; extern int unw_getcontext(unw_context_t* thread_state)
-;
-; On entry:
-;  thread_state pointer is in x0
-;
-  .globl _unw_getcontext
-_unw_getcontext:
-  stp    x0, x1,  [x0, #0x000]
-  stp    x2, x3,  [x0, #0x010]
-  stp    x4, x5,  [x0, #0x020]
-  stp    x6, x7,  [x0, #0x030]
-  stp    x8, x9,  [x0, #0x040]
-  stp    x10,x11, [x0, #0x050]
-  stp    x12,x13, [x0, #0x060]
-  stp    x14,x15, [x0, #0x070]
-  stp    x16,x17, [x0, #0x080]
-  stp    x18,x19, [x0, #0x090]
-  stp    x20,x21, [x0, #0x0A0]
-  stp    x22,x23, [x0, #0x0B0]
-  stp    x24,x25, [x0, #0x0C0]
-  stp    x26,x27, [x0, #0x0D0]
-  stp    x28,fp,  [x0, #0x0E0]
-  str    lr,      [x0, #0x0F0]
-  mov    x1,sp
-  str    x1,      [x0, #0x0F8]
-  str    lr,      [x0, #0x100]    ; store return address as pc
-  ; skip cpsr
-  stp    d0, d1,  [x0, #0x110]
-  stp    d2, d3,  [x0, #0x120]
-  stp    d4, d5,  [x0, #0x130]
-  stp    d6, d7,  [x0, #0x140]
-  stp    d8, d9,  [x0, #0x150]
-  stp    d10,d11, [x0, #0x160]
-  stp    d12,d13, [x0, #0x170]
-  stp    d14,d15, [x0, #0x180]
-  stp    d16,d17, [x0, #0x190]
-  stp    d18,d19, [x0, #0x1A0]
-  stp    d20,d21, [x0, #0x1B0]
-  stp    d22,d23, [x0, #0x1C0]
-  stp    d24,d25, [x0, #0x1D0]
-  stp    d26,d27, [x0, #0x1E0]
-  stp    d28,d29, [x0, #0x1F0]
-  str    d30,     [x0, #0x200]
-  str    d31,     [x0, #0x208]
-  ldr    x0, #0      ; return UNW_ESUCCESS
-  ret
-
-#endif
-
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindRegistersSave.S b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindRegistersSave.S
new file mode 100644
index 0000000..eccc88c
--- /dev/null
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/UnwindRegistersSave.S
@@ -0,0 +1,392 @@
+//===------------------------ UnwindRegistersSave.S -----------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "assembly.h"
+
+    .text
+
+#if __i386__
+
+#
+# extern int unw_getcontext(unw_context_t* thread_state)
+#
+# On entry:
+#   +                       +
+#   +-----------------------+
+#   + thread_state pointer  +
+#   +-----------------------+
+#   + return address        +
+#   +-----------------------+   <-- SP
+#   +                       +
+#
+DEFINE_LIBUNWIND_FUNCTION(unw_getcontext)
+  push  %eax
+  movl  8(%esp), %eax
+  movl  %ebx,  4(%eax)
+  movl  %ecx,  8(%eax)
+  movl  %edx, 12(%eax)
+  movl  %edi, 16(%eax)
+  movl  %esi, 20(%eax)
+  movl  %ebp, 24(%eax)
+  movl  %esp, %edx
+  addl  $8, %edx
+  movl  %edx, 28(%eax)  # store what sp was at call site as esp
+  # skip ss
+  # skip eflags
+  movl  4(%esp), %edx
+  movl  %edx, 40(%eax)  # store return address as eip
+  # skip cs
+  # skip ds
+  # skip es
+  # skip fs
+  # skip gs
+  movl  (%esp), %edx
+  movl  %edx, (%eax)  # store original eax
+  popl  %eax
+  xorl  %eax, %eax    # return UNW_ESUCCESS
+  ret
+
+#elif __x86_64__
+
+#
+# extern int unw_getcontext(unw_context_t* thread_state)
+#
+# On entry:
+#  thread_state pointer is in rdi
+#
+DEFINE_LIBUNWIND_FUNCTION(unw_getcontext)
+  movq  %rax,   (%rdi)
+  movq  %rbx,  8(%rdi)
+  movq  %rcx, 16(%rdi)
+  movq  %rdx, 24(%rdi)
+  movq  %rdi, 32(%rdi)
+  movq  %rsi, 40(%rdi)
+  movq  %rbp, 48(%rdi)
+  movq  %rsp, 56(%rdi)
+  addq  $8,   56(%rdi)
+  movq  %r8,  64(%rdi)
+  movq  %r9,  72(%rdi)
+  movq  %r10, 80(%rdi)
+  movq  %r11, 88(%rdi)
+  movq  %r12, 96(%rdi)
+  movq  %r13,104(%rdi)
+  movq  %r14,112(%rdi)
+  movq  %r15,120(%rdi)
+  movq  (%rsp),%rsi
+  movq  %rsi,128(%rdi) # store return address as rip
+  # skip rflags
+  # skip cs
+  # skip fs
+  # skip gs
+  xorl  %eax, %eax    # return UNW_ESUCCESS
+  ret
+
+#elif __ppc__
+
+;
+; extern int unw_getcontext(unw_context_t* thread_state)
+;
+; On entry:
+;  thread_state pointer is in r3
+;
+DEFINE_LIBUNWIND_FUNCTION(unw_getcontext)
+  stw    r0,  8(r3)
+  mflr  r0
+  stw    r0,  0(r3)  ; store lr as ssr0
+  stw    r1, 12(r3)
+  stw    r2, 16(r3)
+  stw    r3, 20(r3)
+  stw    r4, 24(r3)
+  stw    r5, 28(r3)
+  stw    r6, 32(r3)
+  stw    r7, 36(r3)
+  stw    r8, 40(r3)
+  stw    r9, 44(r3)
+  stw     r10, 48(r3)
+  stw     r11, 52(r3)
+  stw     r12, 56(r3)
+  stw     r13, 60(r3)
+  stw     r14, 64(r3)
+  stw     r15, 68(r3)
+  stw     r16, 72(r3)
+  stw     r17, 76(r3)
+  stw     r18, 80(r3)
+  stw     r19, 84(r3)
+  stw     r20, 88(r3)
+  stw     r21, 92(r3)
+  stw     r22, 96(r3)
+  stw     r23,100(r3)
+  stw     r24,104(r3)
+  stw     r25,108(r3)
+  stw     r26,112(r3)
+  stw     r27,116(r3)
+  stw     r28,120(r3)
+  stw     r29,124(r3)
+  stw     r30,128(r3)
+  stw     r31,132(r3)
+
+  ; save VRSave register
+  mfspr  r0,256
+  stw    r0,156(r3)
+  ; save CR registers
+  mfcr  r0
+  stw    r0,136(r3)
+  ; save CTR register
+  mfctr  r0
+  stw    r0,148(r3)
+
+  ; save float registers
+  stfd    f0, 160(r3)
+  stfd    f1, 168(r3)
+  stfd    f2, 176(r3)
+  stfd    f3, 184(r3)
+  stfd    f4, 192(r3)
+  stfd    f5, 200(r3)
+  stfd    f6, 208(r3)
+  stfd    f7, 216(r3)
+  stfd    f8, 224(r3)
+  stfd    f9, 232(r3)
+  stfd    f10,240(r3)
+  stfd    f11,248(r3)
+  stfd    f12,256(r3)
+  stfd    f13,264(r3)
+  stfd    f14,272(r3)
+  stfd    f15,280(r3)
+  stfd    f16,288(r3)
+  stfd    f17,296(r3)
+  stfd    f18,304(r3)
+  stfd    f19,312(r3)
+  stfd    f20,320(r3)
+  stfd    f21,328(r3)
+  stfd    f22,336(r3)
+  stfd    f23,344(r3)
+  stfd    f24,352(r3)
+  stfd    f25,360(r3)
+  stfd    f26,368(r3)
+  stfd    f27,376(r3)
+  stfd    f28,384(r3)
+  stfd    f29,392(r3)
+  stfd    f30,400(r3)
+  stfd    f31,408(r3)
+
+
+  ; save vector registers
+
+  subi  r4,r1,16
+  rlwinm  r4,r4,0,0,27  ; mask low 4-bits
+  ; r4 is now a 16-byte aligned pointer into the red zone
+
+#define SAVE_VECTOR_UNALIGNED(_vec, _offset) \
+  stvx  _vec,0,r4           @\
+  lwz    r5, 0(r4)          @\
+  stw    r5, _offset(r3)    @\
+  lwz    r5, 4(r4)          @\
+  stw    r5, _offset+4(r3)  @\
+  lwz    r5, 8(r4)          @\
+  stw    r5, _offset+8(r3)  @\
+  lwz    r5, 12(r4)         @\
+  stw    r5, _offset+12(r3)
+
+  SAVE_VECTOR_UNALIGNED( v0, 424+0x000)
+  SAVE_VECTOR_UNALIGNED( v1, 424+0x010)
+  SAVE_VECTOR_UNALIGNED( v2, 424+0x020)
+  SAVE_VECTOR_UNALIGNED( v3, 424+0x030)
+  SAVE_VECTOR_UNALIGNED( v4, 424+0x040)
+  SAVE_VECTOR_UNALIGNED( v5, 424+0x050)
+  SAVE_VECTOR_UNALIGNED( v6, 424+0x060)
+  SAVE_VECTOR_UNALIGNED( v7, 424+0x070)
+  SAVE_VECTOR_UNALIGNED( v8, 424+0x080)
+  SAVE_VECTOR_UNALIGNED( v9, 424+0x090)
+  SAVE_VECTOR_UNALIGNED(v10, 424+0x0A0)
+  SAVE_VECTOR_UNALIGNED(v11, 424+0x0B0)
+  SAVE_VECTOR_UNALIGNED(v12, 424+0x0C0)
+  SAVE_VECTOR_UNALIGNED(v13, 424+0x0D0)
+  SAVE_VECTOR_UNALIGNED(v14, 424+0x0E0)
+  SAVE_VECTOR_UNALIGNED(v15, 424+0x0F0)
+  SAVE_VECTOR_UNALIGNED(v16, 424+0x100)
+  SAVE_VECTOR_UNALIGNED(v17, 424+0x110)
+  SAVE_VECTOR_UNALIGNED(v18, 424+0x120)
+  SAVE_VECTOR_UNALIGNED(v19, 424+0x130)
+  SAVE_VECTOR_UNALIGNED(v20, 424+0x140)
+  SAVE_VECTOR_UNALIGNED(v21, 424+0x150)
+  SAVE_VECTOR_UNALIGNED(v22, 424+0x160)
+  SAVE_VECTOR_UNALIGNED(v23, 424+0x170)
+  SAVE_VECTOR_UNALIGNED(v24, 424+0x180)
+  SAVE_VECTOR_UNALIGNED(v25, 424+0x190)
+  SAVE_VECTOR_UNALIGNED(v26, 424+0x1A0)
+  SAVE_VECTOR_UNALIGNED(v27, 424+0x1B0)
+  SAVE_VECTOR_UNALIGNED(v28, 424+0x1C0)
+  SAVE_VECTOR_UNALIGNED(v29, 424+0x1D0)
+  SAVE_VECTOR_UNALIGNED(v30, 424+0x1E0)
+  SAVE_VECTOR_UNALIGNED(v31, 424+0x1F0)
+
+  li  r3, 0    ; return UNW_ESUCCESS
+  blr
+
+
+#elif __arm64__
+
+;
+; extern int unw_getcontext(unw_context_t* thread_state)
+;
+; On entry:
+;  thread_state pointer is in x0
+;
+  ; skip restore of x0,x1 for now
+  ldp    x2, x3,  [x0, #0x010]
+  ldp    x4, x5,  [x0, #0x020]
+  ldp    x6, x7,  [x0, #0x030]
+  ldp    x8, x9,  [x0, #0x040]
+  ldp    x10,x11, [x0, #0x050]
+  ldp    x12,x13, [x0, #0x060]
+  ldp    x14,x15, [x0, #0x070]
+  ldp    x16,x17, [x0, #0x080]
+  ldp    x18,x19, [x0, #0x090]
+  ldp    x20,x21, [x0, #0x0A0]
+  ldp    x22,x23, [x0, #0x0B0]
+  ldp    x24,x25, [x0, #0x0C0]
+  ldp    x26,x27, [x0, #0x0D0]
+  ldp    x28,fp,  [x0, #0x0E0]
+  ldr    lr,      [x0, #0x100]  ; restore pc into lr
+  ldr    x1,      [x0, #0x0F8]
+  mov    sp,x1          ; restore sp
+
+  ldp    d0, d1,  [x0, #0x110]
+  ldp    d2, d3,  [x0, #0x120]
+  ldp    d4, d5,  [x0, #0x130]
+  ldp    d6, d7,  [x0, #0x140]
+  ldp    d8, d9,  [x0, #0x150]
+  ldp    d10,d11, [x0, #0x160]
+  ldp    d12,d13, [x0, #0x170]
+  ldp    d14,d15, [x0, #0x180]
+  ldp    d16,d17, [x0, #0x190]
+  ldp    d18,d19, [x0, #0x1A0]
+  ldp    d20,d21, [x0, #0x1B0]
+  ldp    d22,d23, [x0, #0x1C0]
+  ldp    d24,d25, [x0, #0x1D0]
+  ldp    d26,d27, [x0, #0x1E0]
+  ldp    d28,d29, [x0, #0x1F0]
+  ldr    d30,     [x0, #0x200]
+  ldr    d31,     [x0, #0x208]
+
+  ldp    x0, x1,  [x0, #0x000]  ; restore x0,x1
+  ret    lr            ; jump to pc
+
+
+
+#elif __arm__ && !__APPLE__
+
+@
+@ extern int unw_getcontext(unw_context_t* thread_state)
+@
+@ On entry:
+@  thread_state pointer is in r0
+@ 
+@ Per EHABI #4.7 this only saves the core integer registers.
+@ EHABI #7.4.5 notes that in general all VRS registers should be restored
+@ however this is very hard to do for VFP registers because it is unknown
+@ to the lbirary how many registers are implemented by the architecture.
+@ Instead, VFP registers are demand saved by logic external to unw_getcontext.
+@
+  .p2align 2
+DEFINE_LIBUNWIND_FUNCTION(unw_getcontext)
+  @ 32bit thumb-2 restrictions for stm:
+  @ . the sp (r13) cannot be in the list
+  @ . the pc (r15) cannot be in the list in an STM instruction
+  stm r0, {r0-r12}
+  str sp, [r0, #52]
+  str lr, [r0, #56]
+  str lr, [r0, #60]  @ store return address as pc
+  mov r0, #0         @ return UNW_ESUCCESS
+#if _ARM_ARCH > 4
+  bx lr
+#else
+  mov pc, lr
+#endif
+
+@
+@ static void libunwind::Registers_arm::saveVFPWithFSTMD(unw_fpreg_t* values)
+@
+@ On entry:
+@  values pointer is in r0
+@
+  .p2align 2
+DEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_arm16saveVFPWithFSTMDEPy)
+  fstmiad r0, {d0-d15}
+  mov pc, lr
+
+@
+@ static void libunwind::Registers_arm::saveVFPWithFSTMX(unw_fpreg_t* values)
+@
+@ On entry:
+@  values pointer is in r0
+@
+  .p2align 2
+DEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_arm16saveVFPWithFSTMXEPy)
+  fstmiax r0, {d0-d15}
+  mov pc, lr
+
+@
+@ static void libunwind::Registers_arm::saveVFPv3(unw_fpreg_t* values)
+@
+@ On entry:
+@  values pointer is in r0
+@
+  .p2align 2
+DEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_arm9saveVFPv3EPy)
+  @ d16-d31 are only available when compiling with -mfpu=vfpv3. We don't want to
+  @ do that in the library (because we don't want the compiler to generate
+  @ instructions that access those), but this is only accessed if the
+  @ personality routine needs these registers, which implies they are actually,
+  @ available on the target, so it's ok to execute.
+  @ So, generate the instruction using the corresponding coprocessor mnemonic.
+  stcl p11, cr0, [r0], {#0x20}  @ vldm r0, {d16-d31}
+  mov pc, lr
+
+@
+@ static void libunwind::Registers_arm::saveiWMMX(unw_fpreg_t* values)
+@
+@ On entry:
+@  values pointer is in r0
+@
+  .p2align 2
+DEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_arm9saveiWMMXEPy)
+  stcl p1, cr0, [r0], #8  @ wstrd wR0, [r0], #8
+  stcl p1, cr1, [r0], #8  @ wstrd wR1, [r0], #8
+  stcl p1, cr2, [r0], #8  @ wstrd wR2, [r0], #8
+  stcl p1, cr3, [r0], #8  @ wstrd wR3, [r0], #8
+  stcl p1, cr4, [r0], #8  @ wstrd wR4, [r0], #8
+  stcl p1, cr5, [r0], #8  @ wstrd wR5, [r0], #8
+  stcl p1, cr6, [r0], #8  @ wstrd wR6, [r0], #8
+  stcl p1, cr7, [r0], #8  @ wstrd wR7, [r0], #8
+  stcl p1, cr8, [r0], #8  @ wstrd wR8, [r0], #8
+  stcl p1, cr9, [r0], #8  @ wstrd wR9, [r0], #8
+  stcl p1, cr10, [r0], #8  @ wstrd wR10, [r0], #8
+  stcl p1, cr11, [r0], #8  @ wstrd wR11, [r0], #8
+  stcl p1, cr12, [r0], #8  @ wstrd wR12, [r0], #8
+  stcl p1, cr13, [r0], #8  @ wstrd wR13, [r0], #8
+  stcl p1, cr14, [r0], #8  @ wstrd wR14, [r0], #8
+  stcl p1, cr15, [r0], #8  @ wstrd wR15, [r0], #8
+  mov pc, lr
+
+@
+@ static void libunwind::Registers_arm::saveiWMMXControl(unw_uint32_t* values)
+@
+@ On entry:
+@  values pointer is in r0
+@
+  .p2align 2
+DEFINE_LIBUNWIND_PRIVATE_FUNCTION(_ZN9libunwind13Registers_arm16saveiWMMXControlEPj)
+  stc2 p1, cr8, [r0], #4  @ wstrw wCGR0, [r0], #4
+  stc2 p1, cr9, [r0], #4  @ wstrw wCGR1, [r0], #4
+  stc2 p1, cr10, [r0], #4  @ wstrw wCGR2, [r0], #4
+  stc2 p1, cr11, [r0], #4  @ wstrw wCGR3, [r0], #4
+  mov pc, lr
+
+#endif
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/assembly.h b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/assembly.h
new file mode 100644
index 0000000..210d350
--- /dev/null
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/assembly.h
@@ -0,0 +1,46 @@
+/* ===-- assembly.h - libUnwind assembler support macros -------------------===
+ *
+ *                     The LLVM Compiler Infrastructure
+ *
+ * This file is dual licensed under the MIT and the University of Illinois Open
+ * Source Licenses. See LICENSE.TXT for details.
+ *
+ * ===----------------------------------------------------------------------===
+ *
+ * This file defines macros for use in libUnwind assembler source.
+ * This file is not part of the interface of this library.
+ *
+ * ===----------------------------------------------------------------------===
+ */
+
+#ifndef UNWIND_ASSEMBLY_H
+#define UNWIND_ASSEMBLY_H
+
+#if defined(__POWERPC__) || defined(__powerpc__) || defined(__ppc__)
+#define SEPARATOR @
+#elif defined(__arm64__)
+#define SEPARATOR %%
+#else
+#define SEPARATOR ;
+#endif
+
+#if defined(__APPLE__)
+#define HIDDEN_DIRECTIVE .private_extern
+#else
+#define HIDDEN_DIRECTIVE .hidden
+#endif
+
+#define GLUE2(a, b) a ## b
+#define GLUE(a, b) GLUE2(a, b)
+#define SYMBOL_NAME(name) GLUE(__USER_LABEL_PREFIX__, name)
+
+#define DEFINE_LIBUNWIND_FUNCTION(name)                   \
+  .globl SYMBOL_NAME(name) SEPARATOR                      \
+  SYMBOL_NAME(name):
+
+#define DEFINE_LIBUNWIND_PRIVATE_FUNCTION(name)           \
+  .globl SYMBOL_NAME(name) SEPARATOR                      \
+  HIDDEN_DIRECTIVE SYMBOL_NAME(name) SEPARATOR            \
+  SYMBOL_NAME(name):
+
+#endif /* UNWIND_ASSEMBLY_H */
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/config.h b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/config.h
index 2b92464..0d15d71 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/config.h
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/config.h
@@ -14,16 +14,23 @@
 #ifndef LIBUNWIND_CONFIG_H
 #define LIBUNWIND_CONFIG_H
 
+#ifndef NDEBUG
+#include <stdio.h> // for logging
+#endif
+
 #include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
 
 // Define static_assert() unless already defined by compiler.
 #ifndef __has_feature
   #define __has_feature(__x) 0
 #endif
-#if !(__has_feature(cxx_static_assert))
-  #define static_assert(__b, __m) \
-      extern int compile_time_assert_failed[ ( __b ) ? 1 : -1 ]  \
-                                                  __attribute__( ( unused ) );
+#if !(__has_feature(cxx_static_assert)) && !defined(static_assert)
+// TODO(ajwong): This caused some compile failures on gcc.
+//  #define static_assert(__b, __m) \
+//      extern int compile_time_assert_failed[ ( __b ) ? 1 : -1 ]  \
+//                                                  __attribute__( ( unused ) );
 #endif
 
 // Platform specific configuration defines.
@@ -47,26 +54,36 @@
   #define _LIBUNWIND_ABORT(msg) __assert_rtn(__func__, __FILE__, __LINE__, msg)
 
   #if FOR_DYLD
-    #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 1
-    #define _LIBUNWIND_SUPPORT_DWARF_UNWIND   0
-    #define _LIBUNWIND_SUPPORT_DWARF_INDEX    0
+    #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND   1
+    #define _LIBUNWIND_SUPPORT_DWARF_UNWIND     0
+    #define _LIBUNWIND_SUPPORT_DWARF_INDEX      0
+    #define _LIBUNWIND_IS_BAREMETAL             0
   #else
-    #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 1
-    #define _LIBUNWIND_SUPPORT_DWARF_UNWIND   1
-    #define _LIBUNWIND_SUPPORT_DWARF_INDEX    0
+    #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND   1
+    #define _LIBUNWIND_SUPPORT_DWARF_UNWIND     1
+    #define _LIBUNWIND_SUPPORT_DWARF_INDEX      0
+    #define _LIBUNWIND_IS_BAREMETAL             0
   #endif
 
 #else
-  // #define _LIBUNWIND_BUILD_ZERO_COST_APIS
-  // #define _LIBUNWIND_BUILD_SJLJ_APIS
-  // #define _LIBUNWIND_SUPPORT_FRAME_APIS
-  // #define _LIBUNWIND_EXPORT
-  // #define _LIBUNWIND_HIDDEN
-  // #define _LIBUNWIND_LOG()
-  // #define _LIBUNWIND_ABORT()
-  // #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND
-  // #define _LIBUNWIND_SUPPORT_DWARF_UNWIND
-  // #define _LIBUNWIND_SUPPORT_DWARF_INDEX
+  static inline void assert_rtn(const char* func, const char* file, int line, const char* msg)  __attribute__ ((noreturn));
+  static inline void assert_rtn(const char* func, const char* file, int line, const char* msg) {
+    fprintf(stderr, "libunwind: %s %s:%d - %s\n",  func, file, line, msg);
+    assert(false);
+    abort();
+  }
+  #define _LIBUNWIND_BUILD_ZERO_COST_APIS (__i386__ || __x86_64__ || __arm64__ || __arm__)
+  #define _LIBUNWIND_BUILD_SJLJ_APIS      0
+  #define _LIBUNWIND_SUPPORT_FRAME_APIS   (__i386__ || __x86_64__)
+  #define _LIBUNWIND_EXPORT               __attribute__((visibility("default")))
+  #define _LIBUNWIND_HIDDEN               __attribute__((visibility("hidden")))
+  #define _LIBUNWIND_LOG(msg, ...) fprintf(stderr, "libuwind: " msg, __VA_ARGS__)
+  #define _LIBUNWIND_ABORT(msg) assert_rtn(__func__, __FILE__, __LINE__, msg)
+
+  #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND   0
+  #define _LIBUNWIND_SUPPORT_DWARF_UNWIND     0
+  #define _LIBUNWIND_SUPPORT_DWARF_INDEX      0
+  #define _LIBUNWIND_IS_BAREMETAL             0
 #endif
 
 
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/libunwind.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/libunwind.cpp
index 2043ac2..0c07c15 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/libunwind.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/Unwind/libunwind.cpp
@@ -12,11 +12,16 @@
 
 #include <libunwind.h>
 
+#ifndef NDEBUG
+#include <cstdlib> // getenv
+#endif
 #include <new>
 
 #include "libunwind_ext.h"
 #include "config.h"
 
+#include <stdlib.h>
+
 
 #if _LIBUNWIND_BUILD_ZERO_COST_APIS
 
@@ -50,6 +55,9 @@
 #elif __arm64__
   new ((void *)cursor) UnwindCursor<LocalAddressSpace, Registers_arm64>(
                                  context, LocalAddressSpace::sThisAddressSpace);
+#elif __arm__
+  new ((void *)cursor) UnwindCursor<LocalAddressSpace, Registers_arm>(
+                                 context, LocalAddressSpace::sThisAddressSpace);
 #endif
   AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
   co->setInfoBasedOnIPRegister();
@@ -160,24 +168,16 @@
 /// Set value of specified register at cursor position in stack frame.
 _LIBUNWIND_EXPORT int unw_set_reg(unw_cursor_t *cursor, unw_regnum_t regNum,
                                   unw_word_t value) {
-  _LIBUNWIND_TRACE_API("unw_set_reg(cursor=%p, regNum=%d, value=0x%llX)\n",
-                             cursor, regNum, value);
+  _LIBUNWIND_TRACE_API("unw_set_reg(cursor=%p, regNum=%d, value=0x%lX)\n",
+                       cursor, regNum, (long)value);
   typedef LocalAddressSpace::pint_t pint_t;
   AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
   if (co->validReg(regNum)) {
     co->setReg(regNum, (pint_t)value);
     // specical case altering IP to re-find info (being called by personality
     // function)
-    if (regNum == UNW_REG_IP) {
-      unw_proc_info_t info;
-      co->getInfo(&info);
-      pint_t orgArgSize = (pint_t)info.gp;
-      uint64_t orgFuncStart = info.start_ip;
+    if (regNum == UNW_REG_IP)
       co->setInfoBasedOnIPRegister(false);
-      // and adjust REG_SP if there was a DW_CFA_GNU_args_size
-      if ((orgFuncStart == info.start_ip) && (orgArgSize != 0))
-        co->setReg(UNW_REG_SP, co->getReg(UNW_REG_SP) + orgArgSize);
-    }
     return UNW_ESUCCESS;
   }
   return UNW_EBADREG;
@@ -201,8 +201,11 @@
 /// Set value of specified float register at cursor position in stack frame.
 _LIBUNWIND_EXPORT int unw_set_fpreg(unw_cursor_t *cursor, unw_regnum_t regNum,
                                     unw_fpreg_t value) {
-  _LIBUNWIND_TRACE_API("unw_set_fpreg(cursor=%p, regNum=%d, value=%g)\n",
-                             cursor, regNum, value);
+#if __arm__
+  _LIBUNWIND_TRACE_API("unw_set_fpreg(cursor=%p, regNum=%d, value=%llx)\n", cursor, regNum, value);
+#else
+  _LIBUNWIND_TRACE_API("unw_set_fpreg(cursor=%p, regNum=%d, value=%g)\n", cursor, regNum, value);
+#endif
   AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
   if (co->validFloatReg(regNum)) {
     co->setFloatReg(regNum, value);
@@ -247,7 +250,7 @@
 _LIBUNWIND_EXPORT int unw_get_proc_name(unw_cursor_t *cursor, char *buf,
                                         size_t bufLen, unw_word_t *offset) {
   _LIBUNWIND_TRACE_API("unw_get_proc_name(cursor=%p, &buf=%p,"
-                             "bufLen=%ld)\n", cursor, buf, bufLen);
+                             "bufLen=%zu)\n", cursor, buf, bufLen);
   AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
   if (co->getFunctionName(buf, bufLen, offset))
     return UNW_ESUCCESS;
@@ -282,6 +285,15 @@
   return co->isSignalFrame();
 }
 
+#if __arm__
+// Save VFP registers d0-d15 using FSTMIADX instead of FSTMIADD
+_LIBUNWIND_EXPORT void unw_save_vfp_as_X(unw_cursor_t *cursor) {
+  _LIBUNWIND_TRACE_API("unw_fpreg_save_vfp_as_X(cursor=%p)\n", cursor);
+  AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
+  return co->saveVFPAsX();
+}
+#endif
+
 
 #if _LIBUNWIND_SUPPORT_DWARF_UNWIND
 /// SPI: walks cached dwarf entries
@@ -324,6 +336,7 @@
 
 // Add logging hooks in Debug builds only
 #ifndef NDEBUG
+#include <stdlib.h>
 
 _LIBUNWIND_HIDDEN
 bool logAPIs() {
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/config.h b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/config.h
new file mode 100644
index 0000000..0ca9791
--- /dev/null
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/config.h
@@ -0,0 +1,48 @@
+//===----------------------------- config.h -------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//
+//  Defines macros used within the libc++abi project.
+//
+//===----------------------------------------------------------------------===//
+
+
+#ifndef LIBCXXABI_CONFIG_H
+#define LIBCXXABI_CONFIG_H
+
+#include <unistd.h>
+
+#if defined(_POSIX_THREADS) && _POSIX_THREADS > 0
+#  define LIBCXXABI_SINGLE_THREADED 0
+#else
+#  define LIBCXXABI_SINGLE_THREADED 1
+#endif
+
+// Set this in the CXXFLAGS when you need it, because otherwise we'd have to
+// #if !defined(__linux__) && !defined(__APPLE__) && ...
+// and so-on for *every* platform.
+#ifndef LIBCXXABI_BARE_METAL
+#  define LIBCXXABI_BARE_METAL 0
+#endif
+
+// -- BEGIN Taken from gabixx_config.h for gcc compat
+// Clang provides __sync_swap(), but GCC does not.
+// IMPORTANT: For GCC, __sync_lock_test_and_set has acquire semantics only
+// so an explicit __sync_synchronize is needed to ensure a full barrier.
+// TODO(digit): Use __atomic_swap_acq_rel when available.
+#if !defined(__clang__)
+#  define __sync_swap(address, value)  \
+  __extension__ ({ \
+    __typeof__(*(address)) __ret = __sync_lock_test_and_set((address),(value)); \
+    __sync_synchronize(); \
+    __ret; \
+  })
+#endif
+// -- END Taken from gabixx_config.h for gcc compat
+
+
+#endif // LIBCXXABI_CONFIG_H
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_aux_runtime.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_aux_runtime.cpp
index abd8091..15fede0 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_aux_runtime.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_aux_runtime.cpp
@@ -7,7 +7,7 @@
 //
 //
 // This file implements the "Auxiliary Runtime APIs"
-// http://www.codesourcery.com/public/cxx-abi/abi-eh.html#cxx-aux
+// http://mentorembedded.github.io/cxx-abi/abi-eh.html#cxx-aux
 //===----------------------------------------------------------------------===//
 
 #include "cxxabi.h"
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_default_handlers.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_default_handlers.cpp
index 27ffb71..583edb4 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_default_handlers.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_default_handlers.cpp
@@ -13,6 +13,7 @@
 #include <new>
 #include <exception>
 #include "abort_message.h"
+#include "config.h" // For __sync_swap
 #include "cxxabi.h"
 #include "cxa_handlers.hpp"
 #include "cxa_exception.hpp"
@@ -91,6 +92,9 @@
 std::unexpected_handler __cxa_unexpected_handler = default_unexpected_handler;
 
 // In the future these will become:
+// TODO(ajwong): Can this actually be true? Is std::atomic part of libc++? If so, do we have a
+// layering violation?
+//
 // std::atomic<std::terminate_handler>  __cxa_terminate_handler(default_terminate_handler);
 // std::atomic<std::unexpected_handler> __cxa_unexpected_handler(default_unexpected_handler);
 
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_demangle.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_demangle.cpp
index ba8225c..2d07686 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_demangle.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_demangle.cpp
@@ -38,7 +38,8 @@
 template <class C>
     const char* parse_encoding(const char* first, const char* last, C& db);
 template <class C>
-    const char* parse_name(const char* first, const char* last, C& db);
+    const char* parse_name(const char* first, const char* last, C& db,
+                           bool* ends_with_template_args = 0);
 template <class C>
     const char* parse_expression(const char* first, const char* last, C& db);
 template <class C>
@@ -155,7 +156,11 @@
 template <>
 struct float_data<long double>
 {
+#if defined(__arm__)
+    static const size_t mangled_size = 16;
+#else
     static const size_t mangled_size = 20;  // May need to be adjusted to 16 or 24 on other platforms
+#endif
     static const size_t max_demangled_size = 40;
     static constexpr const char* spec = "%LaL";
 };
@@ -352,6 +357,7 @@
 //                ::= Di   # char32_t
 //                ::= Ds   # char16_t
 //                ::= Da   # auto (in dependent new-expressions)
+//                ::= Dc   # decltype(auto)
 //                ::= Dn   # std::nullptr_t (i.e., decltype(nullptr))
 //                ::= u <source-name>    # vendor extended type
 
@@ -487,6 +493,10 @@
                     db.names.push_back("auto");
                     first += 2;
                     break;
+                case 'c':
+                    db.names.push_back("decltype(auto)");
+                    first += 2;
+                    break;
                 case 'n':
                     db.names.push_back("std::nullptr_t");
                     first += 2;
@@ -539,6 +549,8 @@
         {
             if (first[1] == '_')
             {
+                if (db.template_param.empty())
+                    return first;
                 if (!db.template_param.back().empty())
                 {
                     for (auto& t : db.template_param.back().front())
@@ -561,7 +573,7 @@
                     sub *= 10;
                     sub += static_cast<size_t>(*t - '0');
                 }
-                if (t == last || *t != '_')
+                if (t == last || *t != '_' || db.template_param.empty())
                     return first;
                 ++sub;
                 if (sub < db.template_param.back().size())
@@ -596,6 +608,8 @@
             const char* t1 = parse_expression(t, last, db);
             if (t1 != t)
             {
+                if (db.names.size() < 2)
+                    return first;
                 auto expr = db.names.back().move_full();
                 db.names.pop_back();
                 db.names.back() = "const_cast<" + db.names.back().move_full() + ">(" + expr + ")";
@@ -620,6 +634,8 @@
             const char* t1 = parse_expression(t, last, db);
             if (t1 != t)
             {
+                if (db.names.size() < 2)
+                    return first;
                 auto expr = db.names.back().move_full();
                 db.names.pop_back();
                 db.names.back() = "dynamic_cast<" + db.names.back().move_full() + ">(" + expr + ")";
@@ -644,6 +660,8 @@
             const char* t1 = parse_expression(t, last, db);
             if (t1 != t)
             {
+                if (db.names.size() < 2)
+                    return first;
                 auto expr = db.names.back().move_full();
                 db.names.pop_back();
                 db.names.back() = "reinterpret_cast<" + db.names.back().move_full() + ">(" + expr + ")";
@@ -668,6 +686,8 @@
             const char* t1 = parse_expression(t, last, db);
             if (t1 != t)
             {
+                if (db.names.size() < 2)
+                    return first;
                 auto expr = db.names.back().move_full();
                 db.names.pop_back();
                 db.names.back() = "static_cast<" + db.names.back().move_full() + ">(" + expr + ")";
@@ -704,6 +724,8 @@
         const char* t = parse_type(first+2, last, db);
         if (t != first+2)
         {
+            if (db.names.empty())
+                return first;
             db.names.back() = "sizeof (" + db.names.back().move_full() + ")";
             first = t;
         }
@@ -722,6 +744,8 @@
         const char* t = parse_expression(first+2, last, db);
         if (t != first+2)
         {
+            if (db.names.empty())
+                return first;
             db.names.back() = "sizeof (" + db.names.back().move_full() + ")";
             first = t;
         }
@@ -813,6 +837,8 @@
         const char* t = parse_function_param(first+2, last, db);
         if (t != first+2)
         {
+            if (db.names.empty())
+                return first;
             db.names.back() = "sizeof...(" + db.names.back().move_full() + ")";
             first = t;
         }
@@ -836,6 +862,8 @@
             t = parse_type(first+2, last, db);
         if (t != first+2)
         {
+            if (db.names.empty())
+                return first;
             db.names.back() = "typeid(" + db.names.back().move_full() + ")";
             first = t;
         }
@@ -854,6 +882,8 @@
         const char* t = parse_expression(first+2, last, db);
         if (t != first+2)
         {
+            if (db.names.empty())
+                return first;
             db.names.back() = "throw " + db.names.back().move_full();
             first = t;
         }
@@ -875,6 +905,8 @@
             const char* t1 = parse_expression(t, last, db);
             if (t1 != t)
             {
+                if (db.names.size() < 2)
+                    return first;
                 auto expr = db.names.back().move_full();
                 db.names.pop_back();
                 db.names.back().first += ".*" + expr;
@@ -899,6 +931,8 @@
             const char* t1 = parse_template_args(t, last, db);
             if (t1 != t)
             {
+                if (db.names.size() < 2)
+                    return first;
                 auto args = db.names.back().move_full();
                 db.names.pop_back();
                 db.names.back().first += std::move(args);
@@ -945,6 +979,8 @@
             t = parse_decltype(first, last, db);
             if (t != first)
             {
+                if (db.names.empty())
+                    return first;
                 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
                 first = t;
             }
@@ -960,6 +996,8 @@
                     t = parse_unqualified_name(first+2, last, db);
                     if (t != first+2)
                     {
+                        if (db.names.empty())
+                            return first;
                         db.names.back().first.insert(0, "std::");
                         db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
                         first = t;
@@ -986,6 +1024,8 @@
             t = parse_simple_id(first, last, db);
         if (t != first)
         {
+            if (db.names.empty())
+                return first;
             db.names.back().first.insert(0, "~");
             first = t;
         }
@@ -1017,6 +1057,8 @@
                     first = parse_template_args(t, last, db);
                     if (first != t)
                     {
+                        if (db.names.size() < 2)
+                            return first;
                         auto args = db.names.back().move_full();
                         db.names.pop_back();
                         db.names.back().first += std::move(args);
@@ -1041,6 +1083,8 @@
                     first = parse_template_args(t, last, db);
                     if (first != t)
                     {
+                        if (db.names.size() < 2)
+                            return first;
                         auto args = db.names.back().move_full();
                         db.names.pop_back();
                         db.names.back().first += std::move(args);
@@ -1090,7 +1134,11 @@
         if (t2 != t)
         {
             if (global)
+            {
+                if (db.names.empty())
+                    return first;
                 db.names.back().first.insert(0, "::");
+            }
             first = t2;
         }
         else if (last - t > 2 && t[0] == 's' && t[1] == 'r')
@@ -1105,6 +1153,8 @@
                 t1 = parse_template_args(t, last, db);
                 if (t1 != t)
                 {
+                    if (db.names.size() < 2)
+                        return first;
                     auto args = db.names.back().move_full();
                     db.names.pop_back();
                     db.names.back().first += std::move(args);
@@ -1118,7 +1168,7 @@
                 while (*t != 'E')
                 {
                     t1 = parse_unresolved_qualifier_level(t, last, db);
-                    if (t1 == t || t1 == last)
+                    if (t1 == t || t1 == last || db.names.size() < 2)
                         return first;
                     auto s = db.names.back().move_full();
                     db.names.pop_back();
@@ -1129,9 +1179,12 @@
                 t1 = parse_base_unresolved_name(t, last, db);
                 if (t1 == t)
                 {
-                    db.names.pop_back();
+                    if (!db.names.empty())
+                        db.names.pop_back();
                     return first;
                 }
+                if (db.names.size() < 2)
+                    return first;
                 auto s = db.names.back().move_full();
                 db.names.pop_back();
                 db.names.back().first += "::" + std::move(s);
@@ -1147,6 +1200,8 @@
                     t1 = parse_template_args(t, last, db);
                     if (t1 != t)
                     {
+                        if (db.names.size() < 2)
+                            return first;
                         auto args = db.names.back().move_full();
                         db.names.pop_back();
                         db.names.back().first += std::move(args);
@@ -1155,9 +1210,12 @@
                     t1 = parse_base_unresolved_name(t, last, db);
                     if (t1 == t)
                     {
-                        db.names.pop_back();
+                        if (!db.names.empty())
+                            db.names.pop_back();
                         return first;
                     }
+                    if (db.names.size() < 2)
+                        return first;
                     auto s = db.names.back().move_full();
                     db.names.pop_back();
                     db.names.back().first += "::" + std::move(s);
@@ -1170,11 +1228,15 @@
                         return first;
                     t = t1;
                     if (global)
+                    {
+                        if (db.names.empty())
+                            return first;
                         db.names.back().first.insert(0, "::");
+                    }
                     while (*t != 'E')
                     {
                         t1 = parse_unresolved_qualifier_level(t, last, db);
-                        if (t1 == t || t1 == last)
+                        if (t1 == t || t1 == last || db.names.size() < 2)
                             return first;
                         auto s = db.names.back().move_full();
                         db.names.pop_back();
@@ -1185,9 +1247,12 @@
                     t1 = parse_base_unresolved_name(t, last, db);
                     if (t1 == t)
                     {
-                        db.names.pop_back();
+                        if (!db.names.empty())
+                            db.names.pop_back();
                         return first;
                     }
+                    if (db.names.size() < 2)
+                        return first;
                     auto s = db.names.back().move_full();
                     db.names.pop_back();
                     db.names.back().first += "::" + std::move(s);
@@ -1213,6 +1278,8 @@
             const char* t1 = parse_unresolved_name(t, last, db);
             if (t1 != t)
             {
+                if (db.names.size() < 2)
+                    return first;
                 auto name = db.names.back().move_full();
                 db.names.pop_back();
                 db.names.back().first += "." + name;
@@ -1236,6 +1303,8 @@
         {
             if (t == last)
                 return first;
+            if (db.names.empty())
+                return first;
             db.names.back().first += db.names.back().second;
             db.names.back().second = typename C::String();
             db.names.back().first.append("(");
@@ -1245,10 +1314,14 @@
                 const char* t1 = parse_expression(t, last, db);
                 if (t1 == t || t1 == last)
                     return first;
+                if (db.names.empty())
+                    return first;
                 auto tmp = db.names.back().move_full();
                 db.names.pop_back();
                 if (!tmp.empty())
                 {
+                    if (db.names.empty())
+                        return first;
                     if (!first_expr)
                     {
                         db.names.back().first.append(", ");
@@ -1259,6 +1332,8 @@
                 t = t1;
             }
             ++t;
+            if (db.names.empty())
+                return first;
             db.names.back().first.append(")");
             first = t;
         }
@@ -1301,10 +1376,14 @@
                 has_expr_list = true;
                 if (!first_expr)
                 {
+                    if (db.names.empty())
+                        return first;
                     auto tmp = db.names.back().move_full();
                     db.names.pop_back();
                     if (!tmp.empty())
                     {
+                        if (db.names.empty())
+                            return first;
                         db.names.back().first.append(", ");
                         db.names.back().first.append(tmp);
                         first_expr = false;
@@ -1330,10 +1409,14 @@
                         return first;
                     if (!first_expr)
                     {
+                        if (db.names.empty())
+                            return first;
                         auto tmp = db.names.back().move_full();
                         db.names.pop_back();
                         if (!tmp.empty())
                         {
+                            if (db.names.empty())
+                                return first;
                             db.names.back().first.append(", ");
                             db.names.back().first.append(tmp);
                             first_expr = false;
@@ -1347,14 +1430,20 @@
             typename C::String init_list;
             if (has_init)
             {
+                if (db.names.empty())
+                    return first;
                 init_list = db.names.back().move_full();
                 db.names.pop_back();
             }
+            if (db.names.empty())
+                return first;
             auto type = db.names.back().move_full();
             db.names.pop_back();
             typename C::String expr_list;
             if (has_expr_list)
             {
+                if (db.names.empty())
+                    return first;
                 expr_list = db.names.back().move_full();
                 db.names.pop_back();
             }
@@ -1416,10 +1505,14 @@
                             return first;
                         if (!first_expr)
                         {
+                            if (db.names.empty())
+                                return first;
                             auto tmp = db.names.back().move_full();
                             db.names.pop_back();
                             if (!tmp.empty())
                             {
+                                if (db.names.empty())
+                                    return first;
                                 db.names.back().first.append(", ");
                                 db.names.back().first.append(tmp);
                                 first_expr = false;
@@ -1430,6 +1523,8 @@
                 }
                 ++t;
             }
+            if (db.names.size() < 2)
+                return first;
             auto tmp = db.names.back().move_full();
             db.names.pop_back();
             db.names.back() = "(" + db.names.back().move_full() + ")(" + tmp + ")";
@@ -1453,6 +1548,8 @@
             const char* t1 = parse_expression(t, last, db);
             if (t1 != t)
             {
+                if (db.names.size() < 2)
+                    return first;
                 auto tmp = db.names.back().move_full();
                 db.names.pop_back();
                 db.names.back().first += "->";
@@ -1545,6 +1642,8 @@
                     sig += " &&";
                     break;
                 }
+                if (db.names.empty())
+                    return first;
                 db.names.back().first += " ";
                 db.names.back().second.insert(0, sig);
                 first = t;
@@ -1568,6 +1667,8 @@
             const char* t2 = parse_type(t, last, db);
             if (t2 != t)
             {
+                if (db.names.size() < 2)
+                    return first;
                 auto func = std::move(db.names.back());
                 db.names.pop_back();
                 auto class_type = std::move(db.names.back());
@@ -1602,6 +1703,8 @@
             const char* t = parse_type(first+2, last, db);
             if (t != first+2)
             {
+                if (db.names.empty())
+                    return first;
                 if (db.names.back().second.substr(0, 2) == " [")
                     db.names.back().second.erase(0, 1);
                 db.names.back().second.insert(0, " []");
@@ -1616,6 +1719,8 @@
                 const char* t2 = parse_type(t+1, last, db);
                 if (t2 != t+1)
                 {
+                    if (db.names.empty())
+                        return first;
                     if (db.names.back().second.substr(0, 2) == " [")
                         db.names.back().second.erase(0, 1);
                     db.names.back().second.insert(0, " [" + typename C::String(first+1, t) + "]");
@@ -1631,6 +1736,8 @@
                 const char* t2 = parse_type(++t, last, db);
                 if (t2 != t)
                 {
+                    if (db.names.size() < 2)
+                        return first;
                     auto type = std::move(db.names.back());
                     db.names.pop_back();
                     auto expr = std::move(db.names.back());
@@ -1663,6 +1770,8 @@
                 const char* t = parse_expression(first+2, last, db);
                 if (t != first+2 && t != last && *t == 'E')
                 {
+                    if (db.names.empty())
+                        return first;
                     db.names.back() = "decltype(" + db.names.back().move_full() + ")";
                     first = t+1;
                 }
@@ -1700,6 +1809,8 @@
                     const char* t1 = parse_type(t, last, db);
                     if (t1 != t)
                     {
+                        if (db.names.empty())
+                            return first;
                         db.names.back().first += " vector[" + typename C::String(num, sz) + "]";
                         first = t1;
                     }
@@ -1721,6 +1832,8 @@
                 const char* t = parse_expression(t1, last, db);
                 if (t != t1)
                 {
+                    if (db.names.empty())
+                        return first;
                     num = db.names.back().move_full();
                     db.names.pop_back();
                     t1 = t;
@@ -1731,6 +1844,8 @@
                 const char* t = parse_type(t1, last, db);
                 if (t != t1)
                 {
+                    if (db.names.empty())
+                        return first;
                     db.names.back().first += " vector[" + num + "]";
                     first = t;
                 }
@@ -1841,6 +1956,8 @@
                         t = parse_array_type(first, last, db);
                         if (t != first)
                         {
+                            if (db.names.empty())
+                                return first;
                             first = t;
                             db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
                         }
@@ -1849,6 +1966,8 @@
                         t = parse_type(first+1, last, db);
                         if (t != first+1)
                         {
+                            if (db.names.empty())
+                                return first;
                             db.names.back().first.append(" complex");
                             first = t;
                             db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
@@ -1858,6 +1977,8 @@
                         t = parse_function_type(first, last, db);
                         if (t != first)
                         {
+                            if (db.names.empty())
+                                return first;
                             first = t;
                             db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
                         }
@@ -1866,6 +1987,8 @@
                         t = parse_type(first+1, last, db);
                         if (t != first+1)
                         {
+                            if (db.names.empty())
+                                return first;
                             db.names.back().first.append(" imaginary");
                             first = t;
                             db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
@@ -1875,6 +1998,8 @@
                         t = parse_pointer_to_member_type(first, last, db);
                         if (t != first)
                         {
+                            if (db.names.empty())
+                                return first;
                             first = t;
                             db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
                         }
@@ -2002,6 +2127,8 @@
                                 const char* t2 = parse_type(t, last, db);
                                 if (t2 != t)
                                 {
+                                    if (db.names.size() < 2)
+                                        return first;
                                     auto type = db.names.back().move_full();
                                     db.names.pop_back();
                                     if (db.names.back().first.substr(0, 9) != "objcproto")
@@ -2034,6 +2161,8 @@
                             t = parse_name(first, last, db);
                             if (t != first)
                             {
+                                if (db.names.empty())
+                                    return first;
                                 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
                                 first = t;
                             }
@@ -2049,6 +2178,8 @@
                                 t = parse_template_args(first, last, db);
                                 if (t != first)
                                 {
+                                    if (db.names.size() < 2)
+                                        return first;
                                     auto template_args = db.names.back().move_full();
                                     db.names.pop_back();
                                     db.names.back().first += template_args;
@@ -2084,6 +2215,8 @@
                                 t = parse_decltype(first, last, db);
                                 if (t != first)
                                 {
+                                    if (db.names.empty())
+                                        return first;
                                     db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
                                     first = t;
                                     return first;
@@ -2093,6 +2226,8 @@
                                 t = parse_vector_type(first, last, db);
                                 if (t != first)
                                 {
+                                    if (db.names.empty())
+                                        return first;
                                     db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
                                     first = t;
                                     return first;
@@ -2114,6 +2249,8 @@
                             t = parse_name(first, last, db);
                             if (t != first)
                             {
+                                if (db.names.empty())
+                                    return first;
                                 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
                                 first = t;
                             }
@@ -2150,6 +2287,7 @@
 //                   ::= gt    # >             
 //                   ::= ix    # []            
 //                   ::= le    # <=            
+//                   ::= li <source-name>  # operator ""
 //                   ::= ls    # <<            
 //                   ::= lS    # <<=           
 //                   ::= lt    # <             
@@ -2232,6 +2370,8 @@
                     db.try_to_parse_template_args = try_to_parse_template_args;
                     if (t != first+2)
                     {
+                        if (db.names.empty())
+                            return first;
                         db.names.back().first.insert(0, "operator ");
                         db.parsed_ctor_dtor_cv = true;
                         first = t;
@@ -2309,6 +2449,18 @@
                 db.names.push_back("operator<=");
                 first += 2;
                 break;
+            case 'i':
+                {
+                    const char* t = parse_source_name(first+2, last, db);
+                    if (t != first+2)
+                    {
+                        if (db.names.empty())
+                            return first;
+                        db.names.back().first.insert(0, "operator\"\" ");
+                        first = t;
+                    }
+                }
+                break;
             case 's':
                 db.names.push_back("operator<<");
                 first += 2;
@@ -2453,6 +2605,8 @@
                 const char* t = parse_source_name(first+2, last, db);
                 if (t != first+2)
                 {
+                    if (db.names.empty())
+                        return first;
                     db.names.back().first.insert(0, "operator ");
                     first = t;
                 }
@@ -2662,6 +2816,8 @@
                             ;
                         if (n != t && n != last && *n == 'E')
                         {
+                            if (db.names.empty())
+                                return first;
                             db.names.back() = "(" + db.names.back().move_full() + ")" + typename C::String(t, n);
                             first = n+1;
                             break;
@@ -2762,6 +2918,8 @@
             case '2':
             case '3':
             case '5':
+                if (db.names.empty())
+                    return first;
                 db.names.push_back(base_name(db.names.back().first));
                 first += 2;
                 db.parsed_ctor_dtor_cv = true;
@@ -2775,6 +2933,8 @@
             case '1':
             case '2':
             case '5':
+                if (db.names.empty())
+                    return first;
                 db.names.push_back("~" + base_name(db.names.back().first));
                 first += 2;
                 db.parsed_ctor_dtor_cv = true;
@@ -2845,6 +3005,8 @@
                     db.names.pop_back();
                     return first;
                 }
+                if (db.names.size() < 2)
+                    return first;
                 auto tmp = db.names.back().move_full();
                 db.names.pop_back();
                 db.names.back().first.append(tmp);
@@ -2854,6 +3016,8 @@
                     t1 = parse_type(t0, last, db);
                     if (t1 == t0)
                         break;
+                    if (db.names.size() < 2)
+                        return first;
                     tmp = db.names.back().move_full();
                     db.names.pop_back();
                     if (!tmp.empty())
@@ -2968,7 +3132,11 @@
         if (t1 != t0)
         {
             if (St)
+            {
+                if (db.names.empty())
+                    return first;
                 db.names.back().first.insert(0, "std::");
+            }
             first = t1;
         }
     }
@@ -2986,6 +3154,8 @@
         const char* t = parse_type(first+2, last, db);
         if (t != first+2)
         {
+            if (db.names.empty())
+                return first;
             db.names.back().first = "alignof (" + db.names.back().move_full() + ")";
             first = t;
         }
@@ -3004,6 +3174,8 @@
         const char* t = parse_expression(first+2, last, db);
         if (t != first+2)
         {
+            if (db.names.empty())
+                return first;
             db.names.back().first = "alignof (" + db.names.back().move_full() + ")";
             first = t;
         }
@@ -3018,6 +3190,8 @@
     const char* t1 = parse_expression(first, last, db);
     if (t1 != first)
     {
+        if (db.names.empty())
+            return first;
         db.names.back().first =  "noexcept (" + db.names.back().move_full() + ")";
         first = t1;
     }
@@ -3031,6 +3205,8 @@
     const char* t1 = parse_expression(first, last, db);
     if (t1 != first)
     {
+        if (db.names.empty())
+            return first;
         db.names.back().first =  op + "(" + db.names.back().move_full() + ")";
         first = t1;
     }
@@ -3047,6 +3223,8 @@
         const char* t2 = parse_expression(t1, last, db);
         if (t2 != t1)
         {
+            if (db.names.size() < 2)
+                return first;
             auto op2 = db.names.back().move_full();
             db.names.pop_back();
             auto op1 = db.names.back().move_full();
@@ -3197,6 +3375,8 @@
                     const char* t1 = parse_expression(t+2, last, db);
                     if (t1 != t+2)
                     {
+                        if (db.names.empty())
+                            return first;
                         db.names.back().first = (parsed_gs ? typename C::String("::") : typename C::String()) +
                                           "delete[] " + db.names.back().move_full();
                         first = t1;
@@ -3216,6 +3396,8 @@
                     const char* t1 = parse_expression(t+2, last, db);
                     if (t1 != t+2)
                     {
+                        if (db.names.empty())
+                            return first;
                         db.names.back().first = (parsed_gs ? typename C::String("::") : typename C::String()) +
                                           "delete " + db.names.back().move_full();
                         first = t1;
@@ -3286,6 +3468,8 @@
                     const char* t2 = parse_expression(t1, last, db);
                     if (t2 != t1)
                     {
+                        if (db.names.size() < 2)
+                            return first;
                         auto op2 = db.names.back().move_full();
                         db.names.pop_back();
                         auto op1 = db.names.back().move_full();
@@ -3357,6 +3541,8 @@
                     const char* t1 = parse_expression(first+2, last, db);
                     if (t1 != first+2)
                     {
+                        if (db.names.empty())
+                            return first;
                         db.names.back() = "(" + db.names.back().move_full() + ")--";
                         first = t1;
                     }
@@ -3445,6 +3631,8 @@
                     const char* t1 = parse_expression(first+2, last, db);
                     if (t1 != first+2)
                     {
+                        if (db.names.empty())
+                            return first;
                         db.names.back() = "(" + db.names.back().move_full() + ")++";
                         first = t1;
                     }
@@ -3472,6 +3660,8 @@
                         const char* t3 = parse_expression(t2, last, db);
                         if (t3 != t2)
                         {
+                            if (db.names.size() < 3)
+                                return first;
                             auto op3 = db.names.back().move_full();
                             db.names.pop_back();
                             auto op2 = db.names.back().move_full();
@@ -3708,7 +3898,8 @@
 
 template <class C>
 const char*
-parse_nested_name(const char* first, const char* last, C& db)
+parse_nested_name(const char* first, const char* last, C& db,
+                  bool* ends_with_template_args)
 {
     if (first != last && *first == 'N')
     {
@@ -3739,8 +3930,10 @@
             return first;
         }
         bool pop_subs = false;
+        bool component_ends_with_template_args = false;
         while (*t0 != 'E')
         {
+            component_ends_with_template_args = false;
             const char* t1;
             switch (*t0)
             {
@@ -3810,6 +4003,7 @@
                     db.names.back().first += name;
                     db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
                     t0 = t1;
+                    component_ends_with_template_args = true;
                 }
                 else
                     return first;
@@ -3841,6 +4035,8 @@
         db.cv = cv;
         if (pop_subs && !db.subs.empty())
             db.subs.pop_back();
+        if (ends_with_template_args)
+            *ends_with_template_args = component_ends_with_template_args;
     }
     return first;
 }
@@ -3888,7 +4084,8 @@
 
 template <class C>
 const char*
-parse_local_name(const char* first, const char* last, C& db)
+parse_local_name(const char* first, const char* last, C& db,
+                 bool* ends_with_template_args)
 {
     if (first != last && *first == 'Z')
     {
@@ -3899,6 +4096,8 @@
             {
             case 's':
                 first = parse_discriminator(t+1, last);
+                if (db.names.empty())
+                    return first;
                 db.names.back().first.append("::string literal");
                 break;
             case 'd':
@@ -3908,9 +4107,12 @@
                     if (t1 != last && *t1 == '_')
                     {
                         t = t1 + 1;
-                        t1 = parse_name(t, last, db);
+                        t1 = parse_name(t, last, db,
+                                        ends_with_template_args);
                         if (t1 != t)
                         {
+                            if (db.names.size() < 2)
+                                return first;
                             auto name = db.names.back().move_full();
                             db.names.pop_back();
                             db.names.back().first.append("::");
@@ -3924,11 +4126,14 @@
                 break;
             default:
                 {
-                    const char* t1 = parse_name(t, last, db);
+                    const char* t1 = parse_name(t, last, db,
+                                                ends_with_template_args);
                     if (t1 != t)
                     {
                         // parse but ignore discriminator
                         first = parse_discriminator(t1, last);
+                        if (db.names.size() < 2)
+                            return first;
                         auto name = db.names.back().move_full();
                         db.names.pop_back();
                         db.names.back().first.append("::");
@@ -3954,7 +4159,8 @@
 
 template <class C>
 const char*
-parse_name(const char* first, const char* last, C& db)
+parse_name(const char* first, const char* last, C& db,
+           bool* ends_with_template_args)
 {
     if (last - first >= 2)
     {
@@ -3966,14 +4172,16 @@
         {
         case 'N':
           {
-            const char* t1 = parse_nested_name(t0, last, db);
+            const char* t1 = parse_nested_name(t0, last, db,
+                                               ends_with_template_args);
             if (t1 != t0)
                 first = t1;
             break;
           }
         case 'Z':
           {
-            const char* t1 = parse_local_name(t0, last, db);
+            const char* t1 = parse_local_name(t0, last, db,
+                                              ends_with_template_args);
             if (t1 != t0)
                 first = t1;
             break;
@@ -3985,15 +4193,21 @@
             {
                 if (t1 != last && *t1 == 'I')  // <unscoped-template-name> <template-args>
                 {
+                    if (db.names.empty())
+                        return first;
                     db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
                     t0 = t1;
                     t1 = parse_template_args(t0, last, db);
                     if (t1 != t0)
                     {
+                        if (db.names.size() < 2)
+                            return first;
                         auto tmp = db.names.back().move_full();
                         db.names.pop_back();
                         db.names.back().first += tmp;
                         first = t1;
+                        if (ends_with_template_args)
+                            *ends_with_template_args = true;
                     }
                 }
                 else   // <unscoped-name>
@@ -4008,10 +4222,14 @@
                     t1 = parse_template_args(t0, last, db);
                     if (t1 != t0)
                     {
+                        if (db.names.size() < 2)
+                            return first;
                         auto tmp = db.names.back().move_full();
                         db.names.pop_back();
                         db.names.back().first += tmp;
                         first = t1;
+                        if (ends_with_template_args)
+                            *ends_with_template_args = true;
                     }
                 }
             }
@@ -4093,6 +4311,8 @@
                 t = parse_type(first+2, last, db);
                 if (t != first+2)
                 {
+                    if (db.names.empty())
+                        return first;
                     db.names.back().first.insert(0, "vtable for ");
                     first = t;
                 }
@@ -4102,6 +4322,8 @@
                 t = parse_type(first+2, last, db);
                 if (t != first+2)
                 {
+                    if (db.names.empty())
+                        return first;
                     db.names.back().first.insert(0, "VTT for ");
                     first = t;
                 }
@@ -4111,6 +4333,8 @@
                 t = parse_type(first+2, last, db);
                 if (t != first+2)
                 {
+                    if (db.names.empty())
+                        return first;
                     db.names.back().first.insert(0, "typeinfo for ");
                     first = t;
                 }
@@ -4120,6 +4344,8 @@
                 t = parse_type(first+2, last, db);
                 if (t != first+2)
                 {
+                    if (db.names.empty())
+                        return first;
                     db.names.back().first.insert(0, "typeinfo name for ");
                     first = t;
                 }
@@ -4136,6 +4362,8 @@
                 t = parse_encoding(t1, last, db);
                 if (t != t1)
                 {
+                    if (db.names.empty())
+                        return first;
                     db.names.back().first.insert(0, "covariant return thunk to ");
                     first = t;
                 }
@@ -4152,6 +4380,8 @@
                         const char* t1 = parse_type(++t0, last, db);
                         if (t1 != t0)
                         {
+                            if (db.names.size() < 2)
+                                return first;
                             auto left = db.names.back().move_full();
                             db.names.pop_back();
                             db.names.back().first = "construction vtable for " +
@@ -4171,6 +4401,8 @@
                 t = parse_encoding(t0, last, db);
                 if (t != t0)
                 {
+                    if (db.names.empty())
+                        return first;
                     if (first[2] == 'v')
                     {
                         db.names.back().first.insert(0, "virtual thunk to ");
@@ -4194,6 +4426,8 @@
                 t = parse_name(first+2, last, db);
                 if (t != first+2)
                 {
+                    if (db.names.empty())
+                        return first;
                     db.names.back().first.insert(0, "guard variable for ");
                     first = t;
                 }
@@ -4203,6 +4437,8 @@
                 t = parse_name(first+2, last, db);
                 if (t != first+2)
                 {
+                    if (db.names.empty())
+                        return first;
                     db.names.back().first.insert(0, "reference temporary for ");
                     first = t;
                 }
@@ -4214,6 +4450,26 @@
     return first;
 }
 
+template <class T>
+class save_value
+{
+    T& restore_;
+    T original_value_;
+public:
+    save_value(T& restore)
+        : restore_(restore),
+          original_value_(restore)
+        {}
+
+    ~save_value()
+    {
+        restore_ = std::move(original_value_);
+    }
+
+    save_value(const save_value&) = delete;
+    save_value& operator=(const save_value&) = delete;
+};
+
 // <encoding> ::= <function name> <bare-function-type>
 //            ::= <data name>
 //            ::= <special-name>
@@ -4224,6 +4480,11 @@
 {
     if (first != last)
     {
+        save_value<decltype(db.encoding_depth)> su(db.encoding_depth);
+        ++db.encoding_depth;
+        save_value<decltype(db.tag_templates)> sb(db.tag_templates);
+        if (db.encoding_depth > 1)
+            db.tag_templates = true;
         switch (*first)
         {
         case 'G':
@@ -4232,24 +4493,31 @@
             break;
         default:
           {
-            const char* t = parse_name(first, last, db);
+            bool ends_with_template_args = false;
+            const char* t = parse_name(first, last, db,
+                                       &ends_with_template_args);
             unsigned cv = db.cv;
             unsigned ref = db.ref;
             if (t != first)
             {
                 if (t != last && *t != 'E' && *t != '.')
                 {
-                    bool tag_templates = db.tag_templates;
+                    save_value<bool> sb2(db.tag_templates);
                     db.tag_templates = false;
                     const char* t2;
                     typename C::String ret2;
+                    if (db.names.empty())
+                        return first;
                     const typename C::String& nm = db.names.back().first;
-                    if (!db.parsed_ctor_dtor_cv && nm.back() == '>' && nm[nm.size()-2] != '-'
-                                                                    && nm[nm.size()-2] != '>')
+                    if (nm.empty())
+                        return first;
+                    if (!db.parsed_ctor_dtor_cv && ends_with_template_args)
                     {
                         t2 = parse_type(t, last, db);
                         if (t2 == t)
                             return first;
+                        if (db.names.size() < 2)
+                            return first;
                         auto ret1 = std::move(db.names.back().first);
                         ret2 = std::move(db.names.back().second);
                         if (ret2.empty())
@@ -4286,6 +4554,8 @@
                                     db.names.pop_back();
                                 if (!tmp.empty())
                                 {
+                                    if (db.names.empty())
+                                        return first;
                                     if (!first_arg)
                                         db.names.back().first += ", ";
                                     else
@@ -4296,6 +4566,8 @@
                             t = t2;
                         }
                     }
+                    if (db.names.empty())
+                        return first;
                     db.names.back().first += ')';
                     if (cv & 1)
                         db.names.back().first.append(" const");
@@ -4309,7 +4581,6 @@
                         db.names.back().first.append(" &&");
                     db.names.back().first += ret2;
                     first = t;
-                    db.tag_templates = tag_templates;
                 }
                 else
                     first = t;
@@ -4351,6 +4622,8 @@
             while (t != last && isdigit(*t))
                 ++t;
         }
+        if (db.names.empty())
+            return first;
         db.names.back().first.insert(0, "invocation function for block in ");
         first = t;
     }
@@ -4366,6 +4639,8 @@
 {
     if (first != last && *first == '.')
     {
+        if (db.names.empty())
+            return first;
         db.names.back().first += " (" + typename C::String(first, last) + ")";
         first = last;
     }
@@ -4572,29 +4847,54 @@
 const size_t bs = 4 * 1024;
 template <class T> using Alloc = short_alloc<T, bs>;
 template <class T> using Vector = std::vector<T, Alloc<T>>;
-using String = std::basic_string<char, std::char_traits<char>, malloc_alloc<char>>;
 
+template <class StrT>
 struct string_pair
 {
-    String first;
-    String second;
+    StrT first;
+    StrT second;
 
     string_pair() = default;
-    string_pair(String f) : first(std::move(f)) {}
-    string_pair(String f, String s)
+    string_pair(StrT f) : first(std::move(f)) {}
+    string_pair(StrT f, StrT s)
         : first(std::move(f)), second(std::move(s)) {}
     template <size_t N>
         string_pair(const char (&s)[N]) : first(s, N-1) {}
 
     size_t size() const {return first.size() + second.size();}
-    String full() const {return first + second;}
-    String move_full() {return std::move(first) + std::move(second);}
+    StrT full() const {return first + second;}
+    StrT move_full() {return std::move(first) + std::move(second);}
+};
+
+struct Db
+{
+    typedef std::basic_string<char, std::char_traits<char>,
+                              malloc_alloc<char>> String;
+    typedef Vector<string_pair<String>> sub_type;
+    typedef Vector<sub_type> template_param_type;
+    sub_type names;
+    template_param_type subs;
+    Vector<template_param_type> template_param;
+    unsigned cv;
+    unsigned ref;
+    unsigned encoding_depth;
+    bool parsed_ctor_dtor_cv;
+    bool tag_templates;
+    bool fix_forward_references;
+    bool try_to_parse_template_args;
+
+    template <size_t N>
+    Db(arena<N>& ar) :
+        names(ar),
+        subs(0, names, ar),
+        template_param(0, subs, ar)
+    {}
 };
 
 }  // unnamed namespace
 
-__attribute__ ((__visibility__("default")))
 extern "C"
+__attribute__ ((__visibility__("default")))
 char*
 __cxa_demangle(const char* mangled_name, char* buf, size_t* n, int* status)
 {
@@ -4606,31 +4906,10 @@
     }
     size_t internal_size = buf != nullptr ? *n : 0;
     arena<bs> a;
-    struct Db
-    {
-        typedef String String;
-        typedef Vector<string_pair> sub_type;
-        typedef Vector<sub_type> template_param_type;
-        Vector<string_pair> names;
-        Vector<sub_type> subs;
-        Vector<template_param_type> template_param;
-        unsigned cv;
-        unsigned ref;
-        bool parsed_ctor_dtor_cv;
-        bool tag_templates;
-        bool fix_forward_references;
-        bool try_to_parse_template_args;
-
-        template <size_t N>
-        Db(arena<N>& ar) :
-            names(ar),
-            subs(0, names, ar),
-            template_param(0, subs, ar)
-        {}
-    };
     Db db(a);
     db.cv = 0;
     db.ref = 0;
+    db.encoding_depth = 0;
     db.parsed_ctor_dtor_cv = false;
     db.tag_templates = true;
     db.template_param.emplace_back(a);
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_exception.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_exception.cpp
index c43777c..31ddc51 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_exception.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_exception.cpp
@@ -7,17 +7,19 @@
 //
 //  
 //  This file implements the "Exception Handling APIs"
-//  http://www.codesourcery.com/public/cxx-abi/abi-eh.html
+//  http://mentorembedded.github.io/cxx-abi/abi-eh.html
 //  
 //===----------------------------------------------------------------------===//
 
+#include "config.h"
 #include "cxxabi.h"
 
 #include <exception>        // for std::terminate
 #include <cstdlib>          // for malloc, free
 #include <cstring>          // for memset
-#include <pthread.h>
-
+#if !LIBCXXABI_SINGLE_THREADED
+#  include <pthread.h>      // for fallback_malloc.ipp's mutexes
+#endif
 #include "cxa_exception.hpp"
 #include "cxa_handlers.hpp"
 
@@ -232,7 +234,7 @@
     globals->uncaughtExceptions += 1;   // Not atomically, since globals are thread-local
 
     exception_header->unwindHeader.exception_cleanup = exception_cleanup_func;
-#if __arm__
+#if __USING_SJLJ_EXCEPTIONS__
     _Unwind_SjLj_RaiseException(&exception_header->unwindHeader);
 #else
     _Unwind_RaiseException(&exception_header->unwindHeader);
@@ -254,11 +256,102 @@
 void*
 __cxa_get_exception_ptr(void* unwind_exception) throw()
 {
+#if LIBCXXABI_ARM_EHABI
+    return reinterpret_cast<void*>(
+           static_cast<_Unwind_Control_Block*>(unwind_exception)->barrier_cache.bitpattern[0]);
+#else
     return cxa_exception_from_exception_unwind_exception
            (
                static_cast<_Unwind_Exception*>(unwind_exception)
            )->adjustedPtr;
+#endif
 }
+
+#if LIBCXXABI_ARM_EHABI
+/*
+The routine to be called before the cleanup.  This will save __cxa_exception in
+__cxa_eh_globals, so that __cxa_end_cleanup() can recover later.
+*/
+bool
+__cxa_begin_cleanup(void* unwind_arg) throw ()
+{
+    _Unwind_Exception* unwind_exception = static_cast<_Unwind_Exception*>(unwind_arg);
+    __cxa_eh_globals* globals = __cxa_get_globals();
+    __cxa_exception* exception_header =
+        cxa_exception_from_exception_unwind_exception(unwind_exception);
+
+    if (isOurExceptionClass(unwind_exception))
+    {
+        if (0 == exception_header->propagationCount)
+        {
+            exception_header->nextPropagatingException = globals->propagatingExceptions;
+            globals->propagatingExceptions = exception_header;
+        }
+        ++exception_header->propagationCount;
+    }
+    else
+    {
+        // If the propagatingExceptions stack is not empty, since we can't
+        // chain the foreign exception, terminate it.
+        if (NULL != globals->propagatingExceptions)
+            std::terminate();
+        globals->propagatingExceptions = exception_header;
+    }
+    return true;
+}
+
+/*
+The routine to be called after the cleanup has been performed.  It will get the
+propagating __cxa_exception from __cxa_eh_globals, and continue the stack
+unwinding with _Unwind_Resume.
+
+According to ARM EHABI 8.4.1, __cxa_end_cleanup() should not clobber any
+register, thus we have to write this function in assembly so that we can save
+{r1, r2, r3}.  We don't have to save r0 because it is the return value and the
+first argument to _Unwind_Resume().  In addition, we are saving r4 in order to
+align the stack to 16 bytes, even though it is a callee-save register.
+*/
+__attribute__((used)) static _Unwind_Exception *
+__cxa_end_cleanup_impl()
+{
+    __cxa_eh_globals* globals = __cxa_get_globals();
+    __cxa_exception* exception_header = globals->propagatingExceptions;
+    if (NULL == exception_header)
+    {
+        // It seems that __cxa_begin_cleanup() is not called properly.
+        // We have no choice but terminate the program now.
+        std::terminate();
+    }
+
+    if (isOurExceptionClass(&exception_header->unwindHeader))
+    {
+        --exception_header->propagationCount;
+        if (0 == exception_header->propagationCount)
+        {
+            globals->propagatingExceptions = exception_header->nextPropagatingException;
+            exception_header->nextPropagatingException = NULL;
+        }
+    }
+    else
+    {
+        globals->propagatingExceptions = NULL;
+    }
+    return &exception_header->unwindHeader;
+}
+
+asm (
+    "	.pushsection	.text.__cxa_end_cleanup\n"
+    "	.globl	__cxa_end_cleanup\n"
+    "	.type	__cxa_end_cleanup,%function\n"
+    "__cxa_end_cleanup:\n"
+    "	push	{r1, r2, r3, r4}\n"
+    "	bl	__cxa_end_cleanup_impl\n"
+    "	pop	{r1, r2, r3, r4}\n"
+    "	bl	_Unwind_Resume\n"
+    "	bl	abort\n"
+    "	.popsection"
+);
+#endif  // LIBCXXABI_ARM_EHABI
     
 /*
 This routine can catch foreign or native exceptions.  If native, the exception
@@ -318,7 +411,11 @@
             globals->caughtExceptions = exception_header;
         }
         globals->uncaughtExceptions -= 1;   // Not atomically, since globals are thread-local
+#if LIBCXXABI_ARM_EHABI
+        return reinterpret_cast<void*>(exception_header->unwindHeader.barrier_cache.bitpattern[0]);
+#else
         return exception_header->adjustedPtr;
+#endif
     }
     // Else this is a foreign exception
     // If the caughtExceptions stack is not empty, terminate
@@ -352,6 +449,10 @@
 {
     static_assert(sizeof(__cxa_exception) == sizeof(__cxa_dependent_exception),
                   "sizeof(__cxa_exception) must be equal to sizeof(__cxa_dependent_exception)");
+    static_assert(offsetof(__cxa_exception, referenceCount) == offsetof(__cxa_dependent_exception, primaryException),
+                  "the layout of __cxa_exception must match the layout of __cxa_dependent_exception");
+    static_assert(offsetof(__cxa_exception, handlerCount) == offsetof(__cxa_dependent_exception, handlerCount),
+                  "the layout of __cxa_exception must match the layout of __cxa_dependent_exception");
     __cxa_eh_globals* globals = __cxa_get_globals_fast(); // __cxa_get_globals called in __cxa_begin_catch
     __cxa_exception* exception_header = globals->caughtExceptions;
     // If we've rethrown a foreign exception, then globals->caughtExceptions
@@ -465,7 +566,7 @@
         //   nothing
         globals->caughtExceptions = 0;
     }
-#if __arm__
+#if __USING_SJLJ_EXCEPTIONS__
     _Unwind_SjLj_RaiseException(&exception_header->unwindHeader);
 #else
     _Unwind_RaiseException(&exception_header->unwindHeader);
@@ -594,7 +695,7 @@
         setDependentExceptionClass(&dep_exception_header->unwindHeader);
         __cxa_get_globals()->uncaughtExceptions += 1;
         dep_exception_header->unwindHeader.exception_cleanup = dependent_exception_cleanup;
-#if __arm__
+#if __USING_SJLJ_EXCEPTIONS__
         _Unwind_SjLj_RaiseException(&dep_exception_header->unwindHeader);
 #else
         _Unwind_RaiseException(&dep_exception_header->unwindHeader);
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_exception.hpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_exception.hpp
index 66f05c4..9b22ce3 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_exception.hpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_exception.hpp
@@ -7,7 +7,7 @@
 //
 //  
 //  This file implements the "Exception Handling APIs"
-//  http://www.codesourcery.com/public/cxx-abi/abi-eh.html
+//  http://mentorembedded.github.io/cxx-abi/abi-eh.html
 //  
 //===----------------------------------------------------------------------===//
 
@@ -26,98 +26,100 @@
 static const uint64_t kOurDependentExceptionClass = 0x434C4E47432B2B01; // CLNGC++\1
 static const uint64_t get_vendor_and_language =     0xFFFFFFFFFFFFFF00; // mask for CLNGC++
                                                     
-    struct __cxa_exception { 
-#if __LP64__
+struct __cxa_exception { 
+#if __LP64__ || LIBCXXABI_ARM_EHABI
     // This is a new field to support C++ 0x exception_ptr.
     // For binary compatibility it is at the start of this
     // struct which is prepended to the object thrown in
     // __cxa_allocate_exception.
-        size_t referenceCount;
+    size_t referenceCount;
 #endif
     
     //  Manage the exception object itself.
-        std::type_info *exceptionType;
-        void (*exceptionDestructor)(void *); 
-        std::unexpected_handler unexpectedHandler;
-        std::terminate_handler  terminateHandler;
-        
-         __cxa_exception *nextException;
-        
-         int handlerCount;
-    
-#ifdef __ARM_EABI_UNWINDER__
-         __cxa_exception* nextPropagatingException;
-         int propagationCount;
+    std::type_info *exceptionType;
+    void (*exceptionDestructor)(void *); 
+    std::unexpected_handler unexpectedHandler;
+    std::terminate_handler  terminateHandler;
+
+    __cxa_exception *nextException;
+
+    int handlerCount;
+
+#if LIBCXXABI_ARM_EHABI
+    __cxa_exception* nextPropagatingException;
+    int propagationCount;
 #else
-         int handlerSwitchValue;
-         const unsigned char *actionRecord;
-         const unsigned char *languageSpecificData;
-         void *catchTemp;
-         void *adjustedPtr;
+    int handlerSwitchValue;
+    const unsigned char *actionRecord;
+    const unsigned char *languageSpecificData;
+    void *catchTemp;
+    void *adjustedPtr;
 #endif
 
-#if !__LP64__
+#if !__LP64__ && !LIBCXXABI_ARM_EHABI
     // This is a new field to support C++ 0x exception_ptr.
     // For binary compatibility it is placed where the compiler
     // previously adding padded to 64-bit align unwindHeader.
-        size_t referenceCount;
+    size_t referenceCount;
 #endif
-    
-        _Unwind_Exception unwindHeader;
-        };
+
+    _Unwind_Exception unwindHeader;
+};
 
 // http://sourcery.mentor.com/archives/cxx-abi-dev/msg01924.html
-    
-    struct __cxa_dependent_exception {
-#if __LP64__
-        void* primaryException;
+// The layout of this structure MUST match the layout of __cxa_exception, with
+// primaryException instead of referenceCount.
+struct __cxa_dependent_exception {
+#if __LP64__ || LIBCXXABI_ARM_EHABI
+    void* primaryException;
 #endif
     
-        std::type_info *exceptionType;
-        void (*exceptionDestructor)(void *); 
-        std::unexpected_handler unexpectedHandler;
-        std::terminate_handler terminateHandler;
+    std::type_info *exceptionType;
+    void (*exceptionDestructor)(void *); 
+    std::unexpected_handler unexpectedHandler;
+    std::terminate_handler terminateHandler;
+
+    __cxa_exception *nextException;
+
+    int handlerCount;
     
-        __cxa_exception *nextException;
-    
-        int handlerCount;
-    
-#ifdef __ARM_EABI_UNWINDER__
-        __cxa_exception* nextPropagatingException;
-        int propagationCount;
+#if LIBCXXABI_ARM_EHABI
+    __cxa_exception* nextPropagatingException;
+    int propagationCount;
 #else
-        int handlerSwitchValue;
-        const unsigned char *actionRecord;
-        const unsigned char *languageSpecificData;
-        void * catchTemp;
-        void *adjustedPtr;
+    int handlerSwitchValue;
+    const unsigned char *actionRecord;
+    const unsigned char *languageSpecificData;
+    void * catchTemp;
+    void *adjustedPtr;
 #endif
     
-#if !__LP64__
-        void* primaryException;
+#if !__LP64__ && !LIBCXXABI_ARM_EHABI
+    void* primaryException;
 #endif
-    
-        _Unwind_Exception unwindHeader;
-        };
-        
-    struct __cxa_eh_globals {
-        __cxa_exception *   caughtExceptions;
-        unsigned int        uncaughtExceptions;
-#ifdef __ARM_EABI_UNWINDER__
-        __cxa_exception* propagatingExceptions;
+
+    _Unwind_Exception unwindHeader;
+};
+
+struct __cxa_eh_globals {
+    __cxa_exception *   caughtExceptions;
+    unsigned int        uncaughtExceptions;
+#if LIBCXXABI_ARM_EHABI
+    __cxa_exception* propagatingExceptions;
 #endif
-    };
+};
 
 #pragma GCC visibility pop
 #pragma GCC visibility push(default)
 
-    extern "C" __cxa_eh_globals * __cxa_get_globals      ();
-    extern "C" __cxa_eh_globals * __cxa_get_globals_fast ();
+extern "C" __cxa_eh_globals * __cxa_get_globals      ();
+extern "C" __cxa_eh_globals * __cxa_get_globals_fast ();
 
-    extern "C" void * __cxa_allocate_dependent_exception ();
-    extern "C" void __cxa_free_dependent_exception (void * dependent_exception);
+extern "C" void * __cxa_allocate_dependent_exception ();
+extern "C" void __cxa_free_dependent_exception (void * dependent_exception);
 
 #pragma GCC visibility pop
-}
+
+}  // namespace __cxxabiv1
 
 #endif  // _CXA_EXCEPTION_H
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_exception_storage.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_exception_storage.cpp
index b0b5524..6f902c6 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_exception_storage.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_exception_storage.cpp
@@ -7,13 +7,25 @@
 //
 //  
 //  This file implements the storage for the "Caught Exception Stack"
-//  http://www.codesourcery.com/public/cxx-abi/abi-eh.html (section 2.2.2)
+//  http://mentorembedded.github.io/cxx-abi/abi-eh.html (section 2.2.2)
 //  
 //===----------------------------------------------------------------------===//
 
 #include "cxa_exception.hpp"
 
-#ifdef HAS_THREAD_LOCAL
+#include "config.h"
+
+#if LIBCXXABI_SINGLE_THREADED
+
+namespace __cxxabiv1 {
+extern "C" {
+    static __cxa_eh_globals eh_globals;
+    __cxa_eh_globals *__cxa_get_globals() { return &eh_globals; }
+    __cxa_eh_globals *__cxa_get_globals_fast() { return &eh_globals; }
+    }
+}
+
+#elif defined(HAS_THREAD_LOCAL)
 
 namespace __cxxabiv1 {
 
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_guard.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_guard.cpp
index e403b64..c6ac89f 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_guard.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_guard.cpp
@@ -8,8 +8,11 @@
 //===----------------------------------------------------------------------===//
 
 #include "abort_message.h"
+#include "config.h"
 
-#include <pthread.h>
+#if !LIBCXXABI_SINGLE_THREADED
+#  include <pthread.h>
+#endif
 #include <stdint.h>
 
 /*
@@ -59,8 +62,10 @@
 
 #endif
 
+#if !LIBCXXABI_SINGLE_THREADED
 pthread_mutex_t guard_mut = PTHREAD_MUTEX_INITIALIZER;
 pthread_cond_t  guard_cv  = PTHREAD_COND_INITIALIZER;
+#endif
 
 #if defined(__APPLE__) && !defined(__arm__)
 
@@ -161,6 +166,25 @@
 extern "C"
 {
 
+#if LIBCXXABI_SINGLE_THREADED
+int __cxa_guard_acquire(guard_type* guard_object)
+{
+    return !is_initialized(guard_object);
+}
+
+void __cxa_guard_release(guard_type* guard_object)
+{
+    *guard_object = 0;
+    set_initialized(guard_object);
+}
+
+void __cxa_guard_abort(guard_type* guard_object)
+{
+    *guard_object = 0;
+}
+
+#else // !LIBCXXABI_SINGLE_THREADED
+
 int __cxa_guard_acquire(guard_type* guard_object)
 {
     char* initialized = (char*)guard_object;
@@ -226,6 +250,8 @@
         abort_message("__cxa_guard_abort failed to broadcast condition variable");
 }
 
+#endif // !LIBCXXABI_SINGLE_THREADED
+
 }  // extern "C"
 
 }  // __cxxabiv1
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_handlers.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_handlers.cpp
index 6c13fcd..674933b 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_handlers.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_handlers.cpp
@@ -14,6 +14,7 @@
 #include <new>
 #include <exception>
 #include "abort_message.h"
+#include "config.h"
 #include "cxxabi.h"
 #include "cxa_handlers.hpp"
 #include "cxa_exception.hpp"
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_new_delete.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_new_delete.cpp
index f6db1aa..c2258e2 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_new_delete.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_new_delete.cpp
@@ -230,8 +230,23 @@
     return "bad_array_new_length";
 }
 
+#if 0  // WE DONT WANT NO C++14 FIXME can remove this if 0 now?
+
 // bad_array_length
 
+#ifndef _LIBCPP_BAD_ARRAY_LENGTH_DEFINED
+
+class _LIBCPP_EXCEPTION_ABI bad_array_length
+    : public bad_alloc
+{
+public:
+    bad_array_length() _NOEXCEPT;
+    virtual ~bad_array_length() _NOEXCEPT;
+    virtual const char* what() const _NOEXCEPT;
+};
+
+#endif  // _LIBCPP_BAD_ARRAY_LENGTH_DEFINED
+
 bad_array_length::bad_array_length() _NOEXCEPT
 {
 }
@@ -246,4 +261,6 @@
     return "bad_array_length";
 }
 
+#endif // WE DONT WANT NO C++14
+
 }  // std
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_personality.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_personality.cpp
index 97e5800..ec50619 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_personality.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_personality.cpp
@@ -7,11 +7,12 @@
 //
 //  
 //  This file implements the "Exception Handling APIs"
-//  http://www.codesourcery.com/public/cxx-abi/abi-eh.html
+//  http://mentorembedded.github.io/cxx-abi/abi-eh.html
 //  http://www.intel.com/design/itanium/downloads/245358.htm
 //  
 //===----------------------------------------------------------------------===//
 
+#include "config.h"
 #include "unwind.h"
 #include "cxa_exception.hpp"
 #include "cxa_handlers.hpp"
@@ -49,7 +50,7 @@
 +------------------+--+-----+-----+------------------------+--------------------------+
 | callSiteTableLength | (ULEB128) | Call Site Table length, used to find Action table |
 +---------------------+-----------+---------------------------------------------------+
-#if !__arm__
+#if !__USING_SJLJ_EXCEPTIONS__
 +---------------------+-----------+------------------------------------------------+
 | Beginning of Call Site Table            The current ip lies within the           |
 | ...                                     (start, length) range of one of these    |
@@ -63,7 +64,7 @@
 | +-------------+---------------------------------+------------------------------+ |
 | ...                                                                              |
 +----------------------------------------------------------------------------------+
-#else  // __arm_
+#else  // __USING_SJLJ_EXCEPTIONS__
 +---------------------+-----------+------------------------------------------------+
 | Beginning of Call Site Table            The current ip is a 1-based index into   |
 | ...                                     this table.  Or it is -1 meaning no      |
@@ -76,7 +77,7 @@
 | +-------------+---------------------------------+------------------------------+ |
 | ...                                                                              |
 +----------------------------------------------------------------------------------+
-#endif  // __arm_
+#endif  // __USING_SJLJ_EXCEPTIONS__
 +---------------------------------------------------------------------+
 | Beginning of Action Table       ttypeIndex == 0 : cleanup           |
 | ...                             ttypeIndex  > 0 : catch             |
@@ -307,6 +308,42 @@
     std::terminate();
 }
 
+#if LIBCXXABI_ARM_EHABI
+static const void* read_target2_value(const void* ptr)
+{
+    uintptr_t offset = *reinterpret_cast<const uintptr_t*>(ptr);
+    if (!offset)
+        return 0;
+    // "ARM EABI provides a TARGET2 relocation to describe these typeinfo
+    // pointers. The reason being it allows their precise semantics to be
+    // deferred to the linker. For bare-metal they turn into absolute
+    // relocations. For linux they turn into GOT-REL relocations."
+    // https://gcc.gnu.org/ml/gcc-patches/2009-08/msg00264.html
+#if LIBCXXABI_BARE_METAL
+    return reinterpret_cast<const void*>(reinterpret_cast<uintptr_t>(ptr) + offset);
+#else
+    return *reinterpret_cast<const void**>(reinterpret_cast<uintptr_t>(ptr) + offset);
+#endif
+}
+
+static const __shim_type_info*
+get_shim_type_info(uint64_t ttypeIndex, const uint8_t* classInfo,
+                   uint8_t ttypeEncoding, bool native_exception,
+                   _Unwind_Exception* unwind_exception)
+{
+    if (classInfo == 0)
+    {
+        // this should not happen.  Indicates corrupted eh_table.
+        call_terminate(native_exception, unwind_exception);
+    }
+
+    assert(ttypeEncoding == DW_EH_PE_absptr && "Unexpected TTypeEncoding");
+    (void)ttypeEncoding;
+
+    const uint8_t* ttypePtr = classInfo - ttypeIndex * sizeof(uintptr_t);
+    return reinterpret_cast<const __shim_type_info*>(read_target2_value(ttypePtr));
+}
+#else // !LIBCXXABI_ARM_EHABI
 static
 const __shim_type_info*
 get_shim_type_info(uint64_t ttypeIndex, const uint8_t* classInfo,
@@ -342,6 +379,7 @@
     classInfo -= ttypeIndex;
     return (const __shim_type_info*)readEncodedPointer(&classInfo, ttypeEncoding);
 }
+#endif // !LIBCXXABI_ARM_EHABI
 
 /*
     This is checking a thrown exception type, excpType, against a possibly empty
@@ -352,6 +390,49 @@
     the list will catch a excpType.  If any catchType in the list can catch an
     excpType, then this exception spec does not catch the excpType.
 */
+#if LIBCXXABI_ARM_EHABI
+static
+bool
+exception_spec_can_catch(int64_t specIndex, const uint8_t* classInfo,
+                         uint8_t ttypeEncoding, const __shim_type_info* excpType,
+                         void* adjustedPtr, _Unwind_Exception* unwind_exception)
+{
+    if (classInfo == 0)
+    {
+        // this should not happen.   Indicates corrupted eh_table.
+        call_terminate(false, unwind_exception);
+    }
+
+    assert(ttypeEncoding == DW_EH_PE_absptr && "Unexpected TTypeEncoding");
+    (void)ttypeEncoding;
+
+    // specIndex is negative of 1-based byte offset into classInfo;
+    specIndex = -specIndex;
+    --specIndex;
+    const void** temp = reinterpret_cast<const void**>(
+        reinterpret_cast<uintptr_t>(classInfo) +
+        static_cast<uintptr_t>(specIndex) * sizeof(uintptr_t));
+    // If any type in the spec list can catch excpType, return false, else return true
+    //    adjustments to adjustedPtr are ignored.
+    while (true)
+    {
+        // ARM EHABI exception specification table (filter table) consists of
+        // several pointers which will directly point to the type info object
+        // (instead of ttypeIndex).  The table will be terminated with 0.
+        const void** ttypePtr = temp++;
+        if (*ttypePtr == 0)
+            break;
+        // We can get the __shim_type_info simply by performing a
+        // R_ARM_TARGET2 relocation, and cast the result to __shim_type_info.
+        const __shim_type_info* catchType =
+            static_cast<const __shim_type_info*>(read_target2_value(ttypePtr));
+        void* tempPtr = adjustedPtr;
+        if (catchType->can_catch(excpType, tempPtr))
+            return false;
+    }
+    return true;
+}
+#else
 static
 bool
 exception_spec_can_catch(int64_t specIndex, const uint8_t* classInfo,
@@ -385,6 +466,7 @@
     }
     return true;
 }
+#endif
 
 static
 void*
@@ -421,15 +503,10 @@
 set_registers(_Unwind_Exception* unwind_exception, _Unwind_Context* context,
               const scan_results& results)
 {
-#if __arm__
-    _Unwind_SetGR(context, 0, reinterpret_cast<uintptr_t>(unwind_exception));
-    _Unwind_SetGR(context, 1, static_cast<uintptr_t>(results.ttypeIndex));
-#else
     _Unwind_SetGR(context, __builtin_eh_return_data_regno(0),
                                  reinterpret_cast<uintptr_t>(unwind_exception));
     _Unwind_SetGR(context, __builtin_eh_return_data_regno(1),
                                     static_cast<uintptr_t>(results.ttypeIndex));
-#endif
     _Unwind_SetIP(context, results.landingPad);
 }
 
@@ -457,7 +534,8 @@
 static
 void
 scan_eh_tab(scan_results& results, _Unwind_Action actions, bool native_exception,
-            _Unwind_Exception* unwind_exception, _Unwind_Context* context)
+            _Unwind_Exception* unwind_exception, _Unwind_Context* context,
+            const uint8_t* lsda)
 {
     // Initialize results to found nothing but an error
     results.ttypeIndex = 0;
@@ -497,7 +575,6 @@
         return;
     }
     // Start scan by getting exception table address
-    const uint8_t* lsda = (const uint8_t*)_Unwind_GetLanguageSpecificData(context);
     if (lsda == 0)
     {
         // There is no exception table
@@ -511,7 +588,7 @@
     // Get beginning current frame's code (as defined by the 
     // emitted dwarf code)
     uintptr_t funcStart = _Unwind_GetRegionStart(context);
-#if __arm__
+#if __USING_SJLJ_EXCEPTIONS__
     if (ip == uintptr_t(-1))
     {
         // no action
@@ -521,9 +598,9 @@
     else if (ip == 0)
         call_terminate(native_exception, unwind_exception);
     // ip is 1-based index into call site table
-#else  // __arm__
+#else  // !__USING_SJLJ_EXCEPTIONS__
     uintptr_t ipOffset = ip - funcStart;
-#endif  // __arm__
+#endif  // !defined(_USING_SLJL_EXCEPTIONS__)
     const uint8_t* classInfo = NULL;
     // Note: See JITDwarfEmitter::EmitExceptionTable(...) for corresponding
     //       dwarf emission
@@ -544,8 +621,8 @@
     // Walk call-site table looking for range that 
     // includes current PC. 
     uint8_t callSiteEncoding = *lsda++;
-#if __arm__
-    (void)callSiteEncoding;  // On arm callSiteEncoding is never used
+#if __USING_SJLJ_EXCEPTIONS__
+    (void)callSiteEncoding;  // When using SjLj exceptions, callSiteEncoding is never used
 #endif
     uint32_t callSiteTableLength = static_cast<uint32_t>(readULEB128(&lsda));
     const uint8_t* callSiteTableStart = lsda;
@@ -555,7 +632,7 @@
     while (callSitePtr < callSiteTableEnd)
     {
         // There is one entry per call site.
-#if !__arm__
+#if !__USING_SJLJ_EXCEPTIONS__
         // The call sites are non-overlapping in [start, start+length)
         // The call sites are ordered in increasing value of start
         uintptr_t start = readEncodedPointer(&callSitePtr, callSiteEncoding);
@@ -563,15 +640,15 @@
         uintptr_t landingPad = readEncodedPointer(&callSitePtr, callSiteEncoding);
         uintptr_t actionEntry = readULEB128(&callSitePtr);
         if ((start <= ipOffset) && (ipOffset < (start + length)))
-#else  // __arm__
+#else  // __USING_SJLJ_EXCEPTIONS__
         // ip is 1-based index into this table
         uintptr_t landingPad = readULEB128(&callSitePtr);
         uintptr_t actionEntry = readULEB128(&callSitePtr);
         if (--ip == 0)
-#endif  // __arm__
+#endif  // __USING_SJLJ_EXCEPTIONS__
         {
             // Found the call site containing ip.
-#if !__arm__
+#if !__USING_SJLJ_EXCEPTIONS__
             if (landingPad == 0)
             {
                 // No handler here
@@ -579,9 +656,9 @@
                 return;
             }
             landingPad = (uintptr_t)lpStart + landingPad;
-#else  // __arm__
+#else  // __USING_SJLJ_EXCEPTIONS__
             ++landingPad;
-#endif  // __arm__
+#endif  // __USING_SJLJ_EXCEPTIONS__
             if (actionEntry == 0)
             {
                 // Found a cleanup
@@ -773,7 +850,7 @@
                 action += actionOffset;
             }  // there is no break out of this loop, only return
         }
-#if !__arm__
+#if !__USING_SJLJ_EXCEPTIONS__
         else if (ipOffset < start)
         {
             // There is no call site for this ip
@@ -781,7 +858,7 @@
             // Possible stack corruption.
             call_terminate(native_exception, unwind_exception);
         }
-#endif  // !__arm__
+#endif  // !__USING_SJLJ_EXCEPTIONS__
     }  // there might be some tricky cases which break out of this loop
 
     // It is possible that no eh table entry specify how to handle
@@ -837,8 +914,9 @@
         Else a cleanup is not found: return _URC_CONTINUE_UNWIND
 */
 
+#if !LIBCXXABI_ARM_EHABI
 _Unwind_Reason_Code
-#if __arm__
+#if __USING_SJLJ_EXCEPTIONS__
 __gxx_personality_sj0
 #else
 __gxx_personality_v0
@@ -848,6 +926,7 @@
 {
     if (version != 1 || unwind_exception == 0 || context == 0)
         return _URC_FATAL_PHASE1_ERROR;
+
     bool native_exception = (exceptionClass     & get_vendor_and_language) ==
                             (kOurExceptionClass & get_vendor_and_language);
     scan_results results;
@@ -855,7 +934,8 @@
     {
         // Phase 1 search:  All we're looking for in phase 1 is a handler that
         //   halts unwinding
-        scan_eh_tab(results, actions, native_exception, unwind_exception, context);
+        scan_eh_tab(results, actions, native_exception, unwind_exception, context, 
+                    (const uint8_t*)_Unwind_GetLanguageSpecificData(context));
         if (results.reason == _URC_HANDLER_FOUND)
         {
             // Found one.  Can we cache the results somewhere to optimize phase 2?
@@ -896,7 +976,8 @@
             else
             {
                 // No, do the scan again to reload the results.
-                scan_eh_tab(results, actions, native_exception, unwind_exception, context);
+                scan_eh_tab(results, actions, native_exception, unwind_exception, context,
+                    (const uint8_t*)_Unwind_GetLanguageSpecificData(context));
                 // Phase 1 told us we would find a handler.  Now in Phase 2 we
                 //   didn't find a handler.  The eh table should not be changing!
                 if (results.reason != _URC_HANDLER_FOUND)
@@ -909,7 +990,8 @@
         // Either we didn't do a phase 1 search (due to forced unwinding), or
         //   phase 1 reported no catching-handlers.
         // Search for a (non-catching) cleanup
-        scan_eh_tab(results, actions, native_exception, unwind_exception, context);
+        scan_eh_tab(results, actions, native_exception, unwind_exception, context,
+                    (const uint8_t*)_Unwind_GetLanguageSpecificData(context));
         if (results.reason == _URC_HANDLER_FOUND)
         {
             // Found a non-catching handler.  Jump to it:
@@ -924,6 +1006,170 @@
     // We were called improperly: neither a phase 1 or phase 2 search
     return _URC_FATAL_PHASE1_ERROR;
 }
+#else
+
+// Helper function to unwind one frame.
+// ARM EHABI 7.3 and 7.4: If the personality function returns _URC_CONTINUE_UNWIND, the
+// personality routine should update the virtual register set (VRS) according to the
+// corresponding frame unwinding instructions (ARM EHABI 9.3.)
+static _Unwind_Reason_Code continue_unwind(_Unwind_Context* context,
+                                           uint32_t* unwind_opcodes,
+                                           size_t opcode_words)
+{
+    if (_Unwind_VRS_Interpret(context, unwind_opcodes, 1, opcode_words * 4) !=
+        _URC_CONTINUE_UNWIND)
+        return _URC_FAILURE;
+    return _URC_CONTINUE_UNWIND;
+}
+
+// ARM register names
+static const uint32_t REG_UCB = 12;  // Register to save _Unwind_Control_Block
+static const uint32_t REG_SP = 13;
+
+static void save_results_to_barrier_cache(_Unwind_Exception* unwind_exception,
+                                          const scan_results& results)
+{
+    unwind_exception->barrier_cache.bitpattern[0] = (uint32_t)results.adjustedPtr;
+    unwind_exception->barrier_cache.bitpattern[1] = (uint32_t)results.actionRecord;
+    unwind_exception->barrier_cache.bitpattern[2] = (uint32_t)results.languageSpecificData;
+    unwind_exception->barrier_cache.bitpattern[3] = (uint32_t)results.landingPad;
+    unwind_exception->barrier_cache.bitpattern[4] = (uint32_t)results.ttypeIndex;
+}
+
+static void load_results_from_barrier_cache(scan_results& results,
+                                            const _Unwind_Exception* unwind_exception)
+{
+    results.adjustedPtr = (void*)unwind_exception->barrier_cache.bitpattern[0];
+    results.actionRecord = (const uint8_t*)unwind_exception->barrier_cache.bitpattern[1];
+    results.languageSpecificData = (const uint8_t*)unwind_exception->barrier_cache.bitpattern[2];
+    results.landingPad = (uintptr_t)unwind_exception->barrier_cache.bitpattern[3];
+    results.ttypeIndex = (int64_t)(int32_t)unwind_exception->barrier_cache.bitpattern[4];
+}
+
+extern "C" _Unwind_Reason_Code
+__gxx_personality_v0(_Unwind_State state,
+                     _Unwind_Exception* unwind_exception,
+                     _Unwind_Context* context)
+{
+    if (unwind_exception == 0 || context == 0)
+        return _URC_FATAL_PHASE1_ERROR;
+
+    bool native_exception = (unwind_exception->exception_class & get_vendor_and_language) ==
+                            (kOurExceptionClass & get_vendor_and_language);
+
+#if LIBCXXABI_ARM_EHABI
+    // ARM EHABI # 6.2, # 9.2
+    //
+    //  +---- ehtp
+    //  v
+    // +--------------------------------------+
+    // | +--------+--------+--------+-------+ |
+    // | |0| prel31 to __gxx_personality_v0 | |
+    // | +--------+--------+--------+-------+ |
+    // | |      N |      unwind opcodes     | |  <-- UnwindData
+    // | +--------+--------+--------+-------+ |
+    // | | Word 2        unwind opcodes     | |
+    // | +--------+--------+--------+-------+ |
+    // | ...                                  |
+    // | +--------+--------+--------+-------+ |
+    // | | Word N        unwind opcodes     | |
+    // | +--------+--------+--------+-------+ |
+    // | | LSDA                             | |  <-- lsda
+    // | | ...                              | |
+    // | +--------+--------+--------+-------+ |
+    // +--------------------------------------+
+
+    uint32_t *UnwindData = unwind_exception->pr_cache.ehtp + 1;
+    uint32_t FirstDataWord = *UnwindData;
+    size_t N = ((FirstDataWord >> 24) & 0xff);
+    size_t NDataWords = N + 1;
+#endif
+
+    // TODO(ajwong): The "Copy the address" comment was in upstream...do we actually need this in arm?
+    // Copy the address of _Unwind_Control_Block to r12 so that _Unwind_GetLanguageSpecificData()
+
+    const uint8_t *lsda = (const uint8_t*)_Unwind_GetLanguageSpecificData(context);
+
+
+    // TODO(ajwong): _Unwind_GetLanguageSpecificData() doesn't work.
+    // Copy the address of _Unwind_Control_Block to r12 so that _Unwind_GetLanguageSpecificData()
+    // and _Unwind_GetRegionStart() can return correct address.
+    _Unwind_SetGR(context, REG_UCB, reinterpret_cast<uint32_t>(unwind_exception));
+
+    scan_results results;
+    switch (state) {
+    case _US_VIRTUAL_UNWIND_FRAME:
+        // Phase 1 search:  All we're looking for in phase 1 is a handler that halts unwinding
+        scan_eh_tab(results, _UA_SEARCH_PHASE, native_exception, unwind_exception, context, lsda);
+        if (results.reason == _URC_HANDLER_FOUND)
+        {
+            unwind_exception->barrier_cache.sp = _Unwind_GetGR(context, REG_SP);
+            if (native_exception)
+                save_results_to_barrier_cache(unwind_exception, results);
+            return _URC_HANDLER_FOUND;
+        }
+        // Did not find the catch handler
+        if (results.reason == _URC_CONTINUE_UNWIND)
+            return continue_unwind(context, UnwindData, NDataWords);
+        return results.reason;
+
+    case _US_UNWIND_FRAME_STARTING:
+        // Phase 2 search
+        if (unwind_exception->barrier_cache.sp == _Unwind_GetGR(context, REG_SP))
+        {
+            // Found a catching handler in phase 1
+            if (native_exception)
+            {
+                // Load the result from the native exception barrier cache.
+                load_results_from_barrier_cache(results, unwind_exception);
+                results.reason = _URC_HANDLER_FOUND;
+            }
+            else
+            {
+                // Search for the catching handler again for the foreign exception.
+                scan_eh_tab(results, static_cast<_Unwind_Action>(_UA_CLEANUP_PHASE | _UA_HANDLER_FRAME),
+                            native_exception, unwind_exception, context, lsda);
+                if (results.reason != _URC_HANDLER_FOUND)  // phase1 search should guarantee to find one
+                    call_terminate(native_exception, unwind_exception);
+            }
+
+            // Install the context for the catching handler
+            set_registers(unwind_exception, context, results);
+            return _URC_INSTALL_CONTEXT;
+        }
+
+        // Either we didn't do a phase 1 search (due to forced unwinding), or
+        //  phase 1 reported no catching-handlers.
+        // Search for a (non-catching) cleanup
+        scan_eh_tab(results, _UA_CLEANUP_PHASE, native_exception, unwind_exception, context, lsda);
+        if (results.reason == _URC_HANDLER_FOUND)
+        {
+            // Found a non-catching handler
+
+            // ARM EHABI 8.4.2: Before we can jump to the cleanup handler, we have to setup some
+            // internal data structures, so that __cxa_end_cleanup() can get unwind_exception from
+            // __cxa_get_globals().
+            __cxa_begin_cleanup(unwind_exception);
+
+            // Install the context for the cleanup handler
+            set_registers(unwind_exception, context, results);
+            return _URC_INSTALL_CONTEXT;
+        }
+
+        // Did not find any handler
+        if (results.reason == _URC_CONTINUE_UNWIND)
+            return continue_unwind(context, UnwindData, NDataWords);
+        return results.reason;
+
+    case _US_UNWIND_FRAME_RESUME:
+        return continue_unwind(context, UnwindData, NDataWords);
+    }
+
+    // We were called improperly: neither a phase 1 or phase 2 search
+    return _URC_FATAL_PHASE1_ERROR;
+}
+#endif
+
 
 __attribute__((noreturn))
 void
@@ -948,8 +1194,13 @@
         u_handler = old_exception_header->unexpectedHandler;
         // If std::__unexpected(u_handler) rethrows the same exception,
         //   these values get overwritten by the rethrow.  So save them now:
+#if LIBCXXABI_ARM_EHABI
+        ttypeIndex = (int64_t)(int32_t)unwind_exception->barrier_cache.bitpattern[4];
+        lsda = (const uint8_t*)unwind_exception->barrier_cache.bitpattern[2];
+#else
         ttypeIndex = old_exception_header->handlerSwitchValue;
         lsda = old_exception_header->languageSpecificData;
+#endif
     }
     else
     {
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_vector.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_vector.cpp
index c2292ef..3c9b535 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_vector.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/cxa_vector.cpp
@@ -7,7 +7,7 @@
 //
 //  
 //  This file implements the "Array Construction and Destruction APIs"
-//  http://www.codesourcery.com/public/cxx-abi/abi.html#array-ctor
+//  http://mentorembedded.github.io/cxx-abi/abi.html#array-ctor
 //  
 //===----------------------------------------------------------------------===//
 
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/fallback_malloc.ipp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/fallback_malloc.ipp
index e04fb15..a97f3fd 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/fallback_malloc.ipp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/fallback_malloc.ipp
@@ -7,10 +7,12 @@
 //
 //  
 //  This file implements the "Exception Handling APIs"
-//  http://www.codesourcery.com/public/cxx-abi/abi-eh.html
+//  http://mentorembedded.github.io/cxx-abi/abi-eh.html
 //  
 //===----------------------------------------------------------------------===//
 
+#include "config.h"
+
 //  A small, simple heap manager based (loosely) on 
 //  the startup heap manager from FreeBSD, optimized for space.
 //
@@ -23,16 +25,28 @@
 
 namespace {
 
+// When POSIX threads are not available, make the mutex operations a nop
+#if LIBCXXABI_SINGLE_THREADED
+static void * heap_mutex = 0;
+#else
 static pthread_mutex_t heap_mutex = PTHREAD_MUTEX_INITIALIZER;
+#endif
 
 class mutexor {
 public:
+#if LIBCXXABI_SINGLE_THREADED
+    mutexor ( void * ) {}
+    ~mutexor () {}
+#else
     mutexor ( pthread_mutex_t *m ) : mtx_(m) { pthread_mutex_lock ( mtx_ ); }
     ~mutexor () { pthread_mutex_unlock ( mtx_ ); }
+#endif
 private:
     mutexor ( const mutexor &rhs );
     mutexor & operator = ( const mutexor &rhs );
+#if !LIBCXXABI_SINGLE_THREADED
     pthread_mutex_t *mtx_;
+#endif
     };
 
         
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/private_typeinfo.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/private_typeinfo.cpp
index 640ff8c..c65dcab 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/private_typeinfo.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/private_typeinfo.cpp
@@ -27,7 +27,7 @@
 // The current implementation of _LIBCXX_DYNAMIC_FALLBACK requires a
 // printf-like function called syslog:
 // 
-//     void syslog(const char* format, ...);
+//     void syslog(int facility_priority, const char* format, ...);
 // 
 // If you want this functionality but your platform doesn't have syslog,
 // just implement it in terms of fprintf(stderr, ...).
@@ -40,6 +40,18 @@
 #include <sys/syslog.h>
 #endif
 
+// On Windows, typeids are different between DLLs and EXEs, so comparing
+// type_info* will work for typeids from the same compiled file but fail
+// for typeids from a DLL and an executable. Among other things, exceptions
+// are not caught by handlers since can_catch() returns false.
+//
+// Defining _LIBCXX_DYNAMIC_FALLBACK does not help since can_catch() calls 
+// is_equal() with use_strcmp=false so the string names are not compared.
+
+#ifdef _WIN32
+#include <string.h>
+#endif
+
 namespace __cxxabiv1
 {
 
@@ -62,7 +74,11 @@
 bool
 is_equal(const std::type_info* x, const std::type_info* y, bool)
 {
+#ifndef _WIN32
     return x == y;
+#else
+    return (x == y) || (strcmp(x->name(), y->name()) == 0);
+#endif    
 }
 
 #endif  // _LIBCXX_DYNAMIC_FALLBACK
@@ -285,17 +301,20 @@
                                                     void* adjustedPtr,
                                                     int path_below) const
 {
-    ptrdiff_t offset_to_base = __offset_flags >> __offset_shift;
-    if (__offset_flags & __virtual_mask)
+    ptrdiff_t offset_to_base = 0;
+    if (adjustedPtr != nullptr)
     {
-        const char* vtable = *static_cast<const char*const*>(adjustedPtr);
-        offset_to_base = *reinterpret_cast<const ptrdiff_t*>(vtable + offset_to_base);
+        offset_to_base = __offset_flags >> __offset_shift;
+        if (__offset_flags & __virtual_mask)
+        {
+            const char* vtable = *static_cast<const char*const*>(adjustedPtr);
+            offset_to_base = *reinterpret_cast<const ptrdiff_t*>(vtable + offset_to_base);
+        }
     }
-    __base_type->has_unambiguous_public_base(info,
-                                             static_cast<char*>(adjustedPtr) + offset_to_base,
-                                             (__offset_flags & __public_mask) ?
-                                                 path_below :
-                                                 not_public_path);
+    __base_type->has_unambiguous_public_base(
+            info,
+            static_cast<char*>(adjustedPtr) + offset_to_base,
+            (__offset_flags & __public_mask) ? path_below : not_public_path);
 }
 
 void
@@ -342,7 +361,8 @@
                                void*& adjustedPtr) const
 {
     // Do the dereference adjustment
-    adjustedPtr = *static_cast<void**>(adjustedPtr);
+    if (adjustedPtr != NULL)
+        adjustedPtr = *static_cast<void**>(adjustedPtr);
     // bullets 1 and 4
     if (__pbase_type_info::can_catch(thrown_type, adjustedPtr))
         return true;
@@ -372,7 +392,8 @@
     thrown_class_type->has_unambiguous_public_base(&info, adjustedPtr, public_path);
     if (info.path_dst_ptr_to_static_ptr == public_path)
     {
-        adjustedPtr = const_cast<void*>(info.dst_ptr_leading_to_static_ptr);
+        if (adjustedPtr != NULL)
+            adjustedPtr = const_cast<void*>(info.dst_ptr_leading_to_static_ptr);
         return true;
     }
     return false;
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/stdexcept.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/stdexcept.cpp
index 246eea4..bd6789e 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/stdexcept.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/src/stdexcept.cpp
@@ -7,6 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "__refstring"
 #include "stdexcept"
 #include "new"
 #include <cstdlib>
@@ -14,147 +15,25 @@
 #include <cstdint>
 #include <cstddef>
 
-#if __APPLE__
-#include <dlfcn.h>
-#include <mach-o/dyld.h>
-#endif
-
-// Note:  optimize for size
-
-#pragma GCC visibility push(hidden)
-
-namespace
-{
-
-class __libcpp_nmstr
-{
-private:
-    const char* str_;
-
-    typedef int count_t;
-
-    struct _Rep_base
-    {
-        std::size_t len;
-        std::size_t cap;
-        count_t     count;
-    };
-
-    static const std::ptrdiff_t offset = static_cast<std::ptrdiff_t>(sizeof(_Rep_base));
-
-    count_t& count() const _NOEXCEPT {return ((_Rep_base*)(str_ - offset))->count;}
-
-#if __APPLE__
-    static
-    const void*
-    compute_gcc_empty_string_storage() _NOEXCEPT
-    {
-        void* handle = dlopen("/usr/lib/libstdc++.6.dylib", RTLD_NOLOAD);
-        if (handle == 0)
-            return 0;
-        return (const char*)dlsym(handle, "_ZNSs4_Rep20_S_empty_rep_storageE") + offset;
-    }
-    
-    static
-    const void*
-    get_gcc_empty_string_storage() _NOEXCEPT
-    {
-        static const void* p = compute_gcc_empty_string_storage();
-        return p;
-    }
-#endif
-
-public:
-    explicit __libcpp_nmstr(const char* msg);
-    __libcpp_nmstr(const __libcpp_nmstr& s) _NOEXCEPT;
-    __libcpp_nmstr& operator=(const __libcpp_nmstr& s) _NOEXCEPT;
-    ~__libcpp_nmstr();
-    const char* c_str() const _NOEXCEPT {return str_;}
-};
-
-__libcpp_nmstr::__libcpp_nmstr(const char* msg)
-{
-    std::size_t len = strlen(msg);
-    str_ = static_cast<const char*>(::operator new(len + 1 + offset));
-    _Rep_base* c = (_Rep_base*)str_;
-    c->len = c->cap = len;
-    str_ += offset;
-    count() = 0;
-    std::memcpy(const_cast<char*>(c_str()), msg, len + 1);
-}
-
-inline
-__libcpp_nmstr::__libcpp_nmstr(const __libcpp_nmstr& s) _NOEXCEPT
-    : str_(s.str_)
-{
-#if __APPLE__
-    if (str_ != get_gcc_empty_string_storage())
-#endif
-        __sync_add_and_fetch(&count(), 1);
-}
-
-__libcpp_nmstr&
-__libcpp_nmstr::operator=(const __libcpp_nmstr& s) _NOEXCEPT
-{
-    const char* p = str_;
-    str_ = s.str_;
-#if __APPLE__
-    if (str_ != get_gcc_empty_string_storage())
-#endif
-        __sync_add_and_fetch(&count(), 1);
-#if __APPLE__
-    if (p != get_gcc_empty_string_storage())
-#endif
-        if (__sync_add_and_fetch((count_t*)(p-sizeof(count_t)), count_t(-1)) < 0)
-        {
-            ::operator delete(const_cast<char*>(p-offset));
-        }
-    return *this;
-}
-
-inline
-__libcpp_nmstr::~__libcpp_nmstr()
-{
-#if __APPLE__
-    if (str_ != get_gcc_empty_string_storage())
-#endif
-        if (__sync_add_and_fetch(&count(), count_t(-1)) < 0)
-        {
-            ::operator delete(const_cast<char*>(str_ - offset));
-        }
-}
-
-}
-
-#pragma GCC visibility pop
+static_assert(sizeof(std::__libcpp_refstring) == sizeof(const char *), "");
 
 namespace std  // purposefully not using versioning namespace
 {
 
-logic_error::~logic_error() _NOEXCEPT
-{
-    __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_;
-    s.~__libcpp_nmstr();
-}
+logic_error::~logic_error() _NOEXCEPT {}
 
 const char*
 logic_error::what() const _NOEXCEPT
 {
-    __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_;
-    return s.c_str();
+    return __imp_.c_str();
 }
 
-runtime_error::~runtime_error() _NOEXCEPT
-{
-    __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_;
-    s.~__libcpp_nmstr();
-}
+runtime_error::~runtime_error() _NOEXCEPT {}
 
 const char*
 runtime_error::what() const _NOEXCEPT
 {
-    __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_;
-    return s.c_str();
+    return __imp_.c_str();
 }
 
 domain_error::~domain_error() _NOEXCEPT {}
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/catch_const_pointer_nullptr.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/catch_const_pointer_nullptr.cpp
index c9d5acf..417a2aa 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/catch_const_pointer_nullptr.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/catch_const_pointer_nullptr.cpp
@@ -1,4 +1,4 @@
-//===--------------------- catch_const_pointer_nullptr.cpp ----------------------===//
+//===--------------------- catch_const_pointer_nullptr.cpp ----------------===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -53,7 +53,7 @@
         throw nullptr;
         assert(false);
     }
-    catch (const A const*)
+    catch (const A* const)
     {
     }
     catch (A*)
@@ -72,7 +72,7 @@
     catch (A*)
     {
     }
-    catch (const A const*)
+    catch (const A* const)
     {
         assert(false);
     }
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/catch_ptr_02.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/catch_ptr_02.cpp
index d90365e..9421782 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/catch_ptr_02.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/catch_ptr_02.cpp
@@ -33,7 +33,7 @@
 {
     try
      {
-    	throw &a;
+        throw &a;
         assert(false);
     }
     catch ( A* )
@@ -77,10 +77,120 @@
     }
 }
 
+struct base1 {int x;};
+struct base2 {int x;};
+struct derived : base1, base2 {};
+
+void test5 ()
+{
+    try
+    {
+        throw (derived*)0;
+        assert(false);
+    }
+    catch (base2 *p) {
+        assert (p == 0);
+    }
+    catch (...)
+    {
+        assert (false);
+    }
+}
+
+void test6 ()
+{
+    try
+    {
+        throw nullptr;
+        assert(false);
+    }
+    catch (base2 *p) {
+        assert (p == nullptr);
+    }
+    catch (...)
+    {
+        assert (false);
+    }
+}
+
+void test7 ()
+{
+    try
+    {
+        throw (derived*)12;
+        assert(false);
+    }
+    catch (base2 *p) {
+        assert ((unsigned long)p == 12+sizeof(base1));
+    }
+    catch (...)
+    {
+        assert (false);
+    }
+}
+
+
+struct vBase {};
+struct vDerived : virtual public vBase {};
+
+void test8 ()
+{
+    try
+    {
+        throw new vDerived;
+        assert(false);
+    }
+    catch (vBase *p) {
+        assert(p != 0);
+    }
+    catch (...)
+    {
+        assert (false);
+    }
+}
+
+void test9 ()
+{
+    try
+    {
+        throw nullptr;
+        assert(false);
+    }
+    catch (vBase *p) {
+        assert(p == 0);
+    }
+    catch (...)
+    {
+        assert (false);
+    }
+}
+
+void test10 ()
+{
+    try
+    {
+        throw (vDerived*)0;
+        assert(false);
+    }
+    catch (vBase *p) {
+        assert(p == 0);
+    }
+    catch (...)
+    {
+        assert (false);
+    }
+}
+
 int main()
 {
     test1();
     test2();
     test3();
     test4();
+    test5();
+    test6();
+    test7();
+    test8();
+    test9();
+    test10();
 }
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/inherited_exception.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/inherited_exception.cpp
new file mode 100644
index 0000000..e9a7e95
--- /dev/null
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/inherited_exception.cpp
@@ -0,0 +1,147 @@
+//===--------------------- inherited_exception.cpp ------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <assert.h>
+
+struct Base {
+  int b1;
+};
+
+struct Base2 {
+  int b2;
+};
+
+struct Child : public Base, public Base2 {
+  int c;
+};
+
+void f1() {
+  Child child;
+  child.b1 = 10;
+  child.b2 = 11;
+  child.c = 12;
+  throw child;
+}
+
+void f2() {
+  Child child;
+  child.b1 = 10;
+  child.b2 = 11;
+  child.c = 12;
+  throw static_cast<Base2&>(child);
+}
+
+void f3() {
+  Child* child  = new Child;
+  child->b1 = 10;
+  child->b2 = 11;
+  child->c = 12;
+  throw static_cast<Base2*>(child);
+}
+
+int main()
+{
+    try
+    {
+        f1();
+        assert(false);
+    }
+    catch (const Child& c)
+    {
+        assert(true);
+    }
+    catch (const Base& b)
+    {
+        assert(false);
+    }
+    catch (...)
+    {
+        assert(false);
+    }
+
+    try
+    {
+        f1();
+        assert(false);
+    }
+    catch (const Base& c)
+    {
+        assert(true);
+    }
+    catch (const Child& b)
+    {
+        assert(false);
+    }
+    catch (...)
+    {
+        assert(false);
+    }
+
+    try
+    {
+        f1();
+        assert(false);
+    }
+    catch (const Base2& c)
+    {
+        assert(true);
+    }
+    catch (const Child& b)
+    {
+        assert(false);
+    }
+    catch (...)
+    {
+        assert(false);
+    }
+
+    try
+    {
+        f2();
+        assert(false);
+    }
+    catch (const Child& c)
+    {
+        assert(false);
+    }
+    catch (const Base& b)
+    {
+        assert(false);
+    }
+    catch (const Base2& b)
+    {
+        assert(true);
+    }
+    catch (...)
+    {
+        assert(false);
+    }
+
+    try
+    {
+        f3();
+        assert(false);
+    }
+    catch (const Base* c)
+    {
+        assert(false);
+    }
+    catch (const Child* b)
+    {
+        assert(false);
+    }
+    catch (const Base2* c)
+    {
+        assert(true);
+    }
+    catch (...)
+    {
+        assert(false);
+    }
+}
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/test_demangle.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/test_demangle.cpp
index 0b582d3..15cb3a1 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/test_demangle.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/test_demangle.cpp
@@ -14,6 +14,9 @@
 #include <cassert>
 #include <chrono>
 
+// Is long double fp80?  (Only x87 extended double has 64-bit mantissa)
+#define LDBL_FP80 (__LDBL_MANT_DIG__ == 64)
+
 const char* cases[][2] =
 {
     {"_Z1A", "A"},
@@ -21,6 +24,8 @@
     {"_Z1A1B1C", "A(B, C)"},
     {"_Z4testI1A1BE1Cv", "C test<A, B>()"},
     {"_Z4testI1A1BET0_T_S3_", "B test<A, B>(A, A)"},
+    {"_ZN1SgtEi", "S::operator>(int)"},
+    {"_ZrsI1QEiT_i", "int operator>><Q>(Q, int)"},
     {"_ZN13dyldbootstrap5startEPK12macho_headeriPPKcl", "dyldbootstrap::start(macho_header const*, int, char const**, long)"},
     {"_ZN4dyld17getExecutablePathEv", "dyld::getExecutablePath()"},
     {"_ZN4dyld22mainExecutablePreboundEv", "dyld::mainExecutablePrebound()"},
@@ -29513,7 +29518,9 @@
     {"_ZN5test01fIiEEvT_RAszcl3ovlcvS1__EE_c", "void test0::f<int>(int, char (&) [sizeof (ovl((int)()))])"},
     {"_ZN5test01gIfEEvRAszplcvT__ELf40a00000E_c", "void test0::g<float>(char (&) [sizeof (((float)()) + (0x1.4p+2f))])"},
     {"_ZN5test01hIfEEvRAszplcvT__ELd4014000000000000E_c", "void test0::h<float>(char (&) [sizeof (((float)()) + (0x1.4p+2))])"},
+#if LDBL_FP80
     {"_ZN5test01hIfEEvRAcvjplstT_Le4001a000000000000000E_c", "void test0::h<float>(char (&) [(unsigned int)((sizeof (float)) + (0xap-1L))])"},
+#endif
     {"_ZN5test01jINS_1AEEEvRAszdtcvT__E6buffer_c", "void test0::j<test0::A>(char (&) [sizeof ((test0::A)().buffer)])"},
     {"_ZN5test11fINS_1XEiEEvT_IT0_E", "void test1::f<test1::X, int>(test1::X<int>)"},
     {"_ZN5test211read_memberINS_1AEEEDtptcvPT_Li0E6memberERS2_", "decltype((test2::A*)(0)->member) test2::read_member<test2::A>(test2::A&)"},
@@ -29583,6 +29590,9 @@
     {"_Z1fPU11objcproto1A11objc_object", "f(id<A>)"},
     {"_Z1fPKU11objcproto1A7NSArray", "f(NSArray<A> const*)"},
     {"_ZNK1AIJ1Z1Y1XEEcv1BIJDpPT_EEIJS2_S1_S0_EEEv", "A<Z, Y, X>::operator B<X*, Y*, Z*><X, Y, Z>() const"},
+    {"_ZNK3Ncr6Silver7Utility6detail12CallOnThreadIZ53-[DeploymentSetupController handleManualServerEntry:]E3$_5EclIJEEEDTclclL_ZNS2_4getTIS4_EERT_vEEspclsr3stdE7forwardIT_Efp_EEEDpOSA_", "decltype(-[DeploymentSetupController handleManualServerEntry:]::$_5& Ncr::Silver::Utility::detail::getT<-[DeploymentSetupController handleManualServerEntry:]::$_5>()()(std::forward<-[DeploymentSetupController handleManualServerEntry:]::$_5>(fp))) Ncr::Silver::Utility::detail::CallOnThread<-[DeploymentSetupController handleManualServerEntry:]::$_5>::operator()<>(-[DeploymentSetupController handleManualServerEntry:]::$_5&&) const"},
+    {"_Zli2_xy", "operator\"\" _x(unsigned long long)"},
+    {"_Z1fIiEDcT_", "decltype(auto) f<int>(int)"},
 };
 
 const unsigned N = sizeof(cases) / sizeof(cases[0]);
@@ -29594,6 +29604,9 @@
     "NSoERj5E=Y1[uM:ga",
     "Aon_PmKVPDk7?fg4XP5smMUL6;<WsI_mgbf23cCgsHbT<l8EE\0uVRkNOoXDrgdA4[8IU>Vl<>IL8ayHpiVDDDXTY;^o9;i",
     "_ZNSt16allocator_traitsISaIN4llvm3sys2fs18directory_iteratorEEE9constructIS3_IS3_EEEDTcl12_S_constructfp_fp0_spcl7forwardIT0_Efp1_EEERS4_PT_DpOS7_",
+#if !LDBL_FP80
+    "_ZN5test01hIfEEvRAcvjplstT_Le4001a000000000000000E_c",
+#endif
 };
 
 const unsigned NI = sizeof(invalid_cases) / sizeof(invalid_cases[0]);
@@ -29663,7 +29676,9 @@
     std::string input;
     while (std::cin)
     {
-        std::cin >> input;
+        std::getline(std::cin, input);
+        if (std::cin.fail())
+            break;
         std::size_t len = 0;
         int status;
         len = 0;
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/test_exception_storage.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/test_exception_storage.cpp
index e2b230a..9a01236 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/test_exception_storage.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/test_exception_storage.cpp
@@ -7,10 +7,14 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "../src/config.h"
+
 #include <cstdlib>
 #include <algorithm>
 #include <iostream>
-#include <pthread.h>
+#if !LIBCXXABI_SINGLE_THREADED
+#  include <pthread.h>
+#endif
 #include <unistd.h>
 
 #include "../src/cxa_exception.hpp"
@@ -22,22 +26,29 @@
     globals_t *glob1, *glob2;
     
     glob1 = __cxxabiv1::__cxa_get_globals ();
-    if ( NULL == glob1 )
+    if ( NULL == glob1 ) {
         std::cerr << "Got null result from __cxa_get_globals" << std::endl;
+        return 0;
+    }
 
     glob2 = __cxxabiv1::__cxa_get_globals_fast ();
-    if ( glob1 != glob2 )
+    if ( glob1 != glob2 ) {
         std::cerr << "Got different globals!" << std::endl;
-    
+        return 0;
+    }
+
     *result = (size_t) glob1;
+#if !LIBCXXABI_SINGLE_THREADED
     sleep ( 1 );
+#endif
     return parm;
     }
 
-
+#if !LIBCXXABI_SINGLE_THREADED
 #define NUMTHREADS  10
 size_t      thread_globals [ NUMTHREADS ] = { 0 };
 pthread_t   threads        [ NUMTHREADS ];
+#endif
 
 void print_sizes ( size_t *first, size_t *last ) {
     std::cout << "{ " << std::hex;
@@ -49,6 +60,10 @@
 int main ( int argc, char *argv [] ) {
     int retVal = 0;
 
+#if LIBCXXABI_SINGLE_THREADED
+    size_t thread_globals;
+    retVal = thread_code(&thread_globals) != &thread_globals;
+#else
 //  Make the threads, let them run, and wait for them to finish
     for ( int i = 0; i < NUMTHREADS; ++i )
         pthread_create( threads + i, NULL, thread_code, (void *) (thread_globals + i));
@@ -69,6 +84,7 @@
             retVal = 2;
             }
 //  print_sizes ( thread_globals, thread_globals + NUMTHREADS );
-    
+
+#endif
     return retVal;
     }
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/test_guard.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/test_guard.cpp
index 96af56a..805ec81 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/test_guard.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/test_guard.cpp
@@ -7,10 +7,13 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "../src/config.h"
 #include "cxxabi.h"
 
 #include <cassert>
-#include <thread>
+#if !LIBCXXABI_SINGLE_THREADED
+#  include <thread>
+#endif
 
 // Ensure that we initialize each variable once and only once.
 namespace test1 {
@@ -72,6 +75,7 @@
     }
 }
 
+#if !LIBCXXABI_SINGLE_THREADED
 // A simple thread test of two threads racing to initialize a variable. This
 // isn't guaranteed to catch any particular threading problems.
 namespace test4 {
@@ -123,12 +127,15 @@
         assert(run_count == 1);
     }
 }
+#endif
 
 int main()
 {
     test1::test();
     test2::test();
     test3::test();
+#if !LIBCXXABI_SINGLE_THREADED
     test4::test();
     test5::test();
+#endif
 }
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/test_vector1.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/test_vector1.cpp
index 29d39db..b8bf45c 100644
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/test_vector1.cpp
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/test_vector1.cpp
@@ -49,7 +49,7 @@
 void throw_construct ( void *p ) { if ( gConstructorCounter   == gConstructorThrowTarget ) throw 1; ++gConstructorCounter; }
 void throw_destruct  ( void *p ) { if ( ++gDestructorCounter  == gDestructorThrowTarget  ) throw 2; }
 
-#if __has_feature(cxx_noexcept)
+#if __cplusplus >= 201103L
 #   define CAN_THROW noexcept(false)
 #else
 #   define CAN_THROW
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/testit b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/testit
index 9fa6d3b..99a6c71 100755
--- a/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/testit
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/testit
@@ -8,9 +8,9 @@
 # //
 # //===--------------------------------------------------------------------===//
 
-if [ -z $CC ]
+if [ -z $CXX ]
 then
-	CC=clang++
+	CXX=clang++
 fi
 
 if [ -z "$OPTIONS" ]
@@ -18,12 +18,17 @@
 	OPTIONS="-std=c++0x -stdlib=libc++"
 fi
 
+if [ -z "$QEMU" ]
+then
+    QEMU=qemu-system-arm
+fi
+
 case $TRIPLE in
   *-*-mingw* | *-*-cygwin* | *-*-win*)
-	TEST_EXE=test.exe
+    TEST_EXE_SUFFIX=.exe
     ;;
   *)
-    TEST_EXE=a.out
+    TEST_EXE_SUFFIX=.out
     ;;
 esac
 
@@ -33,6 +38,39 @@
 IMPLEMENTED_FAIL=0
 IMPLEMENTED_PASS=0
 
+function compile
+{
+  echo "  [COMPILE] $1"
+  echo $CXX $OPTIONS $HEADER_INCLUDE $SOURCE_LIB $LIBS -o $1$TEST_EXE_SUFFIX $1 test_wrapper.cc
+  $CXX $OPTIONS $HEADER_INCLUDE $SOURCE_LIB $LIBS -o $1$TEST_EXE_SUFFIX $1 test_wrapper.cc
+}
+
+function run
+{
+  echo "  [RUN    ] $1"
+  case $TRIPLE in
+    armv4-none-eabi)
+      echo $QEMU -semihosting -M integratorcp -cpu arm1026 -kernel $1
+      $QEMU -semihosting -M integratorcp -cpu arm1026 -kernel $1 | awk 'BEGIN { f=0; } /PASS/ { next } /FAIL/ { f=1; print; next } { print } END { exit f }'
+      ;;
+    thumbv4t-none-eabi)
+      echo $QEMU -semihosting -M integratorcp -cpu arm926 -kernel $1
+      $QEMU -semihosting -M integratorcp -cpu arm1026 -kernel $1 | awk 'BEGIN { f=0; } /PASS/ { next } /FAIL/ { f=1; print; next } { print } END { exit f }'
+      ;;
+    thumbv6m-none-eabi)
+      echo $QEMU -semihosting -M integratorcp -cpu cortex-m3 -kernel $1
+      $QEMU -semihosting -M integratorcp -cpu cortex-m3 -kernel $1 | awk 'BEGIN { f=0; } /PASS/ { next } /FAIL/ { f=1; print; next } { print } END { exit f }'
+      ;;
+    thumbv7t-none-eabi)
+      echo $QEMU -semihosting -M integratorcp -cpu cortex-a8 -kernel $1
+      $QEMU -semihosting -M integratorcp -cpu cortex-a8 -kernel $1 | awk 'BEGIN { f=0; } /PASS/ { next } /FAIL/ { f=1; print; next } { print } END { exit f }'
+      ;;
+    *)
+      $1
+      ;;
+  esac
+}
+
 function afunc
 {
 	fail=0
@@ -40,10 +78,10 @@
 	if (ls *.fail.cpp &> /dev/null)
 	then
 		for FILE in $(ls *.fail.cpp); do
-			if $CC $OPTIONS $HEADER_INCLUDE $SOURCE_LIB $FILE $LIBS -o ./$TEST_EXE &> /dev/null
+			if compile $FILE &> /dev/null
 			then
-				rm ./$TEST_EXE
-				echo "$FILE should not compile"
+				rm $FILE$TEST_EXE_SUFFIX
+				echo "  [FAIL   ] $FILE should not compile"
 				let "fail+=1"
 			else
 				let "pass+=1"
@@ -54,19 +92,17 @@
 	if (ls *.cpp &> /dev/null)
 	then
 		for FILE in $(ls *.cpp); do
-			if $CC $OPTIONS $HEADER_INCLUDE $SOURCE_LIB $FILE $LIBS -o ./$TEST_EXE
+			if compile $FILE
 			then
-				if ./$TEST_EXE
+				if run $FILE$TEST_EXE_SUFFIX
 				then
-					rm ./$TEST_EXE
 					let "pass+=1"
 				else
-					echo "$FILE failed at run time"
+					echo "  [FAIL   ] $FILE failed at run time"
 					let "fail+=1"
-					rm ./$TEST_EXE
 				fi
 			else
-				echo "$FILE failed to compile"
+				echo "  [FAIL   ] $FILE failed to compile"
 				let "fail+=1"
 			fi
 		done
@@ -109,7 +145,7 @@
 
 echo "****************************************************"
 echo "Results for `pwd`:"
-echo "using `$CC --version`"
+echo "using `$CXX --version`"
 echo "with $OPTIONS $HEADER_INCLUDE $SOURCE_LIB"
 echo "----------------------------------------------------"
 echo "sections without tests   : $UNIMPLEMENTED"
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/testit_android b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/testit_android
new file mode 100755
index 0000000..3291b27
--- /dev/null
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/testit_android
@@ -0,0 +1,520 @@
+#!/bin/bash
+# //===--------------------------- testit ---------------------------------===//
+# //
+# //                     The LLVM Compiler Infrastructure
+# //
+# // This file is distributed under the University of Illinois Open Source
+# // License. See LICENSE.TXT for details.
+# //
+# //===--------------------------------------------------------------------===//
+
+currentpath=`pwd`
+origpath=$currentpath
+currentdir=`basename $currentpath`
+while [ $currentdir != "test" ]; do
+	if [ $currentdir = "/" ]
+	then
+		echo "current directory must be in or under \"test\"."
+		exit 1
+	fi
+	cd ..
+	currentpath=`pwd`
+	currentdir=`basename $currentpath`
+done
+
+cd ..
+LIBCXX_ROOT=`pwd`/../../llvm-libc++/libcxx
+cd $origpath
+
+VERBOSE=1
+
+run () {
+  if [ "$VERBOSE" -gt 1 ]; then
+    echo "COMMAND: $@"
+  fi
+  case $VERBOSE in
+    0|1)
+      # Hide command output and errors.
+      "$@" >/dev/null 2>&1
+      ;;
+    2)
+      # Only hide command output
+      "$@" >/dev/null
+      ;;
+    *)
+      # Show command output and errors.
+      "$@"
+      ;;
+  esac
+}
+
+run2 () {
+  if [ "$VERBOSE" -gt 2 ]; then
+    echo "COMMAND: $@"
+  fi
+  case $VERBOSE in
+    0|1)
+      # Hide command output and errors.
+      "$@" >/dev/null 2>&1
+      ;;
+    2)
+      # Only hide command output
+      "$@" >/dev/null
+      ;;
+    *)
+      # Show command output and errors.
+      "$@"
+      ;;
+  esac
+}
+
+# The list of valid target abis supported by this script.
+VALID_ABIS="armeabi armeabi-v7a armeabi-v7a-hard x86 mips"
+
+DO_HELP=
+DO_STATIC=
+TARGET_ABI=
+TARGET_ARCH=
+if [ -n "$SHARD_TEST_TOOLCHAIN" ]; then
+  TARGET_PATH=/data/local/tmp/libcxx-${SHARD_TEST_TOOLCHAIN}-$(dirname $PWD | sum | cut -d' ' -f1)-$(basename $PWD)
+else
+  TARGET_PATH=/data/local/tmp/libcxx
+fi
+CXX=
+WITH_COMPILER_RT=
+OPTIMIZE=
+for OPT; do
+  case $OPT in
+    --help|-?)
+      DO_HELP=true
+      ;;
+    --abi=*)
+      TARGET_ABI=${OPT##--abi=}
+      ;;
+    --static)
+      DO_STATIC=true
+      ;;
+    --shared)
+      DO_STATIC=
+      ;;
+    --cxx=*)
+      CXX=${OPT##--cxx=}
+      ;;
+    --verbose)
+      VERBOSE=$(( $VERBOSE + 1 ))
+      ;;
+    --with-compiler-rt)
+      WITH_COMPILER_RT=yes
+      ;;
+    -O*)
+      OPTIMIZE=$OPT
+      ;;
+    -*)
+      echo "Unknown option: $OPT. See --help."
+      exit 1
+      ;;
+    *)
+      echo "This script doesn't take parameters. See --help."
+      exit 1
+      ;;
+  esac
+done
+
+if [ "$DO_HELP" ]; then
+  echo \
+"Usage: $(basename $0) [options]
+
+This script is used to run the libc++ test suite for Android.
+You will need the following things:
+
+  - The prebuild libc++ libraries in your NDK install.
+  - A prebuilt Android toolchain in your path.
+  - The 'adb' tool in your path.
+  - An Android device connected to ADB.
+
+The toolchain and device must match your target ABI. For example, if
+you use --abi=armeabi-v7a, your device must run ARMv7-A Android binaries,
+and arm-linux-androideabi-g++ will be used to compile all tests, unless
+you use --cxx=<command> to override it.
+
+Valid options:
+  --help|-?        Display this message.
+  --abi=<name>     Specify target ABI. Use --abi=list for list.
+  --static         Link against static libc++ library.
+  --cxx=<program>  Override C++ compiler/linker.
+  --verbose        Increase verbosity.
+"
+  exit 0
+fi
+
+# Check target ABI.
+if [ "$TARGET_ABI" = "list" ]; then
+  echo "List of valid target ABIs:"
+  for ABI in $VALID_ABIS; do
+    printf " %s" $ABI
+  done
+  printf "\n"
+  exit 0
+fi
+
+if [ -z "$TARGET_ABI" ]; then
+  echo "ERROR: Please specify a target ABI (--abi=<name>)."
+  exit 1
+fi
+
+FOUND_ABI=
+for ABI in $VALID_ABIS; do
+  if [ "$ABI" = "$TARGET_ABI" ]; then
+    FOUND_ABI=true
+    break
+  fi
+done
+
+if [ -z "$FOUND_ABI" ]; then
+  echo "ERROR: Invalid abi '$TARGET_ABI'. Must be one of: $VALID_ABIS"
+  exit 1
+fi
+
+LIBCXX_LIBS=$(cd $LIBCXX_ROOT/.. && pwd)/libs/$TARGET_ABI
+for LIB in libc++_static.a libc++_shared.so; do
+  if [ ! -f "$LIBCXX_LIBS/$LIB" ]; then
+    echo "ERROR: Missing prebuilt library: $LIBCXX_LIBS/$LIB"
+    echo "Please run: build/tools/build-cxx-stl.sh --stl=libc++"
+    exit 1
+  fi
+done
+
+LIBCOMPILER_RT_LIBS=$(cd "$LIBCXX_ROOT"/../../../android/compiler-rt && pwd)/libs/$TARGET_ABI
+if [ "$WITH_COMPILER_RT" = "yes" ]; then
+  for LIB in libcompiler_rt_static.a libcompiler_rt_shared.so; do
+    if [ ! -f "$LIBCOMPILER_RT_LIBS/$LIB" ]; then
+      echo "ERROR: Missing prebuilt library: $LIBCOMPILER_RT_LIBS/$LIB"
+      echo "Please run: build/tools/build-compiler-rt.sh --ndk-dir=$NDK \
+--src-dir=/tmp/ndk-$USER/src/llvm-3.4/compiler-rt --llvm-version=3.4"
+      exit 1
+    fi
+  done
+fi
+
+# Check or detect C++ toolchain.
+TOOLCHAIN_CFLAGS=
+TOOLCHAIN_LDFLAGS=
+THUMB_MODE="-mthumb"
+LIBM="-lm"
+if [ -z "$TOOLCHAIN_PREFIX" ]; then
+  # Compute
+  case $TARGET_ABI in
+    armeabi)
+      TOOLCHAIN_PREFIX=arm-linux-androideabi
+      TOOLCHAIN_CFLAGS="$THUMB_MODE"
+      TOOLCHAIN_LDFLAGS="$THUMB_MODE"
+      ;;
+    armeabi-v7a)
+      TOOLCHAIN_PREFIX=arm-linux-androideabi
+      TOOLCHAIN_CFLAGS="-march=armv7-a $THUMB_MODE -mfpu=vfpv3-d16"
+      TOOLCHAIN_LDFLAGS="-march=armv7-a $THUMB_MODE -Wl,--fix-cortex-a8"
+      ;;
+    armeabi-v7a-hard)
+      TOOLCHAIN_PREFIX=arm-linux-androideabi
+      TOOLCHAIN_CFLAGS="-march=armv7-a $THUMB_MODE -mfpu=vfpv3-d16 -mhard-float -D_NDK_MATH_NO_SOFTFP=1"
+      TOOLCHAIN_LDFLAGS="-march=armv7-a $THUMB_MODE -Wl,--fix-cortex-a8 -Wl,--no-warn-mismatch"
+      LIBM="-lm_hard"
+      ;;
+    x86)
+      TOOLCHAIN_PREFIX=i686-linux-android
+      ;;
+    mips)
+      TOOLCHAIN_PREFIX=mipsel-linux-android
+      ;;
+    *)
+      echo "ERROR: Unknown ABI '$ABI'"
+      exit 1
+      ;;
+  esac
+  if [ -z "$CXX" ]; then
+      CXX=$TOOLCHAIN_PREFIX-g++
+  fi
+fi
+
+REAL_CXX=$(which "$CXX" 2>/dev/null)
+if [ -z "$REAL_CXX" ]; then
+  echo "ERROR: Missing C++ compiler: $CXX"
+  exit 1
+fi
+CC=$CXX
+
+function version_ge {
+    input_string=$1
+    compare_string=$2
+    input_major=$(echo $input_string | cut -d\. -f 1)
+    input_minor=$(echo $input_string | cut -d\. -f 2)
+    compare_major=$(echo $compare_string | cut -d\. -f 1)
+    compare_minor=$(echo $compare_string | cut -d\. -f 2)
+    true=0
+    false=1
+    if [ "$input_major" -gt "$compare_major" ]; then return $true; fi
+    if [ "$input_major" -lt "$compare_major" ]; then return $false; fi
+    if [ "$input_minor" -ge "$compare_minor" ]; then return $true; fi
+    return $false
+}
+
+if [ -z "$OPTIONS" ]
+then
+  OPTIONS="-std=c++11 -g -funwind-tables $OPTIMIZE"
+  # Note that some tests use assert() to check condition but -O2 defines assert() to nothing,
+  # unless we specify -UNDEBUG to bring assert() back.
+  # But currently adding -UNDEBUG crashes both clang3.4 and clang3.3 for test
+  # like libcxx/test/atomics/atomics.types.generic/address.pass.cpp.  Define -UNDEBUG
+  # only when we are not using clang.  ToDo
+  if [ "$CXX" = "${CXX%%*clang++*}" ] ; then
+    OPTIONS="$OPTIONS -UNDEBUG"
+  fi
+  if [ -n "$LLVM_VERSION" ]; then
+    if version_ge "$LLVM_VERSION" "3.4"; then
+      OPTIONS="${OPTIONS} -mllvm -arm-enable-ehabi-descriptors -mllvm -arm-enable-ehabi"
+    fi
+  fi
+fi
+OPTIONS="$OPTIONS $TOOLCHAIN_CFLAGS $TOOLCHAIN_LDFLAGS"
+OPTIONS="$OPTIONS -I$LIBCXX_ROOT/test/support"
+# llvm-libc++/libcxx/test/lit.cfg line #278 defineds the following for testing only on Linux
+OPTIONS="$OPTIONS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS"
+
+if [ -z "$ADB" ]
+then
+  ADB=adb
+fi
+
+# Run a shell command through ADB, return its status.
+# Variable ERR contains output if $RET is non-zero
+adb_shell () {
+  # We need a temporary file to store the output of our command
+  local CMD_OUT RET
+  ERR=
+  CMD_OUT=$(mktemp /tmp/testit_android-cmdout-XXXXXX)
+  # Run the command, while storing the standard output to CMD_OUT
+  # and appending the exit code as the last line.
+  if [ "$VERBOSE" -gt 2 ]; then
+    echo "COMMAND: $ADB shell $@"
+  fi
+  $ADB shell "$@ ; echo \$?" | sed -e 's![[:cntrl:]]!!g' > $CMD_OUT 2>&1
+  # Get last line in log, which contains the exit code from the command
+  RET=$(sed -e '$!d' $CMD_OUT)
+  # Get output, which corresponds to everything except the last line
+  OUT=$(sed -e '$d' $CMD_OUT)
+  if [ "$RET" != "0" ]; then
+    ERR=$OUT
+  fi
+  if [ "$VERBOSE" -gt 2 ]; then
+    printf "%s" "$OUT"
+  fi
+  rm -f $CMD_OUT
+  return $RET
+}
+
+# Push a given file through ADB.
+# $1: File path
+adb_push () {
+  local FILE=$1
+  local FILE_BASENAME=$(basename "$FILE")
+  run2 $ADB push $FILE $TARGET_PATH/$FILE_BASENAME 2>/dev/null
+}
+
+# Run a given executable through ADB.
+# $1: Executable path
+adb_run () {
+  local EXECUTABLE=$1
+  local EXECUTABLE_BASENAME=$(basename "$EXECUTABLE")
+  run2 $ADB push $EXECUTABLE $TARGET_PATH/$EXECUTABLE_BASENAME 2>/dev/null
+  if [ "$?" != 0 ]; then
+    return 1;
+  fi
+  # Retry up to 10 times if fail is due to "Text file busy"
+  for i in 1 2 3 4 5 6 7 8 9 10; do
+    adb_shell "cd $TARGET_PATH; LD_LIBRARY_PATH=$TARGET_PATH LIBUNWIND_PRINT_UNWINDING=1 ./$EXECUTABLE_BASENAME"
+    if [ "$?" = "0" ]; then
+      return 0
+    fi
+    if ! $(echo $ERR | grep -iq "Text file busy"); then
+      if [ "$i" != "1" ]; then
+        # Dump error message to help diagnostics
+        echo "ERR=$ERR"
+      fi
+      break;
+    fi
+    echo "Text file busy.  Re-try $i"
+    sleep 1
+    run2 $ADB push $EXECUTABLE $TARGET_PATH/$EXECUTABLE_BASENAME 2>/dev/null
+    sleep 2  # try again
+  done
+  return 1
+}
+
+adb_shell "rm -rf $TARGET_PATH"
+adb_shell "mkdir -p $TARGET_PATH"
+
+if [ "$DO_STATIC" ]; then
+  # Statically link to ensure the executable can be run easily through ADB
+  if [ "$WITH_COMPILER_RT" = "yes" ]; then
+    LIBS="-nodefaultlibs -lc++_static -latomic -ldl $LIBM -lc -lcompiler_rt_static"
+  else
+    LIBS="-nodefaultlibs -latomic -ldl $LIBM -lc"
+  fi
+else
+  run2 $ADB push $LIBCXX_LIBS/libc++_shared.so $TARGET_PATH 2>/dev/null
+  if [ $? != 0 ]; then
+    echo "ERROR: Can't push shared libc++ to target device!"
+    exit 1
+  fi
+  if [ "$WITH_COMPILER_RT" = "yes" ]; then
+    run2 $ADB push $LIBCOMPILER_RT_LIBS/libcompiler_rt_shared.so $TARGET_PATH 2>/dev/null
+    if [ $? != 0 ]; then
+      echo "ERROR: Can't push shared libcompiler_rt to target device!"
+      exit 1
+    fi
+    LIBS="-nodefaultlibs -lc++_shared -latomic -ldl $LIBM -lc -lcompiler_rt_shared"
+  else
+    LIBS="-nodefaultlibs -lc++_shared -latomic -ldl $LIBM -lc"
+  fi
+fi
+
+case $TRIPLE in
+  *-*-mingw* | *-*-cygwin* | *-*-win*)
+    TEST_EXE=test.exe
+    ;;
+  *)
+    TEST_EXE=a.out
+    ;;
+esac
+
+TEST_EXE=/tmp/testit_android-$USER-$$-$TEST_EXE
+
+FAIL=0
+PASS=0
+UNIMPLEMENTED=0
+IMPLEMENTED_FAIL=0
+IMPLEMENTED_PASS=0
+
+# Run tests in current directory, recursively
+#
+# Note that file path containing EQ are symlink to the existing tests whose path contain '=',
+# to workaround an issue in ndk-build which doesn't handle LOCAL_SRC_FILES with '='.
+# See tests/device/test-libc++-static-full/jni/Android.mk  We need to filter out path containing
+# EQ such that we don't run same tests twice
+#
+# An alternative is to do "find . -type f", but this doesn't work in NDK windows package
+# where zip turns symlink into physical file it points to.
+#
+# We also sort the test to make the test report comparable to previous test
+#
+
+afunc() {
+	fail=0
+	pass=0
+	if (ls ${TEST_PREFIX}*fail.cpp > /dev/null 2>&1)
+	then
+		for FILE in $(ls ${TEST_PREFIX}*fail.cpp | tr ' ' '\n' | grep -v EQ | sort); do
+			if run $CC $OPTIONS $HEADER_INCLUDE $SOURCE_LIB $FILE $LIBS -o $TEST_EXE > /dev/null 2>&1
+			then
+				rm $TEST_EXE
+				echo "$FILE should not compile"
+				fail=$(($fail+1))
+			else
+				pass=$(($pass+1))
+			fi
+		done
+	fi
+
+	if (ls ${TEST_PREFIX}*.cpp > /dev/null 2>&1)
+	then
+		if (ls *.dat > /dev/null 2>&1)
+		then
+			adb_shell "rm -f $TARGET_PATH/*.dat"
+			for FILE in $(ls *.dat | tr ' ' '\n' | grep -v EQ | sort); do
+	                      if [ "$VERBOSE" -gt 1 ]; then
+	                          echo "Pushing data: " $FILE
+			      fi
+			      adb_push $FILE
+			      if [ $? != 0 ]; then
+				  echo "Failed to push file $FILE"
+	                      fi
+			done
+		fi
+		for FILE in $(ls ${TEST_PREFIX}*.cpp | tr ' ' '\n' | grep -v EQ | sort); do
+                      if [ "$VERBOSE" -gt 1 ]; then
+                          echo "Running test: " $FILE
+                      fi
+                        COMMAND="( cd $(pwd) && $CC $OPTIONS $HEADER_INCLUDE $SOURCE_LIB $FILE $LIBS )"
+			if run $CC $OPTIONS $HEADER_INCLUDE $SOURCE_LIB $FILE $LIBS -o $TEST_EXE
+			then
+				if adb_run $TEST_EXE
+				then
+					rm $TEST_EXE
+					pass=$(($pass+1))
+				else
+					echo "`pwd`/$FILE failed at run time"
+					echo "Compile line was: $COMMAND # run-time"
+					fail=$(($fail+1))
+					rm $TEST_EXE
+				fi
+			else
+				echo "`pwd`/$FILE failed to compile"
+				echo "Compile line was: $COMMAND # compile-time"
+				fail=$(($fail+1))
+			fi
+		done
+	fi
+
+	if [ $fail -gt 0 ]
+	then
+		echo "failed $fail tests in `pwd`"
+		IMPLEMENTED_FAIL=$(($IMPLEMENTED_FAIL+1))
+	fi
+	if [ $pass -gt 0 ]
+	then
+		echo "passed $pass tests in `pwd`"
+		if [ $fail -eq 0 ]
+		then
+			IMPLEMENTED_PASS=$((IMPLEMENTED_PASS+1))
+		fi
+	fi
+	if [ $fail -eq 0 -a $pass -eq 0 ]
+	then
+		echo "not implemented:  `pwd`"
+		UNIMPLEMENTED=$(($UNIMPLEMENTED+1))
+	fi
+
+	FAIL=$(($FAIL+$fail))
+	PASS=$(($PASS+$pass))
+
+	for FILE in $(ls | tr ' ' '\n' | grep -v EQ | sort)
+	do
+		if [ -d "$FILE" ];
+		then
+			cd $FILE
+			afunc
+			cd ..
+		fi
+	done
+}
+
+afunc
+
+echo "****************************************************"
+echo "Results for `pwd`:"
+echo "using `$CC --version`"
+echo "with $OPTIONS $HEADER_INCLUDE $SOURCE_LIB"
+echo "----------------------------------------------------"
+echo "sections without tests   : $UNIMPLEMENTED"
+echo "sections with failures   : $IMPLEMENTED_FAIL"
+echo "sections without failures: $IMPLEMENTED_PASS"
+echo "                       +   ----"
+echo "total number of sections : $(($UNIMPLEMENTED+$IMPLEMENTED_FAIL+$IMPLEMENTED_PASS))"
+echo "----------------------------------------------------"
+echo "number of tests failed   : $FAIL"
+echo "number of tests passed   : $PASS"
+echo "                       +   ----"
+echo "total number of tests    : $(($FAIL+$PASS))"
+echo "****************************************************"
+
+exit $FAIL
diff --git a/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/unwind_06.cpp b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/unwind_06.cpp
new file mode 100644
index 0000000..dd505c8
--- /dev/null
+++ b/sources/cxx-stl/llvm-libc++abi/libcxxabi/test/unwind_06.cpp
@@ -0,0 +1,257 @@
+//===------------------------- unwind_06.cpp ------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <exception>
+#include <stdlib.h>
+#include <assert.h>
+#include <stdio.h>
+
+// Compile with -Os to get compiler uses float registers to hold float variables
+
+double get_(int x) { return (double)x; }
+
+double (* volatile get)(int) = get_;
+
+volatile int counter;
+
+double try1(bool v) {
+  double a = get(0);
+  double b = get(1);
+  for (counter = 100; counter; --counter)
+    a += get(1) + b;
+  if (v) throw 10;
+  return get(0)+a+b;
+}
+
+double try2(bool v) {
+  double a = get(0);
+  double b = get(1);
+  double c = get(2);
+  for (counter = 100; counter; --counter)
+    a += get(1) + b + c;
+  if (v) throw 10;
+  return get(0)+a+b+c;
+}
+
+double try3(bool v) {
+  double a = get(0);
+  double b = get(1);
+  double c = get(2);
+  double d = get(3);
+  for (counter = 100; counter; --counter)
+    a += get(1) + b + c + d;
+  if (v) throw 10;
+  return get(0)+a+b+c+d;
+}
+
+double try4(bool v) {
+  double a = get(0);
+  double b = get(0);
+  double c = get(0);
+  double d = get(0);
+  double e = get(0);
+  for (counter = 100; counter; --counter)
+    a += get(1) + b+c+d+e;
+  if (v) throw 10;
+  return get(0)+a+b+c+d+e;
+}
+
+double try5(bool v) {
+  double a = get(0);
+  double b = get(0);
+  double c = get(0);
+  double d = get(0);
+  double e = get(0);
+  double f = get(0);
+  for (counter = 100; counter; --counter)
+    a += get(1) + b+c+d+e+f;
+  if (v) throw 10;
+  return get(0)+a+b+c+d+e+f;
+}
+
+double try6(bool v) {
+  double a = get(0);
+  double b = get(0);
+  double c = get(0);
+  double d = get(0);
+  double e = get(0);
+  double f = get(0);
+  double g = get(0);
+  for (counter = 100; counter; --counter)
+    a += get(1) + b+c+d+e+f+g;
+  if (v) throw 10;
+  return get(0)+a+b+c+d+e+f+g;
+}
+
+double try7(bool v) {
+  double a = get(0);
+  double b = get(0);
+  double c = get(0);
+  double d = get(0);
+  double e = get(0);
+  double f = get(0);
+  double g = get(0);
+  double h = get(0);
+  for (counter = 100; counter; --counter)
+    a += get(1) + b+c+d+e+f+g;
+  if (v) throw 10;
+  return get(0)+a+b+c+d+e+f+g;
+}
+
+double try8(bool v) {
+  double a = get(0);
+  double b = get(0);
+  double c = get(0);
+  double d = get(0);
+  double e = get(0);
+  double f = get(0);
+  double g = get(0);
+  double h = get(0);
+  double i = get(0);
+  for (counter = 100; counter; --counter)
+    a += get(1) + b+c+d+e+f+g+i;
+  if (v) throw 10;
+  return get(0)+a+b+c+d+e+f+g+i;
+}
+
+
+
+
+
+double foo()
+{
+  double a = get(1);
+  double b = get(2);
+  double c = get(3);
+  double d = get(4);
+  double e = get(5);
+  double f = get(6);
+  double g = get(7);
+  double h = get(8);
+  try {
+    try1(true);    
+  }
+  catch (int e) {
+  }
+  assert(a == get(1));
+  assert(b == get(2));
+  assert(c == get(3));
+  assert(d == get(4));
+  assert(e == get(5));
+  assert(f == get(6));
+  assert(g == get(7));
+  assert(h == get(8));
+  
+  try {
+    try2(true);    
+  }
+  catch (int e) {
+  }
+  assert(a == get(1));
+  assert(b == get(2));
+  assert(c == get(3));
+  assert(d == get(4));
+  assert(e == get(5));
+  assert(f == get(6));
+  assert(g == get(7));
+  assert(h == get(8));
+  
+  try {
+    try3(true);    
+  }
+  catch (int e) {
+  }
+  assert(a == get(1));
+  assert(b == get(2));
+  assert(c == get(3));
+  assert(d == get(4));
+  assert(e == get(5));
+  assert(f == get(6));
+  assert(g == get(7));
+  assert(h == get(8));
+  
+  try {
+    try4(true);    
+  }
+  catch (int e) {
+  }
+  assert(a == get(1));
+  assert(b == get(2));
+  assert(c == get(3));
+  assert(d == get(4));
+  assert(e == get(5));
+  assert(f == get(6));
+  assert(g == get(7));
+  assert(h == get(8));
+  
+  try {
+    try5(true);    
+  }
+  catch (int e) {
+  }
+  assert(a == get(1));
+  assert(b == get(2));
+  assert(c == get(3));
+  assert(d == get(4));
+  assert(e == get(5));
+  assert(f == get(6));
+  assert(g == get(7));
+  assert(h == get(8));
+  
+  try {
+    try6(true);    
+  }
+  catch (int e) {
+  }
+  assert(a == get(1));
+  assert(b == get(2));
+  assert(c == get(3));
+  assert(d == get(4));
+  assert(e == get(5));
+  assert(f == get(6));
+  assert(g == get(7));
+  assert(h == get(8));
+  
+  try {
+    try7(true);    
+  }
+  catch (int e) {
+  }
+  assert(a == get(1));
+  assert(b == get(2));
+  assert(c == get(3));
+  assert(d == get(4));
+  assert(e == get(5));
+  assert(f == get(6));
+  assert(g == get(7));
+  assert(h == get(8));
+  
+  try {
+    try8(true);    
+  }
+  catch (int e) {
+  }
+  assert(a == get(1));
+  assert(b == get(2));
+  assert(c == get(3));
+  assert(d == get(4));
+  assert(e == get(5));
+  assert(f == get(6));
+  assert(g == get(7));
+  assert(h == get(8));
+
+  return a+b+c+d+e+f+g+h;
+}
+
+
+
+int main()
+{
+  foo();
+}
diff --git a/sources/cxx-stl/llvm-libc++abi/sources.mk b/sources/cxx-stl/llvm-libc++abi/sources.mk
new file mode 100644
index 0000000..59e5d4e
--- /dev/null
+++ b/sources/cxx-stl/llvm-libc++abi/sources.mk
@@ -0,0 +1,30 @@
+libcxxabi_path := $(call my-dir)
+
+libcxxabi_src_files := \
+        libcxxabi/src/abort_message.cpp \
+        libcxxabi/src/cxa_aux_runtime.cpp \
+        libcxxabi/src/cxa_default_handlers.cpp \
+        libcxxabi/src/cxa_demangle.cpp \
+        libcxxabi/src/cxa_exception.cpp \
+        libcxxabi/src/cxa_exception_storage.cpp \
+        libcxxabi/src/cxa_guard.cpp \
+        libcxxabi/src/cxa_handlers.cpp \
+        libcxxabi/src/cxa_new_delete.cpp \
+        libcxxabi/src/cxa_personality.cpp \
+        libcxxabi/src/cxa_unexpected.cpp \
+        libcxxabi/src/cxa_vector.cpp \
+        libcxxabi/src/cxa_virtual.cpp \
+        libcxxabi/src/exception.cpp \
+        libcxxabi/src/private_typeinfo.cpp \
+        libcxxabi/src/stdexcept.cpp \
+        libcxxabi/src/typeinfo.cpp \
+        libcxxabi/src/Unwind/libunwind.cpp \
+        libcxxabi/src/Unwind/Unwind-arm.cpp \
+        libcxxabi/src/Unwind/UnwindLevel1.c \
+        libcxxabi/src/Unwind/UnwindLevel1-gcc-ext.c \
+        libcxxabi/src/Unwind/UnwindRegistersRestore.S \
+        libcxxabi/src/Unwind/UnwindRegistersSave.S \
+        libcxxabi/src/Unwind/Unwind-sjlj.c
+
+libcxxabi_c_includes := $(libcxxabi_path)/libcxxabi/include
+
diff --git a/tests/device/test-libc++-shared-full/BROKEN_BUILD b/tests/device/test-libc++-shared-full/BROKEN_BUILD
index be9fc83..e69de29 100644
--- a/tests/device/test-libc++-shared-full/BROKEN_BUILD
+++ b/tests/device/test-libc++-shared-full/BROKEN_BUILD
@@ -1 +0,0 @@
-4.6
\ No newline at end of file
diff --git a/tests/device/test-libc++-shared-full/BROKEN_RUN b/tests/device/test-libc++-shared-full/BROKEN_RUN
index 88878ae..56d7926 100644
--- a/tests/device/test-libc++-shared-full/BROKEN_RUN
+++ b/tests/device/test-libc++-shared-full/BROKEN_RUN
@@ -20,16 +20,6 @@
       I/DEBUG   (   51):     #00  pc 00035e66  /data/local/tmp/libc++_shared.so (__gabixx::__default_terminate()+13)
       I/DEBUG   (   51):     #01  pc 00035e7d  /data/local/tmp/libc++_shared.so (__gabixx::__terminate(void (*)())+16)
 
-FAIL: input.output___file.streams___fstreams___filebuf.virtuals___seekoff
-  cd ~/libcxx-test/input.output/file.streams/fstreams/filebuf.virtuals
-    nalibcxxg++  seekoff.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51):     #00  pc 000645ac  /data/local/tmp/libc++_shared.so (std::__1::codecvt<wchar_t, char, mbstate_t>::do_out(mbstate_t&, wchar_t const*, wchar_t const*, wchar_t const*&, char*, char*, char*&) const+39)
-      $NDK/sources/cxx-stl/llvm-libc++/libcxx/src/locale.cpp:1535
-         codecvt<wchar_t, char, mbstate_t>::do_out(state_type& st,
-             const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
-             extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
-         frm = NULL
-
 FAIL: input.output___iostream.format___output.streams___ostream_sentry___destruct
   cd ~/libcxx-test/input.output/iostream.format/output.streams/ostream_sentry
     nalibcxxg++  destruct.pass.cpp -lc++_shared -latomic
@@ -88,11 +78,6 @@
     nalibcxxg++  transform.pass.cpp -lc++_shared -latomic
       F/libc    (23516): transform.pass.cpp:33: int main(): assertion "f.transform(x.data(), x.data() + x.size()) != x" failed
 
-FAIL: localization___locale.categories___category.ctype___locale.codecvt___locale.codecvt.members___wchar_t_out
-  cd ~/libcxx-test/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members
-    nalibcxxg++  wchar_t_out.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'wchar_t_out.pass.cpp:65: int main(): assertion "from_next - from.data() == to.size()-1" failed'
-
 FAIL: localization___locale.categories___category.ctype___locale.ctype.byname___is_1
   cd ~/libcxx-test/localization/locale.categories/category.ctype/locale.ctype.byname
     nalibcxxg++  is_1.pass.cpp -lc++_shared -latomic
@@ -258,11 +243,6 @@
     nalibcxxg++  put_pointer.pass.cpp -lc++_shared -latomic
       I/DEBUG   (   51): Abort message: 'put_pointer.pass.cpp:41: int main(): assertion "ex == "0x0" || ex == "(nil)"" failed'
 
-FAIL: localization___locale.categories___category.numeric___locale.num.get___facet.num.get.members___get_pointer
-  cd ~/libcxx-test/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members
-    nalibcxxg++  get_pointer.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'get_pointer.pass.cpp:59: int main(): assertion "p == (void*)0x73" failed'
-
 FAIL: localization___locale.categories___category.time___locale.time.get.byname___date_order
   cd ~/libcxx-test/localization/locale.categories/category.time/locale.time.get.byname
     nalibcxxg++  date_order.pass.cpp -lc++_shared -latomic
@@ -333,71 +313,6 @@
     nalibcxxg++  char_pointer.pass.cpp -lc++_shared -latomic
       I/DEBUG   (   51): Abort message: 'char_pointer.pass.cpp:92: int main(): assertion "false" failed'
 
-FAIL: localization___locales___locale.convenience___conversions___conversions.buffer___seekoff
-  cd ~/libcxx-test/localization/locales/locale.convenience/conversions/conversions.buffer
-    nalibcxxg++  seekoff.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51):     #00  pc 00064598  /data/local/tmp/libc++_shared.so (std::__1::codecvt<wchar_t, char, mbstate_t>::do_out(mbstate_t&, wchar_t const*, wchar_t const*, wchar_t const*&, char*, char*, char*&) const+39)
-
-FAIL: re___re.alg___re.alg.match___basic
-  cd ~/libcxx-test/re/re.alg/re.alg.match
-    nalibcxxg++  basic.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'basic.pass.cpp:622: int main(): assertion "std::regex_match(s, m, std::regex("[a[=M=]z]", std::regex_constants::basic))" failed'
-
-FAIL: re___re.alg___re.alg.match___ecma
-  cd ~/libcxx-test/re/re.alg/re.alg.match
-    nalibcxxg++  ecma.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'ecma.pass.cpp:583: int main(): assertion "std::regex_match(s, m, std::regex("[a[=M=]z]"))" failed'
-
-FAIL: re___re.alg___re.alg.match___extended
-  cd ~/libcxx-test/re/re.alg/re.alg.match
-    nalibcxxg++  extended.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'ecma.pass.cpp:583: int main(): assertion "std::regex_match(s, m, std::regex("[a[=M=]z]"))" failed'
-
-FAIL: re___re.alg___re.alg.search___awk -lcompiler_rt_static -latomic
-  cd ~/libcxx-test/re/re.alg/re.alg.search
-    nalibcxxg++  awk.pass.cpp -lcompiler_rt_static -latomic
-      I/DEBUG   (   51): Abort message: 'awk.pass.cpp:692: int main(): assertion "std::regex_search(s, m, std::regex("[a[=M=]z]", std::regex_constants::awk))" failed'
-
-FAIL: re___re.alg___re.alg.search___basic
-  cd ~/libcxx-test/re/re.alg/re.alg.search
-    nalibcxxg++  basic.pass.cpp -lc++_shared -latomic
-      /libc    (16185): basic.pass.cpp:694: int main(): assertion "std::regex_search(s, m, std::regex("[a[=M=]z]", std::regex_
-
-FAIL: re___re.alg___re.alg.search___ecma
-  cd ~/libcxx-test/re/re.alg/re.alg.search
-    nalibcxxg++  ecma.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'ecma.pass.cpp:673: int main(): assertion "std::regex_search(s, m, std::regex("[a[=M=]z]"))" failed'
-
-FAIL: re___re.alg___re.alg.search___extended
-  cd ~/libcxx-test/re/re.alg/re.alg.search
-    nalibcxxg++  extended.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'extended.pass.cpp:692: int main(): assertion "std::regex_search(s, m, std::regex("[a[=M=]z]", std::regex_constants::extended))" failed'
-
-FAIL: re___re.traits___isctype
-  cd ~/libcxx-test/re/re.traits
-    nalibcxxg++  isctype.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'isctype.pass.cpp:29: int main(): assertion "!t.isctype(' ', t.lookup_classname(s.begin(), s.end()))" failed'
-
-FAIL: re___re.traits___lookup_collatename
-  cd ~/libcxx-test/re/re.traits
-    nalibcxxg++  lookup_collatename.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'lookup_collatename.pass.cpp:29: void test(const char_type *, const std::basic_string<char_type> &) [char_type = char]: assertion "t.lookup_collatename(F(A), F(A + t.length(A))) == expected" failed'
-
-FAIL: re___re.traits___transform
-  cd ~/libcxx-test/re/re.traits
-    nalibcxxg++  transform.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'transform.pass.cpp:31: int main(): assertion "t.transform(F(a), F(a+1)) < t.transform(F(B), F(B+1))" failed'
-
-FAIL: re___re.traits___transform_primary
-  cd ~/libcxx-test/re/re.traits
-    nalibcxxg++  transform_primary.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'transform_primary.pass.cpp:34: int main(): assertion "t.transform_primary(F(A), F(A+1)) == t.transform_primary(F(Aacute), F(Aacute+1))" failed'
-
-FAIL: re___re.traits___translate_nocase
-  cd ~/libcxx-test/re/re.traits
-    nalibcxxg++  translate_nocase.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'translate_nocase.pass.cpp:44: int main(): assertion "t.translate_nocase('\xDA') == '\xFA'" failed'
-
 FAIL: strings___string.conversions___stod
   cd ~/libcxx-test/strings/string.conversions
     nalibcxxg++  stod.pass.cpp -lc++_shared -latomic
@@ -439,6 +354,11 @@
     nalibcxxg++  stoul.pass.cpp -lc++_shared -latomic
       I/DEBUG   (   51): Abort message: '/tmp/ndk-andrewhsieh/tmp/build-10543/build-libc++/ndk/sources/cxx-stl/llvm-libc++/../../android/support/src/wchar_support.c:379: wcstoull: assertion "0" failed'
 
+FAIL: thread___futures___futures.async___async
+  cd ~/libcxx-test/thread/futures/futures.async
+    nalibcxxclang++  async.pass.cpp -lc++_shared -latomic
+      async.pass.cpp:187: int main(): assertion "false" failed
+
 FAIL: thread___futures___futures.promise___dtor
   cd ~/libcxx-test/thread/futures/futures.promise
     nalibcxxg++  dtor.pass.cpp -lc++_shared -latomic
diff --git a/tests/device/test-libc++-shared-full/jni/Android.mk b/tests/device/test-libc++-shared-full/jni/Android.mk
index b61d5b0..91bfc6e 100644
--- a/tests/device/test-libc++-shared-full/jni/Android.mk
+++ b/tests/device/test-libc++-shared-full/jni/Android.mk
@@ -31,8 +31,7 @@
 # The following black list contain test can't be compiled under various
 # configuration
 
-black_list_all := \
-    utilities/meta/meta.trans/meta.trans.other/aligned_storage
+black_list_all :=
 
 black_list_clang3_4 := \
     utilities/tuple/tuple.tuple/TupleFunction
@@ -42,68 +41,12 @@
     utilities/meta/meta.unary/meta.unary.prop/is_trivialially_copyable
 
 black_list_gcc4_8 := \
-    atomics/atomics.fences/atomic_signal_fence \
-    atomics/atomics.fences/atomic_thread_fence \
-    atomics/atomics.flag/atomic_flag_clear \
-    atomics/atomics.flag/atomic_flag_clear_explicit \
-    atomics/atomics.flag/atomic_flag_test_and_set \
     atomics/atomics.flag/atomic_flag_test_and_set_explicit \
-    atomics/atomics.flag/clear \
-    atomics/atomics.flag/default \
-    atomics/atomics.flag/init \
     atomics/atomics.flag/test_and_set \
-    atomics/atomics.general/nothing_to_do \
-    atomics/atomics.lockfree/lockfree \
-    atomics/atomics.order/kill_dependency \
-    atomics/atomics.order/memory_order \
-    atomics/atomics.syn/nothing_to_do \
-    atomics/atomics.types.generic/address \
-    atomics/atomics.types.generic/bool \
-    atomics/atomics.types.generic/cstdint_typedefs \
-    atomics/atomics.types.generic/integral \
-    atomics/atomics.types.generic/integral_typedefs \
-    atomics/atomics.types.operations/atomics.types.operations.arith/nothing_to_do \
-    atomics/atomics.types.operations/atomics.types.operations.general/nothing_to_do \
-    atomics/atomics.types.operations/atomics.types.operations.pointer/nothing_to_do \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_and \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_and_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_or \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_or_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_xor \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_xor_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_init \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_is_lock_free \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_load \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_load_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_store \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_store_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_var_init \
-    atomics/atomics.types.operations/atomics.types.operations.templ/nothing_to_do \
-    atomics/atomics.types.operations/nothing_to_do \
-    atomics/version \
-    thread/futures/futures.async/async \
-    thread/futures/futures.overview/launch \
-    utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default02 \
-    utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/pointer02 \
-    utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/default02 \
-    utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/pointer02 \
-    utilities/meta/meta.rel/is_convertible \
-    utilities/meta/meta.trans/meta.trans.other/underlying_type \
     utilities/meta/meta.unary/meta.unary.prop/is_literal_type \
     utilities/meta/meta.unary/meta.unary.prop/is_nothrow_assignable \
     utilities/meta/meta.unary/meta.unary.prop/is_nothrow_copy_constructible \
     utilities/meta/meta.unary/meta.unary.prop/is_nothrow_destructible \
-    utilities/meta/meta.unary/meta.unary.prop/is_nothrow_move_constructible \
     utilities/meta/meta.unary/meta.unary.prop/is_trivial \
     utilities/meta/meta.unary/meta.unary.prop/is_trivialially_copyable \
     utilities/meta/meta.unary/meta.unary.prop/is_trivially_assignable \
@@ -111,103 +54,11 @@
     utilities/meta/meta.unary/meta.unary.prop/is_trivially_copy_constructible \
     utilities/meta/meta.unary/meta.unary.prop/is_trivially_move_assignable \
     utilities/meta/meta.unary/meta.unary.prop/is_trivially_move_constructible \
-    utilities/utility/pairs/pairs.pair/copy_ctor \
-    utilities/utility/pairs/pairs.pair/rv_pair_U_V \
-    utilities/utility/pairs/pairs.spec/make_pair
+    utilities/utility/pairs/pairs.pair/copy_ctor
 
 black_list_gcc4_9 := \
-    atomics/atomics.fences/atomic_signal_fence \
-    atomics/atomics.fences/atomic_thread_fence \
-    atomics/atomics.flag/atomic_flag_clear \
-    atomics/atomics.flag/atomic_flag_clear_explicit \
-    atomics/atomics.flag/atomic_flag_test_and_set \
-    atomics/atomics.flag/atomic_flag_test_and_set_explicit \
-    atomics/atomics.flag/clear \
-    atomics/atomics.flag/default \
-    atomics/atomics.flag/init \
-    atomics/atomics.flag/test_and_set \
-    atomics/atomics.general/nothing_to_do \
-    atomics/atomics.lockfree/lockfree \
-    atomics/atomics.order/kill_dependency \
-    atomics/atomics.order/memory_order \
-    atomics/atomics.syn/nothing_to_do \
-    atomics/atomics.types.generic/address \
-    atomics/atomics.types.generic/bool \
-    atomics/atomics.types.generic/cstdint_typedefs \
-    atomics/atomics.types.generic/integral \
-    atomics/atomics.types.generic/integral_typedefs \
-    atomics/atomics.types.operations/atomics.types.operations.arith/nothing_to_do \
-    atomics/atomics.types.operations/atomics.types.operations.general/nothing_to_do \
-    atomics/atomics.types.operations/atomics.types.operations.pointer/nothing_to_do \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_and \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_and_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_or \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_or_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_xor \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_xor_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_init \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_is_lock_free \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_load \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_load_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_store \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_store_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_var_init \
-    atomics/atomics.types.operations/atomics.types.operations.templ/nothing_to_do \
-    atomics/atomics.types.operations/nothing_to_do \
-    atomics/version \
-    thread/futures/futures.async/async \
-    thread/futures/futures.overview/launch \
-    utilities/function.objects/bind/func.bind/func.bind.bind/invoke_lvalue \
-    utilities/function.objects/bind/func.bind/func.bind.bind/invoke_rvalue \
-    utilities/function.objects/func.memfn/member_function_const \
-    utilities/function.objects/func.memfn/member_function_const_volatile \
-    utilities/function.objects/func.memfn/member_function_volatile \
-    utilities/function.objects/func.require/invoke \
-    utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_F \
-    utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F \
-    utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F_assign \
-    utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.inv/invoke \
-    utilities/function.objects/refwrap/refwrap.invoke/invoke \
-    utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default02 \
-    utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/pointer02 \
-    utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/default02 \
-    utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/pointer02 \
-    utilities/meta/meta.rel/is_convertible \
-    utilities/meta/meta.trans/meta.trans.other/result_of \
-    utilities/meta/meta.trans/meta.trans.other/underlying_type \
-    utilities/meta/meta.unary/meta.unary.prop/is_literal_type \
-    utilities/meta/meta.unary/meta.unary.prop/is_nothrow_assignable \
-    utilities/meta/meta.unary/meta.unary.prop/is_nothrow_copy_constructible \
-    utilities/meta/meta.unary/meta.unary.prop/is_nothrow_destructible \
-    utilities/meta/meta.unary/meta.unary.prop/is_nothrow_move_constructible \
-    utilities/meta/meta.unary/meta.unary.prop/is_trivial \
-    utilities/meta/meta.unary/meta.unary.prop/is_trivialially_copyable \
-    utilities/meta/meta.unary/meta.unary.prop/is_trivially_assignable \
-    utilities/meta/meta.unary/meta.unary.prop/is_trivially_copy_assignable \
-    utilities/meta/meta.unary/meta.unary.prop/is_trivially_copy_constructible \
-    utilities/meta/meta.unary/meta.unary.prop/is_trivially_move_assignable \
-    utilities/meta/meta.unary/meta.unary.prop/is_trivially_move_constructible \
-    utilities/tuple/tuple.tuple/TupleFunction \
-    utilities/utility/pairs/pairs.pair/copy_ctor \
-    utilities/utility/pairs/pairs.pair/rv_pair_U_V \
-    utilities/utility/pairs/pairs.spec/make_pair
-
-black_list_x86 := \
-    language.support/support.types/max_align_t
-
-black_list_gcc4_9_armeabi := \
-    strings/basic.string/string.modifiers/string_replace/size_size_string_size_size \
-    strings/basic.string/string.ops/string_compare/size_size_string_size_size   # sometime
+    $(black_list_gcc4_8) \
+    utilities/tuple/tuple.tuple/TupleFunction
 
 # Compute the back_list in this particular configuration: "all | compiler | arch"
 
@@ -224,17 +75,10 @@
 else
 ifeq (4.9,$(NDK_TOOLCHAIN_VERSION))
 black_list += $(black_list_gcc4_9)
-ifeq ($(TARGET_ARCH_ABI),armeabi)
-black_list += $(black_list_gcc4_9_armeabi)
 endif
 endif
 endif
 endif
-endif
-
-ifeq ($(TARGET_ARCH_ABI),x86)
-black_list += $(black_list_x86)
-endif
 
 # Function  gen-test
 gen-test = \
diff --git a/tests/device/test-libc++-static-full/BROKEN_BUILD b/tests/device/test-libc++-static-full/BROKEN_BUILD
index be9fc83..e69de29 100644
--- a/tests/device/test-libc++-static-full/BROKEN_BUILD
+++ b/tests/device/test-libc++-static-full/BROKEN_BUILD
@@ -1 +0,0 @@
-4.6
\ No newline at end of file
diff --git a/tests/device/test-libc++-static-full/BROKEN_RUN b/tests/device/test-libc++-static-full/BROKEN_RUN
index 88878ae..56d7926 100644
--- a/tests/device/test-libc++-static-full/BROKEN_RUN
+++ b/tests/device/test-libc++-static-full/BROKEN_RUN
@@ -20,16 +20,6 @@
       I/DEBUG   (   51):     #00  pc 00035e66  /data/local/tmp/libc++_shared.so (__gabixx::__default_terminate()+13)
       I/DEBUG   (   51):     #01  pc 00035e7d  /data/local/tmp/libc++_shared.so (__gabixx::__terminate(void (*)())+16)
 
-FAIL: input.output___file.streams___fstreams___filebuf.virtuals___seekoff
-  cd ~/libcxx-test/input.output/file.streams/fstreams/filebuf.virtuals
-    nalibcxxg++  seekoff.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51):     #00  pc 000645ac  /data/local/tmp/libc++_shared.so (std::__1::codecvt<wchar_t, char, mbstate_t>::do_out(mbstate_t&, wchar_t const*, wchar_t const*, wchar_t const*&, char*, char*, char*&) const+39)
-      $NDK/sources/cxx-stl/llvm-libc++/libcxx/src/locale.cpp:1535
-         codecvt<wchar_t, char, mbstate_t>::do_out(state_type& st,
-             const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
-             extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
-         frm = NULL
-
 FAIL: input.output___iostream.format___output.streams___ostream_sentry___destruct
   cd ~/libcxx-test/input.output/iostream.format/output.streams/ostream_sentry
     nalibcxxg++  destruct.pass.cpp -lc++_shared -latomic
@@ -88,11 +78,6 @@
     nalibcxxg++  transform.pass.cpp -lc++_shared -latomic
       F/libc    (23516): transform.pass.cpp:33: int main(): assertion "f.transform(x.data(), x.data() + x.size()) != x" failed
 
-FAIL: localization___locale.categories___category.ctype___locale.codecvt___locale.codecvt.members___wchar_t_out
-  cd ~/libcxx-test/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members
-    nalibcxxg++  wchar_t_out.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'wchar_t_out.pass.cpp:65: int main(): assertion "from_next - from.data() == to.size()-1" failed'
-
 FAIL: localization___locale.categories___category.ctype___locale.ctype.byname___is_1
   cd ~/libcxx-test/localization/locale.categories/category.ctype/locale.ctype.byname
     nalibcxxg++  is_1.pass.cpp -lc++_shared -latomic
@@ -258,11 +243,6 @@
     nalibcxxg++  put_pointer.pass.cpp -lc++_shared -latomic
       I/DEBUG   (   51): Abort message: 'put_pointer.pass.cpp:41: int main(): assertion "ex == "0x0" || ex == "(nil)"" failed'
 
-FAIL: localization___locale.categories___category.numeric___locale.num.get___facet.num.get.members___get_pointer
-  cd ~/libcxx-test/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members
-    nalibcxxg++  get_pointer.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'get_pointer.pass.cpp:59: int main(): assertion "p == (void*)0x73" failed'
-
 FAIL: localization___locale.categories___category.time___locale.time.get.byname___date_order
   cd ~/libcxx-test/localization/locale.categories/category.time/locale.time.get.byname
     nalibcxxg++  date_order.pass.cpp -lc++_shared -latomic
@@ -333,71 +313,6 @@
     nalibcxxg++  char_pointer.pass.cpp -lc++_shared -latomic
       I/DEBUG   (   51): Abort message: 'char_pointer.pass.cpp:92: int main(): assertion "false" failed'
 
-FAIL: localization___locales___locale.convenience___conversions___conversions.buffer___seekoff
-  cd ~/libcxx-test/localization/locales/locale.convenience/conversions/conversions.buffer
-    nalibcxxg++  seekoff.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51):     #00  pc 00064598  /data/local/tmp/libc++_shared.so (std::__1::codecvt<wchar_t, char, mbstate_t>::do_out(mbstate_t&, wchar_t const*, wchar_t const*, wchar_t const*&, char*, char*, char*&) const+39)
-
-FAIL: re___re.alg___re.alg.match___basic
-  cd ~/libcxx-test/re/re.alg/re.alg.match
-    nalibcxxg++  basic.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'basic.pass.cpp:622: int main(): assertion "std::regex_match(s, m, std::regex("[a[=M=]z]", std::regex_constants::basic))" failed'
-
-FAIL: re___re.alg___re.alg.match___ecma
-  cd ~/libcxx-test/re/re.alg/re.alg.match
-    nalibcxxg++  ecma.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'ecma.pass.cpp:583: int main(): assertion "std::regex_match(s, m, std::regex("[a[=M=]z]"))" failed'
-
-FAIL: re___re.alg___re.alg.match___extended
-  cd ~/libcxx-test/re/re.alg/re.alg.match
-    nalibcxxg++  extended.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'ecma.pass.cpp:583: int main(): assertion "std::regex_match(s, m, std::regex("[a[=M=]z]"))" failed'
-
-FAIL: re___re.alg___re.alg.search___awk -lcompiler_rt_static -latomic
-  cd ~/libcxx-test/re/re.alg/re.alg.search
-    nalibcxxg++  awk.pass.cpp -lcompiler_rt_static -latomic
-      I/DEBUG   (   51): Abort message: 'awk.pass.cpp:692: int main(): assertion "std::regex_search(s, m, std::regex("[a[=M=]z]", std::regex_constants::awk))" failed'
-
-FAIL: re___re.alg___re.alg.search___basic
-  cd ~/libcxx-test/re/re.alg/re.alg.search
-    nalibcxxg++  basic.pass.cpp -lc++_shared -latomic
-      /libc    (16185): basic.pass.cpp:694: int main(): assertion "std::regex_search(s, m, std::regex("[a[=M=]z]", std::regex_
-
-FAIL: re___re.alg___re.alg.search___ecma
-  cd ~/libcxx-test/re/re.alg/re.alg.search
-    nalibcxxg++  ecma.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'ecma.pass.cpp:673: int main(): assertion "std::regex_search(s, m, std::regex("[a[=M=]z]"))" failed'
-
-FAIL: re___re.alg___re.alg.search___extended
-  cd ~/libcxx-test/re/re.alg/re.alg.search
-    nalibcxxg++  extended.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'extended.pass.cpp:692: int main(): assertion "std::regex_search(s, m, std::regex("[a[=M=]z]", std::regex_constants::extended))" failed'
-
-FAIL: re___re.traits___isctype
-  cd ~/libcxx-test/re/re.traits
-    nalibcxxg++  isctype.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'isctype.pass.cpp:29: int main(): assertion "!t.isctype(' ', t.lookup_classname(s.begin(), s.end()))" failed'
-
-FAIL: re___re.traits___lookup_collatename
-  cd ~/libcxx-test/re/re.traits
-    nalibcxxg++  lookup_collatename.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'lookup_collatename.pass.cpp:29: void test(const char_type *, const std::basic_string<char_type> &) [char_type = char]: assertion "t.lookup_collatename(F(A), F(A + t.length(A))) == expected" failed'
-
-FAIL: re___re.traits___transform
-  cd ~/libcxx-test/re/re.traits
-    nalibcxxg++  transform.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'transform.pass.cpp:31: int main(): assertion "t.transform(F(a), F(a+1)) < t.transform(F(B), F(B+1))" failed'
-
-FAIL: re___re.traits___transform_primary
-  cd ~/libcxx-test/re/re.traits
-    nalibcxxg++  transform_primary.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'transform_primary.pass.cpp:34: int main(): assertion "t.transform_primary(F(A), F(A+1)) == t.transform_primary(F(Aacute), F(Aacute+1))" failed'
-
-FAIL: re___re.traits___translate_nocase
-  cd ~/libcxx-test/re/re.traits
-    nalibcxxg++  translate_nocase.pass.cpp -lc++_shared -latomic
-      I/DEBUG   (   51): Abort message: 'translate_nocase.pass.cpp:44: int main(): assertion "t.translate_nocase('\xDA') == '\xFA'" failed'
-
 FAIL: strings___string.conversions___stod
   cd ~/libcxx-test/strings/string.conversions
     nalibcxxg++  stod.pass.cpp -lc++_shared -latomic
@@ -439,6 +354,11 @@
     nalibcxxg++  stoul.pass.cpp -lc++_shared -latomic
       I/DEBUG   (   51): Abort message: '/tmp/ndk-andrewhsieh/tmp/build-10543/build-libc++/ndk/sources/cxx-stl/llvm-libc++/../../android/support/src/wchar_support.c:379: wcstoull: assertion "0" failed'
 
+FAIL: thread___futures___futures.async___async
+  cd ~/libcxx-test/thread/futures/futures.async
+    nalibcxxclang++  async.pass.cpp -lc++_shared -latomic
+      async.pass.cpp:187: int main(): assertion "false" failed
+
 FAIL: thread___futures___futures.promise___dtor
   cd ~/libcxx-test/thread/futures/futures.promise
     nalibcxxg++  dtor.pass.cpp -lc++_shared -latomic
diff --git a/tests/device/test-libc++-static-full/jni/Android.mk b/tests/device/test-libc++-static-full/jni/Android.mk
index f97ac13..91bfc6e 100644
--- a/tests/device/test-libc++-static-full/jni/Android.mk
+++ b/tests/device/test-libc++-static-full/jni/Android.mk
@@ -9,7 +9,9 @@
 LOCAL_MODULE := $$(subst /,___,$$(__test))
 
 # armeabi and mips needs libatomic to provide "__atomic_is_lock_free"
+ifneq (,$(filter armeabi mips,$(TARGET_ARCH_ABI)))
 LOCAL_LDLIBS += -latomic
+endif
 
 # Enable RTTI and exception handling for some tests
 LOCAL_CPP_FEATURES := rtti exceptions
@@ -29,8 +31,7 @@
 # The following black list contain test can't be compiled under various
 # configuration
 
-black_list_all := \
-    utilities/meta/meta.trans/meta.trans.other/aligned_storage
+black_list_all :=
 
 black_list_clang3_4 := \
     utilities/tuple/tuple.tuple/TupleFunction
@@ -40,68 +41,12 @@
     utilities/meta/meta.unary/meta.unary.prop/is_trivialially_copyable
 
 black_list_gcc4_8 := \
-    atomics/atomics.fences/atomic_signal_fence \
-    atomics/atomics.fences/atomic_thread_fence \
-    atomics/atomics.flag/atomic_flag_clear \
-    atomics/atomics.flag/atomic_flag_clear_explicit \
-    atomics/atomics.flag/atomic_flag_test_and_set \
     atomics/atomics.flag/atomic_flag_test_and_set_explicit \
-    atomics/atomics.flag/clear \
-    atomics/atomics.flag/default \
-    atomics/atomics.flag/init \
     atomics/atomics.flag/test_and_set \
-    atomics/atomics.general/nothing_to_do \
-    atomics/atomics.lockfree/lockfree \
-    atomics/atomics.order/kill_dependency \
-    atomics/atomics.order/memory_order \
-    atomics/atomics.syn/nothing_to_do \
-    atomics/atomics.types.generic/address \
-    atomics/atomics.types.generic/bool \
-    atomics/atomics.types.generic/cstdint_typedefs \
-    atomics/atomics.types.generic/integral \
-    atomics/atomics.types.generic/integral_typedefs \
-    atomics/atomics.types.operations/atomics.types.operations.arith/nothing_to_do \
-    atomics/atomics.types.operations/atomics.types.operations.general/nothing_to_do \
-    atomics/atomics.types.operations/atomics.types.operations.pointer/nothing_to_do \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_and \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_and_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_or \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_or_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_xor \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_xor_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_init \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_is_lock_free \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_load \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_load_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_store \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_store_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_var_init \
-    atomics/atomics.types.operations/atomics.types.operations.templ/nothing_to_do \
-    atomics/atomics.types.operations/nothing_to_do \
-    atomics/version \
-    thread/futures/futures.async/async \
-    thread/futures/futures.overview/launch \
-    utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default02 \
-    utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/pointer02 \
-    utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/default02 \
-    utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/pointer02 \
-    utilities/meta/meta.rel/is_convertible \
-    utilities/meta/meta.trans/meta.trans.other/underlying_type \
     utilities/meta/meta.unary/meta.unary.prop/is_literal_type \
     utilities/meta/meta.unary/meta.unary.prop/is_nothrow_assignable \
     utilities/meta/meta.unary/meta.unary.prop/is_nothrow_copy_constructible \
     utilities/meta/meta.unary/meta.unary.prop/is_nothrow_destructible \
-    utilities/meta/meta.unary/meta.unary.prop/is_nothrow_move_constructible \
     utilities/meta/meta.unary/meta.unary.prop/is_trivial \
     utilities/meta/meta.unary/meta.unary.prop/is_trivialially_copyable \
     utilities/meta/meta.unary/meta.unary.prop/is_trivially_assignable \
@@ -109,103 +54,11 @@
     utilities/meta/meta.unary/meta.unary.prop/is_trivially_copy_constructible \
     utilities/meta/meta.unary/meta.unary.prop/is_trivially_move_assignable \
     utilities/meta/meta.unary/meta.unary.prop/is_trivially_move_constructible \
-    utilities/utility/pairs/pairs.pair/copy_ctor \
-    utilities/utility/pairs/pairs.pair/rv_pair_U_V \
-    utilities/utility/pairs/pairs.spec/make_pair
+    utilities/utility/pairs/pairs.pair/copy_ctor
 
 black_list_gcc4_9 := \
-    atomics/atomics.fences/atomic_signal_fence \
-    atomics/atomics.fences/atomic_thread_fence \
-    atomics/atomics.flag/atomic_flag_clear \
-    atomics/atomics.flag/atomic_flag_clear_explicit \
-    atomics/atomics.flag/atomic_flag_test_and_set \
-    atomics/atomics.flag/atomic_flag_test_and_set_explicit \
-    atomics/atomics.flag/clear \
-    atomics/atomics.flag/default \
-    atomics/atomics.flag/init \
-    atomics/atomics.flag/test_and_set \
-    atomics/atomics.general/nothing_to_do \
-    atomics/atomics.lockfree/lockfree \
-    atomics/atomics.order/kill_dependency \
-    atomics/atomics.order/memory_order \
-    atomics/atomics.syn/nothing_to_do \
-    atomics/atomics.types.generic/address \
-    atomics/atomics.types.generic/bool \
-    atomics/atomics.types.generic/cstdint_typedefs \
-    atomics/atomics.types.generic/integral \
-    atomics/atomics.types.generic/integral_typedefs \
-    atomics/atomics.types.operations/atomics.types.operations.arith/nothing_to_do \
-    atomics/atomics.types.operations/atomics.types.operations.general/nothing_to_do \
-    atomics/atomics.types.operations/atomics.types.operations.pointer/nothing_to_do \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_and \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_and_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_or \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_or_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_xor \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_xor_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_init \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_is_lock_free \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_load \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_load_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_store \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_store_explicit \
-    atomics/atomics.types.operations/atomics.types.operations.req/atomic_var_init \
-    atomics/atomics.types.operations/atomics.types.operations.templ/nothing_to_do \
-    atomics/atomics.types.operations/nothing_to_do \
-    atomics/version \
-    thread/futures/futures.async/async \
-    thread/futures/futures.overview/launch \
-    utilities/function.objects/bind/func.bind/func.bind.bind/invoke_lvalue \
-    utilities/function.objects/bind/func.bind/func.bind.bind/invoke_rvalue \
-    utilities/function.objects/func.memfn/member_function_const \
-    utilities/function.objects/func.memfn/member_function_const_volatile \
-    utilities/function.objects/func.memfn/member_function_volatile \
-    utilities/function.objects/func.require/invoke \
-    utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_F \
-    utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F \
-    utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/F_assign \
-    utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.inv/invoke \
-    utilities/function.objects/refwrap/refwrap.invoke/invoke \
-    utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default02 \
-    utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/pointer02 \
-    utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/default02 \
-    utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/pointer02 \
-    utilities/meta/meta.rel/is_convertible \
-    utilities/meta/meta.trans/meta.trans.other/result_of \
-    utilities/meta/meta.trans/meta.trans.other/underlying_type \
-    utilities/meta/meta.unary/meta.unary.prop/is_literal_type \
-    utilities/meta/meta.unary/meta.unary.prop/is_nothrow_assignable \
-    utilities/meta/meta.unary/meta.unary.prop/is_nothrow_copy_constructible \
-    utilities/meta/meta.unary/meta.unary.prop/is_nothrow_destructible \
-    utilities/meta/meta.unary/meta.unary.prop/is_nothrow_move_constructible \
-    utilities/meta/meta.unary/meta.unary.prop/is_trivial \
-    utilities/meta/meta.unary/meta.unary.prop/is_trivialially_copyable \
-    utilities/meta/meta.unary/meta.unary.prop/is_trivially_assignable \
-    utilities/meta/meta.unary/meta.unary.prop/is_trivially_copy_assignable \
-    utilities/meta/meta.unary/meta.unary.prop/is_trivially_copy_constructible \
-    utilities/meta/meta.unary/meta.unary.prop/is_trivially_move_assignable \
-    utilities/meta/meta.unary/meta.unary.prop/is_trivially_move_constructible \
-    utilities/tuple/tuple.tuple/TupleFunction \
-    utilities/utility/pairs/pairs.pair/copy_ctor \
-    utilities/utility/pairs/pairs.pair/rv_pair_U_V \
-    utilities/utility/pairs/pairs.spec/make_pair
-
-black_list_x86 := \
-    language.support/support.types/max_align_t
-
-black_list_gcc4_9_armeabi := \
-    strings/basic.string/string.modifiers/string_replace/size_size_string_size_size \
-    strings/basic.string/string.ops/string_compare/size_size_string_size_size   # sometime
+    $(black_list_gcc4_8) \
+    utilities/tuple/tuple.tuple/TupleFunction
 
 # Compute the back_list in this particular configuration: "all | compiler | arch"
 
@@ -222,17 +75,10 @@
 else
 ifeq (4.9,$(NDK_TOOLCHAIN_VERSION))
 black_list += $(black_list_gcc4_9)
-ifeq ($(TARGET_ARCH_ABI),armeabi)
-black_list += $(black_list_gcc4_9_armeabi)
 endif
 endif
 endif
 endif
-endif
-
-ifeq ($(TARGET_ARCH_ABI),x86)
-black_list += $(black_list_x86)
-endif
 
 # Function  gen-test
 gen-test = \