Merge pull request #601 from knocte/sock_improvements
authorMarek Safar <marek.safar@gmail.com>
Mon, 8 Apr 2013 10:00:28 +0000 (03:00 -0700)
committerMarek Safar <marek.safar@gmail.com>
Mon, 8 Apr 2013 10:00:28 +0000 (03:00 -0700)
 [System.Net.Sockets] Specify 'timeout' in the exception msg of the Receive(buf) overload

361 files changed:
autogen.sh
configure.in
eglib/src/eglib-config.h.in
eglib/src/gfile-posix.c
eglib/src/gmodule-unix.c
eglib/src/goutput.c
external/cecil
ikvm-native/os.c
libgc/dyn_load.c
libgc/include/private/gc_locks.h
libgc/include/private/gcconfig.h
libgc/misc.c
libgc/pthread_stop_world.c
libgc/pthread_support.c
man/mono.1
mcs/class/Makefile
mcs/class/Managed.Windows.Forms/System.Windows.Forms/UpDownBase.cs
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItemGroup.cs
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTask.cs
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTaskItemGroup.cs [new file with mode: 0644]
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTaskPropertyGroup.cs [new file with mode: 0644]
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConditionParser.cs
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/IBuildTask.cs [new file with mode: 0644]
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Target.cs
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/TargetBatchingImpl.cs
mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/TaskBatchingImpl.cs
mcs/class/Microsoft.Build.Engine/Microsoft.Build.Engine.dll.sources
mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/BuildItemTest.cs
mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/BuildPropertyGroupTest.cs
mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/BuildPropertyTest.cs
mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/ConsoleLoggerTest.cs
mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/EngineTest.cs
mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/ProjectTest.cs
mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/TargetTest.cs
mcs/class/Microsoft.Build.Engine/Test/Microsoft.Build.BuildEngine/UsingTaskTest.cs
mcs/class/Microsoft.Build.Engine/Test/various/Conditions.cs
mcs/class/Microsoft.Build.Engine/Test/various/EvaluationOrder.cs
mcs/class/Microsoft.Build.Engine/Test/various/Items.cs
mcs/class/Microsoft.Build.Engine/Test/various/Properties.cs
mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/CustomAttributeDataMirror.cs
mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/MethodMirror.cs
mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/VirtualMachine.cs
mcs/class/Mono.Debugger.Soft/Test/dtest-app.cs
mcs/class/Mono.Debugger.Soft/Test/dtest.cs
mcs/class/Mono.Posix/Mono.Unix.Native/NativeConvert.cs
mcs/class/Mono.Posix/Mono.Unix.Native/NativeConvert.generated.cs
mcs/class/Mono.Posix/Mono.Unix.Native/Syscall.cs
mcs/class/System.Core/System.Linq/Enumerable.cs
mcs/class/System.Data/System.Data/DataRow.cs
mcs/class/System.Data/System.Data/DataTableCollection.cs
mcs/class/System.Data/Test/System.Data.Common/DBDataPermissionAttributeTest.cs
mcs/class/System.Data/Test/System.Data.Common/DBDataPermissionTest.cs
mcs/class/System.Data/Test/System.Data.SqlClient/SqlClientPermissionAttributeTest.cs
mcs/class/System.Data/Test/System.Data.SqlClient/SqlClientPermissionTest.cs
mcs/class/System.Data/Test/System.Data/DataRowTest.cs
mcs/class/System.Data/Test/System.Data/DataSetReadXmlTest.cs
mcs/class/System.Data/Test/System.Data/DataSetTest2.cs
mcs/class/System.Data/Test/System.Data/DataTableTest.cs
mcs/class/System.Net.Http/System.Net.Http/HttpClientHandler.cs
mcs/class/System.Reactive.Core/Makefile
mcs/class/System.Reactive.Debugger/Makefile
mcs/class/System.Reactive.Experimental/Makefile
mcs/class/System.Reactive.Interfaces/Makefile
mcs/class/System.Reactive.Linq/Makefile
mcs/class/System.Reactive.PlatformServices/Makefile
mcs/class/System.Reactive.Providers/Makefile
mcs/class/System.Reactive.Runtime.Remoting/Makefile
mcs/class/System.Reactive.Windows.Forms/Makefile
mcs/class/System.Reactive.Windows.Threading/Makefile
mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/XmlObjectSerializer.cs
mcs/class/System.Runtime.Serialization/System.Runtime.Serialization_test.dll.sources
mcs/class/System.Runtime.Serialization/Test/System.Runtime.Serialization/DataContractSerializerTest_InvalidCharacters.cs [new file with mode: 0644]
mcs/class/System.Runtime.Serialization/Test/System.Runtime.Serialization/XmlObjectSerializerTest.cs
mcs/class/System.ServiceModel.Web/Makefile
mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpChannelFactory.cs
mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpCookieContainerBindingElement.cs
mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpRequestChannel.cs
mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpTransportBindingElement.cs
mcs/class/System.ServiceModel/System.ServiceModel.Channels/IHttpCookieContainer.cs
mcs/class/System.ServiceModel/System.ServiceModel.Channels/TextMessageEncoder.cs
mcs/class/System.ServiceModel/System.ServiceModel/BasicHttpBinding.cs
mcs/class/System.ServiceModel/System.ServiceModel/ChannelFactory.cs
mcs/class/System.ServiceModel/Test/System.ServiceModel.Description/WsdlExporterTest.cs
mcs/class/System.ServiceModel/net_4_0_System.ServiceModel.dll.sources
mcs/class/System.Web.Http.WebHost/Makefile [new file with mode: 0644]
mcs/class/System.Web.Http.WebHost/System.Web.Http.WebHost.dll.sources [new file with mode: 0644]
mcs/class/System.Web.Services/Test/System.Web.Services.Description/ServiceDescriptionTest.cs
mcs/class/System.XML/Test/System.Xml.Schema/XmlSchemaTests.cs
mcs/class/System.XML/Test/System.Xml.Serialization/XmlReflectionImporterTests.cs
mcs/class/System.XML/Test/System.Xml.Xsl/XslTransformTests.cs
mcs/class/System.XML/Test/System.Xml/XmlReaderCommonTests.cs
mcs/class/System.XML/Test/System.Xml/XmlValidatingReaderTests.cs
mcs/class/System/System.Net/HttpUtility.cs
mcs/class/System/System.Security.Cryptography.X509Certificates/X500DistinguishedName.cs
mcs/class/System/System.Security.Cryptography.X509Certificates/X509BasicConstraintsExtension.cs
mcs/class/System/System.Security.Cryptography.X509Certificates/X509Chain.cs
mcs/class/System/System.Security.Cryptography.X509Certificates/X509EnhancedKeyUsageExtension.cs
mcs/class/System/System.Security.Cryptography.X509Certificates/X509KeyUsageExtension.cs
mcs/class/System/System.Security.Cryptography.X509Certificates/X509Store.cs
mcs/class/System/System.Security.Cryptography.X509Certificates/X509SubjectKeyIdentifierExtension.cs
mcs/class/System/System.Security.Cryptography/AsnEncodedData.cs
mcs/class/System/Test/System.ComponentModel.Design.Serialization/InstanceDescriptorTest.cs
mcs/class/System/Test/System.ComponentModel/TypeDescriptorTests.cs
mcs/class/System/Test/System.Net/WebClientTest.cs
mcs/class/System/Test/System.Net/WebPermissionAttributeTest.cs
mcs/class/System/Test/System.Net/WebPermissionTest.cs
mcs/class/System/Test/System.Net/WebUtilityTest.cs
mcs/class/corlib/System.Globalization/CultureInfo.cs
mcs/class/corlib/System.Runtime.InteropServices/Marshal.cs
mcs/class/corlib/System.Threading.Tasks/Task.cs
mcs/class/corlib/System.Threading.Tasks/TaskContinuation.cs
mcs/class/corlib/System/AppDomain.cs
mcs/class/corlib/System/Array.cs
mcs/class/corlib/System/DateTime.cs
mcs/class/corlib/System/DateTimeUtils.cs
mcs/class/corlib/System/Delegate.cs
mcs/class/corlib/System/Int32.cs
mcs/class/corlib/System/Int64.cs
mcs/class/corlib/System/IntPtr.cs
mcs/class/corlib/System/UInt32.cs
mcs/class/corlib/System/UInt64.cs
mcs/class/corlib/Test/System.Globalization/CultureInfoTest.cs
mcs/class/corlib/Test/System.Globalization/DateTimeFormatInfoTest.cs
mcs/class/corlib/Test/System.Runtime.InteropServices/MarshalTest.cs
mcs/class/corlib/Test/System/DateTimeTest.cs
mcs/class/corlib/Test/System/DecimalTest.cs
mcs/class/corlib/Test/System/DoubleTest.cs
mcs/class/corlib/Test/System/Int32Test.cs
mcs/class/corlib/Test/System/Int64Test.cs
mcs/class/corlib/Test/System/UInt32Test.cs
mcs/class/corlib/Test/System/UInt64Test.cs
mcs/class/monodoc/Makefile
mcs/class/monodoc/Monodoc.Ecma/EcmaDesc.cs
mcs/class/monodoc/Monodoc.Ecma/EcmaUrlTokenizer.cs
mcs/class/monodoc/Monodoc/providers/EcmaDoc.cs
mcs/class/monodoc/Test/Monodoc.Ecma/EcmaUrlTests.cs
mcs/class/monodoc/Test/Monodoc/EcmaDocTests.cs [new file with mode: 0644]
mcs/class/monodoc/Test/Monodoc/HelpSourceTests.cs
mcs/class/monodoc/monodoc_test.dll.sources
mcs/errors/cs0012-19.cs [new file with mode: 0644]
mcs/errors/cs0012-20.cs [new file with mode: 0644]
mcs/errors/cs0154-5.cs [new file with mode: 0644]
mcs/errors/cs0162-17.cs [new file with mode: 0644]
mcs/errors/cs0185-2.cs [new file with mode: 0644]
mcs/errors/cs0185.cs
mcs/errors/cs0761-2.cs [new file with mode: 0644]
mcs/errors/cs0761.cs [new file with mode: 0644]
mcs/errors/cs1001-8.cs [new file with mode: 0644]
mcs/errors/cs1502-17.cs [new file with mode: 0644]
mcs/errors/cs1502-18.cs [new file with mode: 0644]
mcs/errors/cs1519-5.cs [new file with mode: 0644]
mcs/errors/cs1525-52.cs [new file with mode: 0644]
mcs/errors/cs1525-53.cs [new file with mode: 0644]
mcs/errors/cs1525-54.cs [new file with mode: 0644]
mcs/errors/cs1997-2.cs [new file with mode: 0644]
mcs/mcs/anonymous.cs
mcs/mcs/argument.cs
mcs/mcs/assembly.cs
mcs/mcs/async.cs
mcs/mcs/attribute.cs
mcs/mcs/class.cs
mcs/mcs/const.cs
mcs/mcs/constant.cs
mcs/mcs/cs-parser.jay
mcs/mcs/cs-tokenizer.cs
mcs/mcs/decl.cs
mcs/mcs/delegate.cs
mcs/mcs/dynamic.cs
mcs/mcs/ecore.cs
mcs/mcs/enum.cs
mcs/mcs/expression.cs
mcs/mcs/field.cs
mcs/mcs/generic.cs
mcs/mcs/import.cs
mcs/mcs/iterators.cs
mcs/mcs/linq.cs
mcs/mcs/literal.cs
mcs/mcs/location.cs
mcs/mcs/membercache.cs
mcs/mcs/method.cs
mcs/mcs/namespace.cs
mcs/mcs/nullable.cs
mcs/mcs/parameter.cs
mcs/mcs/property.cs
mcs/mcs/report.cs
mcs/mcs/statement.cs
mcs/mcs/typemanager.cs
mcs/mcs/typespec.cs
mcs/tests/gtest-581-lib.cs [new file with mode: 0644]
mcs/tests/gtest-581.cs [new file with mode: 0644]
mcs/tests/gtest-582-lib.cs [new file with mode: 0644]
mcs/tests/gtest-582.cs [new file with mode: 0644]
mcs/tests/gtest-partial-06.cs [new file with mode: 0644]
mcs/tests/test-476.cs
mcs/tests/test-async-46.cs [new file with mode: 0644]
mcs/tests/test-debug-01-ref.xml
mcs/tests/test-debug-02-ref.xml
mcs/tests/test-debug-03-ref.xml
mcs/tests/test-debug-04-ref.xml
mcs/tests/test-debug-05-ref.xml
mcs/tests/test-debug-06-ref.xml
mcs/tests/test-debug-07-ref.xml
mcs/tests/test-debug-08-ref.xml
mcs/tests/test-debug-09-ref.xml
mcs/tests/test-debug-10-ref.xml
mcs/tests/test-debug-11-ref.xml
mcs/tests/test-debug-12-ref.xml
mcs/tests/test-debug-13-ref.xml
mcs/tests/test-debug-14-ref.xml
mcs/tests/test-debug-15-ref.xml
mcs/tests/test-debug-16-ref.xml
mcs/tests/test-debug-17-ref.xml
mcs/tests/test-debug-18-ref.xml
mcs/tests/test-debug-19-ref.xml
mcs/tests/test-debug-20-ref.xml
mcs/tests/test-debug-21-ref.xml
mcs/tests/test-debug-22-ref.xml
mcs/tests/test-debug-23-ref.xml
mcs/tests/test-debug-24-ref.xml
mcs/tests/test-debug-25-ref.xml
mcs/tests/ver-il-net_4_5.xml
mcs/tools/mkbundle/Makefile
mcs/tools/mkbundle/mkbundle.cs
mcs/tools/mkbundle/template_z.c
mcs/tools/tuner/Mono.Tuner/CustomizeActions.cs
mono-core.spec.in
mono/arch/x86/x86-codegen.h
mono/dis/dump.c
mono/io-layer/Makefile.am
mono/io-layer/atomic.c [deleted file]
mono/io-layer/atomic.h [deleted file]
mono/io-layer/collection.c
mono/io-layer/handles-private.h
mono/io-layer/io.c
mono/io-layer/processes.c
mono/io-layer/shared.c
mono/io-layer/wapi.h
mono/io-layer/wthreads.c
mono/metadata/appdomain.c
mono/metadata/assembly.c
mono/metadata/boehm-gc.c
mono/metadata/class-internals.h
mono/metadata/class.c
mono/metadata/cominterop.c
mono/metadata/culture-info-tables.h
mono/metadata/decimal.c
mono/metadata/gc-internal.h
mono/metadata/gc.c
mono/metadata/icall-def.h
mono/metadata/icall.c
mono/metadata/image.c
mono/metadata/marshal.c
mono/metadata/marshal.h
mono/metadata/monitor.c
mono/metadata/mono-cq.c
mono/metadata/mono-perfcounters.c
mono/metadata/mono-wsq.c
mono/metadata/nacl-stub.c
mono/metadata/null-gc.c
mono/metadata/rand.c
mono/metadata/sgen-alloc.c
mono/metadata/sgen-cardtable.c
mono/metadata/sgen-cardtable.h
mono/metadata/sgen-debug.c
mono/metadata/sgen-gc.c
mono/metadata/sgen-gc.h
mono/metadata/sgen-internal.c
mono/metadata/sgen-los.c
mono/metadata/sgen-marksweep.c
mono/metadata/sgen-pinning.c
mono/metadata/sgen-protocol.c
mono/metadata/sgen-protocol.h
mono/metadata/sgen-stw.c
mono/metadata/socket-io.c
mono/metadata/threadpool.c
mono/metadata/threads.c
mono/mini/Makefile.am.in
mono/mini/aot-compiler.c
mono/mini/aot-runtime.c
mono/mini/arrays.cs
mono/mini/basic-calls.cs
mono/mini/basic-float.cs
mono/mini/basic-long.cs
mono/mini/basic-math.cs
mono/mini/basic.cs
mono/mini/cpu-amd64.md
mono/mini/debugger-agent.c
mono/mini/decompose.c
mono/mini/driver.c
mono/mini/exceptions-arm.c
mono/mini/exceptions.cs
mono/mini/fsacheck.c [deleted file]
mono/mini/generics.cs
mono/mini/genmdesc.c
mono/mini/graph.c
mono/mini/helpers.c
mono/mini/ldscript
mono/mini/method-to-ir.c
mono/mini/mini-amd64.c
mono/mini/mini-amd64.h
mono/mini/mini-arm.c
mono/mini/mini-arm.h
mono/mini/mini-codegen.c
mono/mini/mini-gc.c
mono/mini/mini-generic-sharing.c
mono/mini/mini-llvm.c
mono/mini/mini-ops.h
mono/mini/mini-posix.c
mono/mini/mini-trampolines.c
mono/mini/mini-x86.c
mono/mini/mini.c
mono/mini/mini.h
mono/mini/nacl.cs
mono/mini/objects.cs
mono/mini/regalloc.h
mono/mini/wapihandles.c
mono/monograph/monograph.c
mono/profiler/Makefile.am
mono/profiler/decode.c
mono/profiler/proflog.c
mono/tests/Makefile.am
mono/utils/Makefile.am
mono/utils/atomic.c [new file with mode: 0644]
mono/utils/atomic.h [new file with mode: 0644]
mono/utils/lock-free-alloc.c
mono/utils/lock-free-array-queue.c
mono/utils/lock-free-queue.c
mono/utils/mono-codeman.c
mono/utils/mono-context.c
mono/utils/mono-dl.h
mono/utils/mono-linked-list-set.c
mono/utils/mono-mmap.c
mono/utils/mono-path.c
mono/utils/mono-threads-posix.c
mono/utils/monobitset.c
msvc/libmonoruntime.vcxproj
nacl/README [new file with mode: 0644]
nacl/common.sh [new file with mode: 0644]
nacl/config-nacl-runtime.cache [new file with mode: 0644]
nacl/config-nacl-runtime64.cache [new file with mode: 0644]
nacl/nacl-runtime-mono.sh [new file with mode: 0755]
nacl/nacl_interp_loader_sdk.sh [new file with mode: 0755]
runtime/Makefile.am
runtime/mono-wrapper.in
scripts/Makefile.am
support/Makefile.am
support/dirent.c
support/fcntl.c
support/map.c
support/map.h
support/nl.c
support/signal.c
support/sys-stat.c
support/sys-uio.c [new file with mode: 0644]
support/unistd.c
tools/locale-builder/Driver.cs
tools/locale-builder/Makefile.am
tools/locale-builder/NumberFormatEntry.cs
tools/locale-builder/Patterns.cs
tools/sgen/sgen-grep-binprot.c

index 3a51ad424c8e6efb91e74fe08f085fce547af8a2..8fc51d24df070776c14a3ba73fd310cba639610a 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/usr/bin/env bash
 # Run this to generate all the initial makefiles, etc.
 # Ripped off from GNOME macros version
 
index 099c56eecf1969e4d14f6102545c32388253cf16..b12e87886cba9c9e2ac5cc7df0c8707023eed1b1 100644 (file)
@@ -1074,6 +1074,8 @@ AC_TRY_COMPILE([
        AC_DEFINE_UNQUOTED(MONO_ZERO_LEN_ARRAY, 1, [Length of zero length arrays])
 ])
 
+AC_CHECK_HEADERS(nacl/nacl_dyncode.h)
+
 if test x$target_win32 = xno; then
 
        dnl hires monotonic clock support
@@ -1784,11 +1786,13 @@ if test x$target_win32 = xno; then
        dnl **********************************
        dnl *** epoll                      ***
        dnl **********************************
-       AC_CHECK_HEADERS(sys/epoll.h)
-       haveepoll=no
-       AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
-       if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes" ; then
-               AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
+       if test "x$ac_cv_header_nacl_nacl_dyncode_h" = "xno"; then
+               AC_CHECK_HEADERS(sys/epoll.h)
+               haveepoll=no
+               AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
+               if test "x$haveepoll" = "xyes" -a "x$ac_cv_header_sys_epoll_h" = "xyes"; then
+                       AC_DEFINE(HAVE_EPOLL, 1, [epoll supported])
+               fi
        fi
 
        havekqueue=no
@@ -1959,6 +1963,9 @@ if test x$target_win32 = xno; then
        AC_CHECK_FUNCS(lockf)
        AC_CHECK_FUNCS(swab)
        AC_CHECK_FUNCS(setusershell endusershell)
+       AC_CHECK_FUNCS(futimens utimensat)
+       AC_CHECK_FUNCS(fstatat mknodat readlinkat)
+       AC_CHECK_FUNCS(readv writev preadv pwritev)
        AC_CHECK_SIZEOF(size_t)
        AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
                [#include <sys/types.h>
@@ -1973,6 +1980,8 @@ if test x$target_win32 = xno; then
        AC_CHECK_TYPES([struct flock], [AC_DEFINE(HAVE_STRUCT_FLOCK)], ,
                [#include <unistd.h>
                 #include <fcntl.h>])
+       AC_CHECK_TYPES([struct iovec], [AC_DEFINE(HAVE_STRUCT_IOVEC)], ,
+               [#include <sys/uio.h>])
        AC_CHECK_TYPES([struct pollfd], [AC_DEFINE(HAVE_STRUCT_POLLFD)], ,
                [#include <sys/poll.h>])
        AC_CHECK_TYPES([struct stat], [AC_DEFINE(HAVE_STRUCT_STAT)], ,
@@ -2002,6 +2011,11 @@ if test x$target_win32 = xno; then
                [struct statfs.f_flags],,, 
                [#include <sys/types.h>
                 #include <sys/vfs.h>])
+       AC_CHECK_MEMBERS(
+               [struct stat.st_atim, struct stat.st_mtim, struct stat.st_ctim],,, 
+               [#include <sys/types.h>
+                #include <sys/stat.h>
+                #include <unistd.h>])
 
        dnl Favour xattr through glibc, but use libattr if we have to
        AC_CHECK_FUNC(lsetxattr, ,
@@ -2294,6 +2308,16 @@ AC_ARG_ENABLE(nacl_codegen, [  --enable-nacl-codegen      Enable Native Client c
 AC_ARG_ENABLE(nacl_gc, [  --enable-nacl-gc           Enable Native Client garbage collection], enable_nacl_gc=$enableval, enable_nacl_gc=no)
 
 AM_CONDITIONAL(NACL_CODEGEN, test x$enable_nacl_codegen != xno)
+
+dnl
+dnl Hack to use system mono for operations in build/install not allowed in NaCl.
+dnl
+nacl_self_host=""
+if test "x$ac_cv_header_nacl_nacl_dyncode_h" = "xyes"; then
+   nacl_self_host="nacl_self_host"
+fi
+AC_SUBST(nacl_self_host)
+
 if test "x$enable_nacl_codegen" = "xyes"; then
    MONO_NACL_ALIGN_MASK_OFF=1
    CPPFLAGS="$CPPFLAGS -D__native_client_codegen__"
@@ -2462,6 +2486,10 @@ case "$host" in
                TARGET=AMD64;
                arch_target=amd64;
                JIT_SUPPORTED=yes
+               if test "x$ac_cv_sizeof_void_p" = "x4"; then
+                       AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
+                       sizeof_register=8
+               fi
                case $host_os in
                  linux*)
                        sgen_supported=true
@@ -2558,6 +2586,15 @@ case "$host" in
                   NESTED_LIBGC_FLAGS="$NESTED_LIBGC_FLAGS -DHAVE_ARMV6"
                fi
                ;;
+# TODO: make proper support for NaCl host.
+#        arm*-*nacl)
+#              TARGET=ARM;
+#              arch_target=arm;
+#              ACCESS_UNALIGNED="no"
+#              JIT_SUPPORTED=yes
+#              sgen_supported=true
+#              AOT_SUPPORTED="no"
+#              ;;
        s390-*-linux*)
                TARGET=S390;
                arch_target=s390;
@@ -2622,7 +2659,29 @@ if test "x$host" != "x$target"; then
                AC_DEFINE(__mono_ilp32__, 1, [64 bit mode with 4 byte longs and pointers])
                sizeof_register=8
                ;;
-   *-*-nacl)
+# TODO: make proper support for NaCl target.
+#   arm*-*nacl)
+#              TARGET=ARM
+#              arch_target=arm
+#              AC_DEFINE(TARGET_ARM, 1, [...])
+#              ACCESS_UNALIGNED="no"
+#              JIT_SUPPORTED=yes
+#              sizeof_register=4
+#               CPPFLAGS="$CPPFLAGS \
+#                    -DARM_FPU_VFP=1 -D__ARM_EABI__ \
+#                    -D__arm__ \
+#                    -D__portable_native_client__ \
+#                    -DARM_FPU_VFP=1 \
+#                    -Dtimezone=_timezone \
+#                    -DDISABLE_SOCKETS \
+#                    -DDISABLE_ATTACH \
+#                    -DUSE_NEWLIB"
+#              jit_wanted=true
+               # Can't use tls, since it depends on the runtime detection of tls offsets
+               # in mono-compiler.h
+#              with_tls=pthread
+#              ;;
+   i686-*-nacl)
                TARGET=X86
                arch_target=x86
                AC_DEFINE(TARGET_X86, 1, [...])
index 19e4f4d59e249c893c45027634c6498a3b329898..ba0f93f9be53ddad6d9470987036458efb4df91e 100644 (file)
@@ -37,9 +37,6 @@ typedef signed   @GSIZE@ gssize;
 #endif
 
 #if defined (__native_client__)
-#define sem_trywait(x) sem_wait(x)
-#define sem_timedwait(x,y) sem_wait(x)
-#define getdtablesize() (32768)
 #undef G_BREAKPOINT
 #define G_BREAKPOINT()
 #endif
index 48a9192ab69fad8ea0d2ce2d195549af6442982e..d52ad9488029ce44211dca08a75c78bd0d857d23 100644 (file)
@@ -154,6 +154,15 @@ g_file_open_tmp (const gchar *tmpl, gchar **name_used, GError **error)
 gchar *
 g_get_current_dir (void)
 {
+#ifdef __native_client__
+       char *buffer;
+       if ((buffer = getenv("NACL_PWD"))) {
+               buffer = g_strdup(buffer);
+       } else {
+               buffer = g_strdup(".");
+       }
+       return buffer;
+#else
        int s = 32;
        char *buffer = NULL, *r;
        gboolean fail;
@@ -172,4 +181,5 @@ g_get_current_dir (void)
         * so we return the buffer here since it has a pointer to the valid string
         */
        return buffer;
+#endif
 }
index 87eb27aef2a4e5465ac29c180cf7cd4f0d9ca785..9dd5eaa3d543be12f59583fe0d439bfbaece2b32 100644 (file)
  * 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 <config.h>
+
 #include <glib.h>
 #include <gmodule.h>
 
-#if defined(__native_client__)
-GModule *
-g_module_open (const gchar *file, GModuleFlags flags)
-{
-       printf("dlopen() not supported on Native Client.\n");
-       return NULL;
-}
-
-
-gboolean
-g_module_symbol (GModule *module, const gchar *symbol_name, gpointer *symbol)
-{
-       return FALSE;
-}
-
-
-const gchar*
-g_module_error(void)
-{
-       return "dlopen not supported on Native Client.";
-}
-
-gboolean
-g_module_close (GModule *module)
-{
-       return FALSE;
-}
-
-gchar*
-g_module_build_path (const gchar *directory, const gchar *module_name)
-{
-       return NULL;
-}
-
-#else
-
-#ifdef G_OS_UNIX
+#if defined(G_OS_UNIX) && defined(HAVE_DLFCN_H)
 #include <dlfcn.h>
 
 /* For Linux and Solaris, need to add others as we port this */
@@ -322,5 +288,3 @@ g_module_build_path (const gchar *directory, const gchar *module_name)
        return g_strdup_printf ("%s%s" LIBSUFFIX, lib_prefix, module_name); 
 }
 
-#endif /* __native_client__ */
-
index c3dff59d891e981649c26de4bc17524b47cb8462..aff9f460c57c6ce3e675e00640e1d0ff01c396c5 100644 (file)
@@ -148,6 +148,12 @@ g_logv (const gchar *log_domain, GLogLevelFlags log_level, const gchar *format,
        if (vasprintf (&msg, format, args) < 0)
                return;
 
+#ifdef G_OS_WIN32
+       printf ("%s%s%s\n",
+            log_domain != NULL ? log_domain : "",
+            log_domain != NULL ? ": " : "",
+            msg);
+#else
 #if MONOTOUCH
        FILE *target = stderr;
 #else
@@ -158,6 +164,7 @@ g_logv (const gchar *log_domain, GLogLevelFlags log_level, const gchar *format,
                log_domain != NULL ? log_domain : "",
                log_domain != NULL ? ": " : "",
                msg);
+#endif
        free (msg);
        if (log_level & fatal){
                fflush (stdout);
index 54e0a50464edbc254b39ea3c885ee91ada730705..fc76b93e3e0064b2d751796878f9cbe88df1d5f4 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 54e0a50464edbc254b39ea3c885ee91ada730705
+Subproject commit fc76b93e3e0064b2d751796878f9cbe88df1d5f4
index 65d49e2a2aeea33e77a21dc118c4b8359cec3c45..9f2115f712ba6c2726969e963ebe4aa246048529 100644 (file)
 
        JNIEXPORT int JNICALL ikvm_msync(void* address, jint size)
        {
+#if defined(__native_client__) && defined(USE_NEWLIB)
+               g_assert_not_reached ();
+               return -1;
+#else
                return msync(address, size, MS_SYNC);
+#endif
        }
 #endif
index e4be3c7d183e31d4410d2f99c4c5ec32d4676a15..ca7ce54f19461e6f38f49c57c9ed49c849b8a935 100644 (file)
@@ -26,7 +26,7 @@
  * None of this is safe with dlclose and incremental collection.
  * But then not much of anything is safe in the presence of dlclose.
  */
-#if defined(__linux__) && !defined(_GNU_SOURCE)
+#if (defined(__linux__) || defined(__native_client__)) && !defined(_GNU_SOURCE)
     /* Can't test LINUX, since this must be define before other includes */
 #   define _GNU_SOURCE
 #endif
@@ -54,7 +54,7 @@
 #if !defined(SUNOS4) && !defined(SUNOS5DL) && !defined(IRIX5) && \
     !defined(MSWIN32) && !defined(MSWINCE) && \
     !(defined(ALPHA) && defined(OSF1)) && \
-    !defined(HPUX) && !(defined(LINUX) && defined(__ELF__)) && \
+    !defined(HPUX) && !((defined(LINUX) || defined(NACL)) && defined(__ELF__)) && \
     !defined(RS6000) && !defined(SCO_ELF) && !defined(DGUX) && \
     !(defined(FREEBSD) && defined(__ELF__)) && \
     !(defined(OPENBSD) && (defined(__ELF__) || defined(M68K))) && \
@@ -91,7 +91,7 @@
 #   define ELFSIZE ARCH_ELFSIZE
 #endif
 
-#if defined(LINUX) && defined(__ELF__) || defined(SCO_ELF) || \
+#if (defined(LINUX) || defined(NACL)) && defined(__ELF__) || defined(SCO_ELF) || \
     (defined(FREEBSD) && defined(__ELF__)) || defined(DGUX) || \
     (defined(OPENBSD) && defined(__ELF__)) || \
     (defined(NETBSD) && defined(__ELF__)) || defined(HURD)
@@ -297,7 +297,7 @@ void GC_register_dynamic_libraries()
 # endif /* !USE_PROC ... */
 # endif /* SUNOS */
 
-#if defined(LINUX) && defined(__ELF__) || defined(SCO_ELF) || \
+#if (defined(LINUX) || defined(NACL)) && defined(__ELF__) || defined(SCO_ELF) || \
     (defined(FREEBSD) && defined(__ELF__)) || defined(DGUX) || \
     (defined(OPENBSD) && defined(__ELF__)) || \
     (defined(NETBSD) && defined(__ELF__)) || defined(HURD)
@@ -394,7 +394,7 @@ GC_bool GC_register_main_static_data()
 /* For glibc 2.2.4+.  Unfortunately, it doesn't work for older */
 /* versions.  Thanks to Jakub Jelinek for most of the code.    */
 
-# if defined(LINUX) /* Are others OK here, too? */ \
+# if (defined(LINUX) || defined(NACL)) /* Are others OK here, too? */ \
      && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) \
          || (__GLIBC__ == 2 && __GLIBC_MINOR__ == 2 && defined(DT_CONFIG))) 
 
index 8705d07a1bbc072365c40381008c9e178821eea3..80712fcdf3f597637aed10d181d2642af72c8917 100644 (file)
 #       define GC_CLEAR_DEFINED
 #    endif /* ALPHA */
 #    ifdef ARM32
+#ifdef __native_client__
+#define NACL_ALIGN() ".align 4\n"
+#define MASK_REGISTER(reg) "bic " reg ", " reg ", #0xc0000000\n"
+#else
+#define NACL_ALIGN()
+#define MASK_REGISTER(reg)
+#endif
         inline static int GC_test_and_set(volatile unsigned int *addr) {
 #if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7__)
           int ret, tmp;
           __asm__ __volatile__ (
                                  "1:\n"
+                                 NACL_ALIGN()
+                                 MASK_REGISTER("%3")
                                  "ldrex %0, [%3]\n"
+                                 MASK_REGISTER("%3")
                                  "strex %1, %2, [%3]\n" 
                                  "teq %1, #0\n"
                                  "bne 1b\n"
            * bus because there are no SMP ARM machines.  If/when there are,
            * this code will likely need to be updated. */
           /* See linuxthreads/sysdeps/arm/pt-machine.h in glibc-2.1 */
-          __asm__ __volatile__("swp %0, %1, [%2]"
+          __asm__ __volatile__(MASK_REGISTER("%2")
+                               "swp %0, %1, [%2]"
                             : "=&r"(oldval)
                             : "r"(1), "r"(addr)
                             : "memory");
index ec53e3a95eab84e5de67b9b3247c96516ee74e70..88e783800de9faf427837c7bd93a1b3bd15f99cd 100644 (file)
 /* Determine the machine type: */
 # if defined(__native_client__)
 #    define NACL
-#    define I386
-#    define mach_type_known
+#    if !defined(__portable_native_client__)
+#        define I386
+#        define mach_type_known
+#    else
+         /* Here we will rely upon arch-specific defines. */
+#    endif
 # endif
 # if defined(__arm__) || defined(__thumb__)
 #    define ARM32
-#    if !defined(LINUX) && !defined(NETBSD) && !defined(DARWIN)
+#    if defined(NACL)
+#      define mach_type_known
+#    elif !defined(LINUX) && !defined(NETBSD) && !defined(DARWIN)
 #      define NOSYS
 #      define mach_type_known
 #    endif
 #   endif
 # endif
 
+
+# ifdef NACL
+#   define OS_TYPE "NACL"
+#   if defined(__GLIBC__)
+#      define DYNAMIC_LOADING
+#   endif
+#   define DATASTART ((ptr_t)0x10020000)
+    extern int _end[];
+#   define DATAEND (_end)
+#   ifdef STACK_GRAN
+#      undef STACK_GRAN
+#   endif /* STACK_GRAN */
+#   define STACK_GRAN 0x10000
+#   define HEURISTIC1
+#   define USE_MMAP
+#   define USE_MUNMAP
+#   define USE_MMAP_ANON
+#   ifdef USE_MMAP_FIXED
+#      undef USE_MMAP_FIXED
+#   endif
+#   define GETPAGESIZE() 65536
+#   define MAX_NACL_GC_THREADS 1024
+# endif
+
 # ifdef VAX
 #   define MACH_TYPE "VAX"
 #   define ALIGNMENT 4 /* Pointers are longword aligned by 4.2 C compiler */
 #        define HEAP_START DATAEND
 #      endif /* USE_MMAP */
 #   endif /* DGUX */
-#   ifdef NACL
-#      define OS_TYPE "NACL"
-       extern int etext[];
-//#    define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff))
-#       define DATASTART ((ptr_t)0x10000000)
-       extern int _end[];
-#      define DATAEND (_end)
-#      ifdef STACK_GRAN
-#        undef STACK_GRAN
-#      endif /* STACK_GRAN */
-#      define STACK_GRAN 0x10000
-#      define HEURISTIC1
-#      ifdef USE_MMAP
-#        undef USE_MMAP
-#      endif
-#      ifdef USE_MUNMAP
-#        undef USE_MUNMAP
-#      endif
-#      ifdef USE_MMAP_ANON
-#        undef USE_MMAP_ANON
-#      endif
-#      ifdef USE_MMAP_FIXED
-#        undef USE_MMAP_FIXED
-#      endif
-#      define GETPAGESIZE() 65536
-#      define MAX_NACL_GC_THREADS 1024
-#   endif
 #   ifdef LINUX
 #      ifndef __GNUC__
          /* The Intel compiler doesn't like inline assembly */
 # endif
 
 # ifdef ARM32
-#   define CPP_WORDSZ 32
+# if defined( NACL )
+#   define MACH_TYPE "NACL"
+# else
 #   define MACH_TYPE "ARM32"
+# endif
+#   define CPP_WORDSZ 32
 #   define ALIGNMENT 4
 #   ifdef NETBSD
 #       define OS_TYPE "NETBSD"
index 5b2868d808b691d90fd521f01e6b28757f5c86f9..53d47c53dbc86338b6b06c00141da1b8a8766098 100644 (file)
@@ -1003,7 +1003,11 @@ long a, b, c, d, e, f;
     buf[1024] = 0x15;
     (void) sprintf(buf, format, a, b, c, d, e, f);
     if (buf[1024] != 0x15) ABORT("GC_printf clobbered stack");
+#ifdef NACL
+    WRITE(GC_stdout, buf, strlen(buf));
+#else
     if (WRITE(GC_stdout, buf, strlen(buf)) < 0) ABORT("write to stdout failed");
+#endif
 }
 
 void GC_err_printf(format, a, b, c, d, e, f)
@@ -1015,13 +1019,21 @@ long a, b, c, d, e, f;
     buf[1024] = 0x15;
     (void) sprintf(buf, format, a, b, c, d, e, f);
     if (buf[1024] != 0x15) ABORT("GC_err_printf clobbered stack");
+#ifdef NACL
+    WRITE(GC_stderr, buf, strlen(buf));
+#else
     if (WRITE(GC_stderr, buf, strlen(buf)) < 0) ABORT("write to stderr failed");
+#endif
 }
 
 void GC_err_puts(s)
 GC_CONST char *s;
 {
+#ifdef NACL
+    WRITE(GC_stderr, s, strlen(s));
+#else
     if (WRITE(GC_stderr, s, strlen(s)) < 0) ABORT("write to stderr failed");
+#endif
 }
 
 #if defined(LINUX) && !defined(SMALL_CONFIG)
index e6ac64b62a8ee24f5a94a1e3040f9e6ae4d6197b..fe2ba1a381025cf22af5cf92b04d45bf44600ad9 100644 (file)
 #endif
 
 #ifdef NACL
-int nacl_park_threads_now = 0;
+volatile int __nacl_thread_suspension_needed = 0;
 pthread_t nacl_thread_parker = -1;
 
-int nacl_thread_parked[MAX_NACL_GC_THREADS];
-int nacl_thread_used[MAX_NACL_GC_THREADS];
-int nacl_thread_parking_inited = 0;
-int nacl_num_gc_threads = 0;
+volatile int nacl_thread_parked[MAX_NACL_GC_THREADS];
+volatile int nacl_thread_used[MAX_NACL_GC_THREADS];
+volatile int nacl_thread_parking_inited = 0;
+volatile int nacl_num_gc_threads = 0;
 pthread_mutex_t nacl_thread_alloc_lock = PTHREAD_MUTEX_INITIALIZER;
 __thread int nacl_thread_idx = -1;
 __thread GC_thread nacl_gc_thread_self = NULL;
@@ -471,7 +471,7 @@ static void pthread_stop_world()
     GC_printf1("pthread_stop_world: num_threads %d\n", nacl_num_gc_threads - 1);
     #endif
     nacl_thread_parker = pthread_self();
-    nacl_park_threads_now = 1;
+    __nacl_thread_suspension_needed = 1;
     
     while (1) {
        #define NACL_PARK_WAIT_NANOSECONDS 100000
@@ -513,31 +513,46 @@ static void pthread_stop_world()
 
 #define NACL_STORE_REGS()  \
     do {                  \
-       asm("push %rbx");\
-       asm("push %rbp");\
-       asm("push %r12");\
-       asm("push %r13");\
-       asm("push %r14");\
-       asm("push %r15");\
-       asm("mov %%esp, %0" : "=m" (nacl_gc_thread_self->stop_info.stack_ptr));\
+       __asm__ __volatile__ ("push %rbx");\
+       __asm__ __volatile__ ("push %rbp");\
+       __asm__ __volatile__ ("push %r12");\
+       __asm__ __volatile__ ("push %r13");\
+       __asm__ __volatile__ ("push %r14");\
+       __asm__ __volatile__ ("push %r15");\
+       __asm__ __volatile__ ("mov %%esp, %0" : "=m" (nacl_gc_thread_self->stop_info.stack_ptr));\
         memcpy(nacl_gc_thread_self->stop_info.reg_storage, nacl_gc_thread_self->stop_info.stack_ptr, NACL_GC_REG_STORAGE_SIZE * sizeof(ptr_t));\
-       asm("add $48, %esp");\
-        asm("add %r15, %rsp");\
+        __asm__ __volatile__ ("naclasp $48, %r15");\
     } while (0)
 
 #elif __i386__
 
 #define NACL_STORE_REGS()  \
     do {                  \
-       asm("push %ebx");\
-       asm("push %ebp");\
-       asm("push %esi");\
-       asm("push %edi");\
-       asm("mov %%esp, %0" : "=m" (nacl_gc_thread_self->stop_info.stack_ptr));\
+       __asm__ __volatile__ ("push %ebx");\
+       __asm__ __volatile__ ("push %ebp");\
+       __asm__ __volatile__ ("push %esi");\
+       __asm__ __volatile__ ("push %edi");\
+       __asm__ __volatile__ ("mov %%esp, %0" : "=m" (nacl_gc_thread_self->stop_info.stack_ptr));\
         memcpy(nacl_gc_thread_self->stop_info.reg_storage, nacl_gc_thread_self->stop_info.stack_ptr, NACL_GC_REG_STORAGE_SIZE * sizeof(ptr_t));\
-       asm("add $16, %esp");\
+       __asm__ __volatile__ ("add $16, %esp");\
     } while (0)
 
+#elif __arm__
+
+#define NACL_STORE_REGS()  \
+    do {                  \
+       __asm__ __volatile__ ("push {r4-r12,lr}");\
+       __asm__ __volatile__ ("mov r0, %0" : : "r" (&nacl_gc_thread_self->stop_info.stack_ptr)); \
+       __asm__ __volatile__ ("bic r0, r0, #0xc0000000");\
+       __asm__ __volatile__ ("str sp, [r0]");\
+       memcpy(nacl_gc_thread_self->stop_info.reg_storage, nacl_gc_thread_self->stop_info.stack_ptr, NACL_GC_REG_STORAGE_SIZE * sizeof(ptr_t));\
+       __asm__ __volatile__ ("add sp, sp, #40");\
+       __asm__ __volatile__ ("bic sp, sp, #0xc0000000");\
+    } while (0)
+#else
+
+#error "Please port NACL_STORE_REGS"
+
 #endif
 
 void nacl_pre_syscall_hook()
@@ -550,6 +565,8 @@ void nacl_pre_syscall_hook()
     }
 }
 
+void __nacl_suspend_thread_if_needed();
+
 void nacl_post_syscall_hook()
 {
     /* Calling __nacl_suspend_thread_if_needed() right away should guarantee we don't mutate the GC set. */
@@ -560,7 +577,7 @@ void nacl_post_syscall_hook()
 }
 
 void __nacl_suspend_thread_if_needed() {
-    if (nacl_park_threads_now) {
+    if (__nacl_thread_suspension_needed) {
         pthread_t self = pthread_self();
         int local_dummy = 0;
         /* Don't try to park the thread parker. */
@@ -579,7 +596,7 @@ void __nacl_suspend_thread_if_needed() {
             nacl_gc_thread_self->stop_info.stack_ptr = (ptr_t)(&local_dummy);
         }
         nacl_thread_parked[nacl_thread_idx] = 1;
-        while (nacl_park_threads_now)
+        while (__nacl_thread_suspension_needed)
             ; /* spin */
         nacl_thread_parked[nacl_thread_idx] = 0;
 
@@ -689,7 +706,7 @@ static void pthread_start_world()
 #   if DEBUG_THREADS
     GC_printf0("World starting\n");
 #   endif
-    nacl_park_threads_now = 0;
+    __nacl_thread_suspension_needed = 0;
     if (GC_notify_event)
         GC_notify_event (GC_EVENT_POST_START_WORLD);
 #endif /* NACL */
index ccafb3b1169e96fa6847a794ea4b01d1421ba8b1..b302688a76e589fc603da7c0ce126696f842579e 100644 (file)
@@ -687,10 +687,10 @@ void GC_mark_thread_local_free_lists(void)
 static struct GC_Thread_Rep first_thread;
 
 #ifdef NACL
-extern int nacl_thread_parked[MAX_NACL_GC_THREADS];
-extern int nacl_thread_used[MAX_NACL_GC_THREADS];
-extern int nacl_thread_parking_inited;
-extern int nacl_num_gc_threads;
+extern volatile int nacl_thread_parked[MAX_NACL_GC_THREADS];
+extern volatile int nacl_thread_used[MAX_NACL_GC_THREADS];
+extern volatile int nacl_thread_parking_inited;
+extern volatile int nacl_num_gc_threads;
 extern pthread_mutex_t nacl_thread_alloc_lock;
 extern __thread int nacl_thread_idx;
 extern __thread GC_thread nacl_gc_thread_self;
@@ -699,10 +699,20 @@ extern void nacl_pre_syscall_hook();
 extern void nacl_post_syscall_hook();
 extern void nacl_register_gc_hooks(void (*pre)(), void (*post)());
 
+#include <stdio.h>
+
+struct nacl_irt_blockhook {
+  int (*register_block_hooks)(void (*pre)(void), void (*post)(void));
+};
+
+extern size_t nacl_interface_query(const char *interface_ident,
+                            void *table, size_t tablesize);
+
 void nacl_initialize_gc_thread()
 {
     int i;
-    nacl_register_gc_hooks(nacl_pre_syscall_hook, nacl_post_syscall_hook);
+    static struct nacl_irt_blockhook gc_hook;
+
     pthread_mutex_lock(&nacl_thread_alloc_lock);
     if (!nacl_thread_parking_inited)
     {
@@ -710,6 +720,10 @@ void nacl_initialize_gc_thread()
             nacl_thread_used[i] = 0;
             nacl_thread_parked[i] = 0;
         }
+        // TODO: replace with public 'register hook' function when
+        // available from glibc
+        nacl_interface_query("nacl-irt-blockhook-0.1", &gc_hook, sizeof(gc_hook));
+        gc_hook.register_block_hooks(nacl_pre_syscall_hook, nacl_post_syscall_hook);
         nacl_thread_parking_inited = 1;
     }
     GC_ASSERT(nacl_num_gc_threads <= MAX_NACL_GC_THREADS);
@@ -942,6 +956,7 @@ int GC_segment_is_thread_stack(ptr_t lo, ptr_t hi)
 /* Return the number of processors, or i<= 0 if it can't be determined.        */
 int GC_get_nprocs()
 {
+#ifndef NACL
     /* Should be "return sysconf(_SC_NPROCESSORS_ONLN);" but that      */
     /* appears to be buggy in many cases.                              */
     /* We look for lines "cpu<n>" in /proc/stat.                       */
@@ -971,6 +986,9 @@ int GC_get_nprocs()
     }
     close(f);
     return result;
+#else /* NACL */
+    return sysconf(_SC_NPROCESSORS_ONLN);
+#endif
 }
 #endif /* GC_LINUX_THREADS */
 
@@ -1362,12 +1380,10 @@ int WRAP_FUNC(pthread_join)(pthread_t thread, void **retval)
 }
 
 #ifdef NACL
-/* Native Client doesn't support pthread cleanup functions, */
-/* so wrap pthread_exit and manually cleanup the thread.    */
+/* TODO: remove, NaCl glibc now supports pthread cleanup functions. */
 void
 WRAP_FUNC(pthread_exit)(void *status)
 {
-    GC_thread_exit_proc(0); 
     REAL_FUNC(pthread_exit)(status);
 }
 #endif
index 1afc37ea6704702e97ad4efe9f1aa112b8133847..318c0586d0fe9d191e229d31ac4aedb30824bfcb 100644 (file)
@@ -1176,6 +1176,11 @@ are allocated (clear-at-gc).   The consistency check ensures that
 there are no major to minor references that are not on the remembered
 sets. 
 .TP
+\fBmod-union-consistency-check\fR
+Checks that the mod-union cardtable is consistent before each
+finishing major collection pause.  This check is only applicable to
+concurrent major collectors.
+.TP
 \fBcheck-mark-bits\fR
 Checks that mark bits in the major heap are consistent at the end of
 each major collection.  Consistent mark bits mean that if an object is
index b36690dc867cfb658f3cde73b06e1002a56945fb..997a62027113d34804bbc4dbf98e58a4eee9bf86 100644 (file)
@@ -246,6 +246,7 @@ net_4_5_dirs := \
        System.Net.Http.Formatting \
        System.Web.Http \
        System.Web.Http.SelfHost \
+       System.Web.Http.WebHost \
        EntityFramework \
        EntityFramework.SqlServer       \
        Mono.CodeContracts \
index cad50f13ed25eb49d0975c73e3b1d5306124978d..34cd40959825ecb243b4abc722a14de11e423d18 100644 (file)
@@ -369,8 +369,8 @@ namespace System.Windows.Forms
                        txtView.Dock = DockStyle.Fill;
                        
                        SuspendLayout ();
-                       Controls.Add (txtView);
                        Controls.Add (spnSpinner);
+                       Controls.Add (txtView); 
                        ResumeLayout ();
 
                        Height = PreferredHeight;
index 3421813ce8db754f87759d7f5edb70b516957531..8d67fec080c800d076f0e2559be92896493a2f6c 100644 (file)
@@ -26,6 +26,7 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 using System;
+using System.Linq;
 using System.Collections;
 using System.Collections.Generic;
 using System.Collections.Specialized;
@@ -50,6 +51,9 @@ namespace Microsoft.Build.BuildEngine {
                //string                recursiveDir;
                IDictionary     evaluatedMetadata;
                IDictionary     unevaluatedMetadata;
+               bool            isDynamic;
+               bool            keepDuplicates = true;
+               string          removeMetadata, keepMetadata;
 
                BuildItem ()
                {
@@ -90,11 +94,49 @@ namespace Microsoft.Build.BuildEngine {
                        this.parent_item_group = parentItemGroup;
                        
                        this.itemElement = itemElement;
-                       
-                       if (Include == String.Empty)
-                               throw new InvalidProjectFileException (String.Format ("The required attribute \"Include\" is missing from element <{0}>.", Name));
+                       isDynamic = parentItemGroup.IsDynamic;
+
+                       if (IsDynamic) {
+                               if (!string.IsNullOrEmpty (Remove)) {
+                                       if (!string.IsNullOrEmpty (Include) || !string.IsNullOrEmpty (Exclude))
+                                               throw new InvalidProjectFileException (string.Format ("The attribute \"Remove\" in element <{0}> is unrecognized.", Name));
+                                       if (itemElement.HasChildNodes)
+                                               throw new InvalidProjectFileException ("Children are not allowed below an item remove element.");
+                               }
+                               if (string.IsNullOrEmpty (Include) && !string.IsNullOrEmpty (Exclude))
+                                       throw new InvalidProjectFileException (string.Format ("The attribute \"Exclude\" in element <{0}> is unrecognized.", Name));
+                       } else {
+                               if (string.IsNullOrEmpty (Include))
+                                       throw new InvalidProjectFileException (string.Format ("The required attribute \"Include\" is missing from element <{0}>.", Name));
+                               if (!string.IsNullOrEmpty (Remove))
+                                       throw new InvalidProjectFileException (string.Format ("The attribute \"Remove\" in element <{0}> is unrecognized.", Name));
+                       }
+
+                       foreach (XmlAttribute attr in itemElement.Attributes) {
+                               if (attr.Name == "Include" || attr.Name == "Exclude" || attr.Name == "Condition")
+                                       continue;
+                               if (!IsDynamic)
+                                       throw new InvalidProjectFileException (string.Format ("The attribute \"{0}\" in element <{1}> is unrecognized.", attr.Name, Name));
+
+                               switch (attr.Name) {
+                               case "Remove":
+                                       Remove = attr.Value;
+                                       break;
+                               case "KeepDuplicates":
+                                       KeepDuplicates = bool.Parse (attr.Value);
+                                       break;
+                               case "RemoveMetadata":
+                                       removeMetadata = attr.Value;
+                                       break;
+                               case "KeepMetadata":
+                                       keepMetadata = attr.Value;
+                                       break;
+                               default:
+                                       throw new InvalidProjectFileException (string.Format ("The attribute \"{0}\" in element <{1}> is unrecognized.", attr.Name, Name));
+                               }
+                       }
                }
-               
+
                BuildItem (BuildItem parent)
                {
                        isImported = parent.isImported;
@@ -254,21 +296,39 @@ namespace Microsoft.Build.BuildEngine {
                                this.finalItemSpec = MSBuildUtils.Unescape (Include);
                                return;
                        }
-                       
+
                        foreach (XmlNode xn in itemElement.ChildNodes) {
                                XmlElement xe = xn as XmlElement;
                                if (xe != null && ConditionParser.ParseAndEvaluate (xe.GetAttribute ("Condition"), project))
                                        AddMetadata (xe.Name, xe.InnerText);
                        }
 
+                       if (IsDynamic) {
+                               if (!evaluatedTo)
+                                       return;
+
+                               if (!string.IsNullOrEmpty (Remove)) {
+                                       RemoveItems (project);
+                                       return;
+                               }
+
+                               if (string.IsNullOrEmpty (Include)) {
+                                       UpdateMetadata (project);
+                                       return;
+                               }
+                       }
+                       
                        DirectoryScanner directoryScanner;
                        Expression includeExpr, excludeExpr;
                        ITaskItem[] includes, excludes;
 
+                       var options = IsDynamic ?
+                               ParseOptions.AllowItemsMetadataAndSplit : ParseOptions.AllowItemsNoMetadataAndSplit;
+
                        includeExpr = new Expression ();
-                       includeExpr.Parse (Include, ParseOptions.AllowItemsNoMetadataAndSplit);
+                       includeExpr.Parse (Include, options);
                        excludeExpr = new Expression ();
-                       excludeExpr.Parse (Exclude, ParseOptions.AllowItemsNoMetadataAndSplit);
+                       excludeExpr.Parse (Exclude, options);
                        
                        includes = (ITaskItem[]) includeExpr.ConvertTo (project, typeof (ITaskItem[]),
                                                                ExpressionOptions.ExpandItemRefs);
@@ -293,9 +353,123 @@ namespace Microsoft.Build.BuildEngine {
                        foreach (ITaskItem matchedItem in directoryScanner.MatchedItems)
                                AddEvaluatedItem (project, evaluatedTo, matchedItem);
                }
-               
+
+               bool CheckCondition (Project project)
+               {
+                       if (parent_item_group != null && !ConditionParser.ParseAndEvaluate (parent_item_group.Condition, project))
+                               return false;
+                       if (parent_item != null && !parent_item.CheckCondition (project))
+                               return false;
+                       return ConditionParser.ParseAndEvaluate (Condition, project);
+               }
+
+               void UpdateMetadata (Project project)
+               {
+                       BuildItemGroup group;
+                       if (!project.TryGetEvaluatedItemByNameBatched (Name, out group))
+                               return;
+
+                       foreach (BuildItem item in group) {
+                               if (!item.CheckCondition (project))
+                                       continue;
+                               
+                               foreach (string name in evaluatedMetadata.Keys) {
+                                       item.SetMetadata (name, (string)evaluatedMetadata [name]);
+                               }
+
+                               AddAndRemoveMetadata (project, item);
+                       }
+               }
+
+               void AddAndRemoveMetadata (Project project, BuildItem item)
+               {
+                       if (!string.IsNullOrEmpty (removeMetadata)) {
+                               var removeExpr = new Expression ();
+                               removeExpr.Parse (removeMetadata, ParseOptions.AllowItemsNoMetadataAndSplit);
+
+                               var removeSpec = (string[]) removeExpr.ConvertTo (
+                                       project, typeof (string[]), ExpressionOptions.ExpandItemRefs);
+
+                               foreach (var remove in removeSpec) {
+                                       item.DeleteMetadata (remove);
+                               }
+                       }
+
+                       if (!string.IsNullOrEmpty (keepMetadata)) {
+                               var keepExpr = new Expression ();
+                               keepExpr.Parse (keepMetadata, ParseOptions.AllowItemsNoMetadataAndSplit);
+
+                               var keepSpec = (string[]) keepExpr.ConvertTo (
+                                       project, typeof (string[]), ExpressionOptions.ExpandItemRefs);
+
+                               var metadataNames = new string [item.evaluatedMetadata.Count];
+                               item.evaluatedMetadata.Keys.CopyTo (metadataNames, 0);
+
+                               foreach (string name in metadataNames) {
+                                       if (!keepSpec.Contains (name))
+                                               item.DeleteMetadata (name);
+                               }
+                       }
+               }
+
+               void RemoveItems (Project project)
+               {
+                       BuildItemGroup group;
+                       if (!project.TryGetEvaluatedItemByNameBatched (Name, out group))
+                               return;
+
+                       var removeExpr = new Expression ();
+                       removeExpr.Parse (Remove, ParseOptions.AllowItemsNoMetadataAndSplit);
+
+                       var removes = (ITaskItem[]) removeExpr.ConvertTo (
+                               project, typeof (ITaskItem[]), ExpressionOptions.ExpandItemRefs);
+
+                       var directoryScanner = new DirectoryScanner ();
+                       
+                       directoryScanner.Includes = removes;
+
+                       if (project.FullFileName != String.Empty)
+                               directoryScanner.BaseDirectory = new DirectoryInfo (Path.GetDirectoryName (project.FullFileName));
+                       else
+                               directoryScanner.BaseDirectory = new DirectoryInfo (Directory.GetCurrentDirectory ());
+                       
+                       directoryScanner.Scan ();
+
+                       foreach (ITaskItem matchedItem in directoryScanner.MatchedItems) {
+                               group.RemoveItem (matchedItem);
+                       }
+               }
+
+               bool ContainsItem (Project project, ITaskItem taskItem)
+               {
+                       BuildItemGroup group;
+                       if (!project.TryGetEvaluatedItemByNameBatched (Name, out group))
+                               return false;
+
+                       var item = group.FindItem (taskItem);
+                       if (item == null)
+                               return false;
+
+                       foreach (string metadataName in evaluatedMetadata.Keys) {
+                               string metadataValue = (string)evaluatedMetadata [metadataName];
+                               if (!metadataValue.Equals (item.evaluatedMetadata [metadataName]))
+                                       return false;
+                       }
+                       
+                       foreach (string metadataName in item.evaluatedMetadata.Keys) {
+                               string metadataValue = (string)item.evaluatedMetadata [metadataName];
+                               if (!metadataValue.Equals (evaluatedMetadata [metadataName]))
+                                       return false;
+                       }
+
+                       return true;
+               }
+
                void AddEvaluatedItem (Project project, bool evaluatedTo, ITaskItem taskitem)
                {
+                       if (IsDynamic && evaluatedTo && !KeepDuplicates && ContainsItem (project, taskitem))
+                               return;
+
                        BuildItemGroup big;                     
                        BuildItem bi = new BuildItem (this);
                        bi.finalItemSpec = taskitem.ItemSpec;
@@ -328,6 +502,9 @@ namespace Microsoft.Build.BuildEngine {
                        }
 
                        big.AddItem (bi);
+
+                       if (IsDynamic)
+                               AddAndRemoveMetadata (project, bi);
                }
                
                // during item's eval phase, any item refs in this item, have either
@@ -488,6 +665,20 @@ namespace Microsoft.Build.BuildEngine {
                        }
                }
 
+               internal bool IsDynamic {
+                       get { return isDynamic; }
+               }
+
+               internal string Remove {
+                       get;
+                       private set;
+               }
+
+               internal bool KeepDuplicates {
+                       get { return keepDuplicates; }
+                       private set { keepDuplicates = value; }
+               }
+
                public bool IsImported {
                        get { return isImported; }
                }
@@ -522,6 +713,10 @@ namespace Microsoft.Build.BuildEngine {
                internal bool FromXml {
                        get { return itemElement != null; }
                }
+
+               internal XmlElement XmlElement {
+                       get { return itemElement; }
+               }
                
                internal bool HasParentItem {
                        get { return parent_item != null; }
index 444731a8cee60b70538b3055085f8b73478c782c..034ead032b841e68c1191c27504d61bfe3a51fd4 100644 (file)
@@ -26,6 +26,7 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 using System;
+using System.Linq;
 using System.Reflection;
 using System.Collections;
 using System.Collections.Generic;
@@ -42,7 +43,8 @@ namespace Microsoft.Build.BuildEngine {
                GroupingCollection      parentCollection;
                Project                 parentProject;
                bool                    read_only;
-               bool evaluated;
+               bool                    evaluated;
+               bool                    isDynamic;
 
                public BuildItemGroup ()
                        : this (null, null, null, false)
@@ -55,12 +57,18 @@ namespace Microsoft.Build.BuildEngine {
                }
 
                internal BuildItemGroup (XmlElement xmlElement, Project project, ImportedProject importedProject, bool readOnly)
+                       : this (xmlElement, project, importedProject, readOnly, false)
+               {
+               }
+
+               internal BuildItemGroup (XmlElement xmlElement, Project project, ImportedProject importedProject, bool readOnly, bool dynamic)
                {
                        this.buildItems = new List <BuildItem> ();
                        this.importedProject = importedProject;
                        this.itemGroupElement = xmlElement;
                        this.parentProject = project;
                        this.read_only = readOnly;
+                       this.isDynamic = dynamic;
                        
                        if (!FromXml)
                                return;
@@ -169,6 +177,24 @@ namespace Microsoft.Build.BuildEngine {
                        RemoveItem (item);
                }
 
+               internal BuildItem FindItem (ITaskItem taskItem)
+               {
+                       return buildItems.FirstOrDefault (i => i.FinalItemSpec == taskItem.ItemSpec);
+               }
+
+               internal void RemoveItem (ITaskItem itemToRemove)
+               {
+                       if (itemToRemove == null)
+                               return;
+
+                       var item = FindItem (itemToRemove);
+                       if (item == null)
+                               return;
+
+                       item.Detach ();
+                       buildItems.Remove (item);
+               }
+
                public BuildItem[] ToArray ()
                {
                        return buildItems.ToArray ();
@@ -239,7 +265,7 @@ namespace Microsoft.Build.BuildEngine {
 
                internal void Evaluate ()
                {
-                       if (evaluated)
+                       if (!isDynamic && evaluated)
                                return;
                        foreach (BuildItem bi in buildItems) {
                                if (bi.Condition == String.Empty)
@@ -317,5 +343,11 @@ namespace Microsoft.Build.BuildEngine {
                                return itemGroupElement;
                        }       
                }
+
+               internal bool IsDynamic {
+                       get {
+                               return isDynamic;
+                       }
+               }
        }
 }
index 97191e365d23069f6b671098565884b647afbf07..d0048815a18d690db6de37c8f4c9cb578c394355 100644 (file)
@@ -35,7 +35,7 @@ using Microsoft.Build.Framework;
 using Microsoft.Build.Utilities;
 
 namespace Microsoft.Build.BuildEngine {
-       public class BuildTask {
+       public class BuildTask : IBuildTask {
        
                ITaskHost               hostObject;
                Target                  parentTarget;
@@ -127,7 +127,7 @@ namespace Microsoft.Build.BuildEngine {
                                        continue;
                                tempNames.Add (xmlAttribute.Name);
                        }
-                       
+
                        return tempNames.ToArray ();
                }
                
@@ -156,7 +156,7 @@ namespace Microsoft.Build.BuildEngine {
                        else
                                taskElement.SetAttribute (parameterName, parameterValue);
                }
-               
+
                void LogTaskStarted ()
                {
                        TaskStartedEventArgs tsea = new TaskStartedEventArgs ("Task started.", null,
@@ -266,11 +266,29 @@ namespace Microsoft.Build.BuildEngine {
                        get { return taskElement; }
                        set { taskElement = value; }
                }
-               
+
                [MonoTODO]
                public Type Type {
                        get { return parentTarget.Project.TaskDatabase.GetTypeFromClassName (Name); }
                }
+
+               public IEnumerable<string> GetAttributes ()
+               {
+                       foreach (XmlAttribute attrib in TaskElement.Attributes)
+                               yield return attrib.Value;
                
+                       foreach (XmlNode xn in TaskElement.ChildNodes) {
+                               XmlElement xe = xn as XmlElement;
+                               if (xe == null)
+                                       continue;
+                       
+                               //FIXME: error on any other child
+                               if (String.Compare (xe.LocalName, "Output", StringComparison.Ordinal) == 0) {
+                                       foreach (XmlAttribute attrib in xe.Attributes)
+                                               yield return attrib.Value;
+                               }
+                       }
+               }
+
        }
 }
diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTaskItemGroup.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTaskItemGroup.cs
new file mode 100644 (file)
index 0000000..9449cd8
--- /dev/null
@@ -0,0 +1,63 @@
+//
+// BuildTaskItemGroup.cs
+//
+// Author:
+//       Martin Baulig <martin.baulig@xamarin.com>
+//
+// Copyright (c) 2013 Xamarin Inc. (http://www.xamarin.com)
+//
+// 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.
+
+using System;
+using System.Collections.Generic;
+using System.Xml;
+
+namespace Microsoft.Build.BuildEngine {
+
+       internal class BuildTaskItemGroup : BuildItemGroup, IBuildTask {
+
+               public bool ContinueOnError {
+                       get; set;
+               }
+
+               internal BuildTaskItemGroup (XmlElement element, Target target)
+                       : base (element, target.Project, null, false, true)
+               {
+               }
+               
+               public bool Execute ()
+               {
+                       Evaluate ();
+                       return true;
+               }
+
+               public IEnumerable<string> GetAttributes ()
+               {
+                       foreach (XmlAttribute attrib in XmlElement.Attributes)
+                               yield return attrib.Value;
+
+                       foreach (BuildItem item in this) {
+                               foreach (XmlAttribute attrib in item.XmlElement.Attributes)
+                                       yield return attrib.Value;
+                       }
+               }
+
+       }
+}
+
diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTaskPropertyGroup.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTaskPropertyGroup.cs
new file mode 100644 (file)
index 0000000..4df2f78
--- /dev/null
@@ -0,0 +1,59 @@
+//
+// BuildTaskPropertyGroup.cs
+//
+// Author:
+//       Martin Baulig <martin.baulig@xamarin.com>
+//
+// Copyright (c) 2013 Xamarin Inc. (http://www.xamarin.com)
+//
+// 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.
+
+
+using System;
+using System.Collections.Generic;
+using System.Xml;
+
+namespace Microsoft.Build.BuildEngine {
+       
+       internal class BuildTaskPropertyGroup : BuildPropertyGroup, IBuildTask {
+               
+               public bool ContinueOnError {
+                       get; set;
+               }
+               
+               internal BuildTaskPropertyGroup (XmlElement element, Target target)
+                       : base (element, target.Project, null, false)
+               {
+               }
+               
+               public bool Execute ()
+               {
+                       Evaluate ();
+                       return true;
+               }
+
+               public IEnumerable<string> GetAttributes ()
+               {
+                       foreach (XmlAttribute attrib in XmlElement.Attributes)
+                               yield return attrib.Value;
+               }
+               
+       }
+}
+
index d7f4ac5c80b022d15c32a4ffb8b3bb4132243348..ec538abc29f3441d5927656608e29ecdb24ed11c 100644 (file)
@@ -89,6 +89,11 @@ namespace Microsoft.Build.BuildEngine {
                {
                        return ParseBooleanAnd ();
                }
+
+               public static string And (string a, string b)
+               {
+                       return a + " and " + b;
+               }
                
                ConditionExpression ParseBooleanAnd ()
                {
diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/IBuildTask.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/IBuildTask.cs
new file mode 100644 (file)
index 0000000..aa18248
--- /dev/null
@@ -0,0 +1,44 @@
+//
+// IBuildTask.cs
+//
+// Author:
+//       Martin Baulig <martin.baulig@xamarin.com>
+//
+// Copyright (c) 2013 Xamarin Inc. (http://www.xamarin.com)
+//
+// 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.
+
+using System;
+using System.Collections.Generic;
+
+namespace Microsoft.Build.BuildEngine {
+       internal interface IBuildTask {
+               bool ContinueOnError {
+                       get; set;
+               }
+               
+               string Condition {
+                       get; set;
+               }
+               
+               bool Execute ();
+
+               IEnumerable<string> GetAttributes ();
+       }
+}
index 378348c1f4afbc96463a2a582fa1125a4820578a..430ea1daf73cf5b5b6c86a51dca8c9e1d07a03c0 100644 (file)
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 using System;
+using System.Text;
 using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 using System.Xml;
 using Microsoft.Build.Framework;
 using Microsoft.Build.Utilities;
+using Mono.XBuild.Utilities;
 
 namespace Microsoft.Build.BuildEngine {
        public class Target : IEnumerable {
@@ -44,7 +46,7 @@ namespace Microsoft.Build.BuildEngine {
                Project         project;
                XmlElement      targetElement;
                List <XmlElement>       onErrorElements;
-               List <BuildTask>        buildTasks;
+               List <IBuildTask>       buildTasks;
                
                internal Target (XmlElement targetElement, Project project, ImportedProject importedProject)
                {
@@ -62,7 +64,7 @@ namespace Microsoft.Build.BuildEngine {
 
                        this.onErrorElements  = new List <XmlElement> ();
                        this.buildState = BuildState.NotStarted;
-                       this.buildTasks = new List <BuildTask> ();
+                       this.buildTasks = new List <IBuildTask> ();
                        this.batchingImpl = new TargetBatchingImpl (project, this.targetElement);
 
                        bool onErrorFound = false;
@@ -77,8 +79,10 @@ namespace Microsoft.Build.BuildEngine {
                                                        "The element <OnError> must be last under element <Target>. Found element <Error> instead.");
 #if NET_3_5
                                        else if (xe.Name == "ItemGroup") {
-                                               //don't blow up for ItemGroups inside Targets in >= 3.5
-                                               // TODO: evaluate them (see https://bugzilla.xamarin.com/show_bug.cgi?id=1862 and test in TargetTest.cs )
+                                               buildTasks.Add (new BuildTaskItemGroup (xe, this));
+                                               continue;
+                                       } else if (xe.Name == "PropertyGroup") {
+                                               buildTasks.Add (new BuildTaskPropertyGroup (xe, this));
                                                continue;
                                        }
 #endif
@@ -379,7 +383,7 @@ namespace Microsoft.Build.BuildEngine {
                internal List<string> AfterThisTargets { get; set; }
 #endif
 
-               internal List<BuildTask> BuildTasks {
+               internal List<IBuildTask> BuildTasks {
                        get { return buildTasks; }
                }
 
index 28ea4c8c69ce366a569d07b964ac8cc465475331..3873a93c498f64c124ae70f214f56bada47ac940 100644 (file)
@@ -118,7 +118,7 @@ namespace Microsoft.Build.BuildEngine {
 
                                for (int i = 0; i < target.BuildTasks.Count; i ++) {
                                        //FIXME: parsing attributes repeatedly
-                                       BuildTask bt = target.BuildTasks [i];
+                                       IBuildTask bt = target.BuildTasks [i];
 
                                        TaskBatchingImpl batchingImpl = new TaskBatchingImpl (project);
                                        bool task_result = batchingImpl.Build (bt, out executeOnErrors);
index 65ed711aed56e5921ea910839ed10a90ed2434d9..80e1d5272a17ba566d5961761db208e93f7a6348 100644 (file)
@@ -40,7 +40,7 @@ namespace Microsoft.Build.BuildEngine {
                {
                }
 
-               public bool Build (BuildTask buildTask, out bool executeOnErrors)
+               public bool Build (IBuildTask buildTask, out bool executeOnErrors)
                {
                        executeOnErrors = false;
                        try {
@@ -68,7 +68,7 @@ namespace Microsoft.Build.BuildEngine {
                        }
                }
 
-               bool Run (BuildTask buildTask, out bool executeOnErrors)
+               bool Run (IBuildTask buildTask, out bool executeOnErrors)
                {
                        executeOnErrors = false;
 
@@ -108,21 +108,10 @@ namespace Microsoft.Build.BuildEngine {
                // Parse task attributes to get list of referenced metadata and items
                // to determine batching
                //
-               void ParseTaskAttributes (BuildTask buildTask)
+               void ParseTaskAttributes (IBuildTask buildTask)
                {
-                       foreach (XmlAttribute attrib in buildTask.TaskElement.Attributes)
-                               ParseAttribute (attrib.Value);
-
-                       foreach (XmlNode xn in buildTask.TaskElement.ChildNodes) {
-                               XmlElement xe = xn as XmlElement;
-                               if (xe == null)
-                                       continue;
-
-                               //FIXME: error on any other child
-                               if (String.Compare (xe.LocalName, "Output", StringComparison.Ordinal) == 0) {
-                                       foreach (XmlAttribute attrib in xe.Attributes)
-                                               ParseAttribute (attrib.Value);
-                               }
+                       foreach (var attr in buildTask.GetAttributes ()) {
+                               ParseAttribute (attr);
                        }
                }
        }
index 41ed073a7ab5384a7e7e2075cacb7ffc2906f8ba..fa51fafd89f245d24a4b15fce24a2e21fd759cdb 100644 (file)
@@ -18,6 +18,8 @@ Microsoft.Build.BuildEngine/BuildPropertyGroupCollection.cs
 Microsoft.Build.BuildEngine/BuildPropertyGroup.cs
 Microsoft.Build.BuildEngine/BuildSettings.cs
 Microsoft.Build.BuildEngine/BuildTask.cs
+Microsoft.Build.BuildEngine/BuildTaskItemGroup.cs
+Microsoft.Build.BuildEngine/BuildTaskPropertyGroup.cs
 Microsoft.Build.BuildEngine/BuildWhen.cs
 Microsoft.Build.BuildEngine/ChangeType.cs
 Microsoft.Build.BuildEngine/ColorResetter.cs
@@ -46,6 +48,7 @@ Microsoft.Build.BuildEngine/ImportCollection.cs
 Microsoft.Build.BuildEngine/ImportedProject.cs
 Microsoft.Build.BuildEngine/InternalLoggerException.cs
 Microsoft.Build.BuildEngine/InvalidProjectFileException.cs
+Microsoft.Build.BuildEngine/IBuildTask.cs
 Microsoft.Build.BuildEngine/IReference.cs
 Microsoft.Build.BuildEngine/ItemReference.cs
 Microsoft.Build.BuildEngine/LogExtensions.cs
index 36f5e52f9b098933a5e1c2271a4c2dd179069e79..e580d358ed07dd16235f4eec2c0bb939b4a91d12 100644 (file)
@@ -95,6 +95,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
 
                // Parameter "itemInclude" cannot have zero length.
                [Test]
+               [Category ("NotDotNet")]
                [ExpectedException (typeof (ArgumentException))]
                public void TestCtor6 ()
                {
index 528ea5f9a56c3526536a7530f7494c2b2d992998..73df7340741a5f03699479c82c844563c8543993 100644 (file)
@@ -220,6 +220,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestGetEnumerator1 ()
                {
                        BuildPropertyGroup bpg = new BuildPropertyGroup ();
index 03f46be4183592552e65d1949ee44ec734bc2c10..f5f0472292b2b04b41d1b650685961fdde463480 100644 (file)
@@ -349,6 +349,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestValueXml ()
                {
                        BuildPropertyGroup [] bpgs = new BuildPropertyGroup [1];
index 258e4bb962d66822d93b175848171326ce8466a1..aa0e69d8158182e77b24e2bfd56a4f3a87a70baa 100755 (executable)
@@ -35,6 +35,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
        [TestFixture]
        public class ConsoleLoggerTest {
                [Test]
+               [Category ("NotDotNet")]
                public void TestAssignment ()
                {
                        ConsoleLogger cl = new ConsoleLogger ();
index d46108b8464cef109968d2f2f1c07117ba40c444..0a9edff4e5dd3255ed6492e95709d28cd0294081 100755 (executable)
@@ -275,6 +275,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                [ExpectedException (typeof (ArgumentException))]
                public void TestBuildProject1 ()
                {
@@ -305,6 +306,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                [ExpectedException (typeof (ArgumentException))]
                public void TestBuildProjectNull1 ()
                {
@@ -313,6 +315,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                [ExpectedException (typeof (ArgumentException))]
                public void TestBuildProjectNull2 ()
                {
index 0d07f2c2e042c96fd1f4da85d0a121d9d98fb2fc..8a78fad3c8e95cf32e2c44321cf773d0396bcaa1 100644 (file)
@@ -1301,6 +1301,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestBatchedMetadataRef1 ()
                {
                        //test for multiple items with same metadata also
@@ -1341,6 +1342,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestBatchedMetadataRef2 ()
                {
                        string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
@@ -1394,6 +1396,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestBatchedMetadataRef3 ()
                {
                        string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
@@ -1429,6 +1432,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestBatchedMetadataRef4 ()
                {
                        string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
@@ -1457,6 +1461,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestBatchedMetadataRef5 ()
                {
                        string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
@@ -1492,6 +1497,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestBatchedMetadataRefInOutput () {
                        string projectString = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                        <UsingTask TaskName=""BatchingTestTask"" AssemblyFile=""Test/resources/TestTasks.dll"" />
@@ -1831,6 +1837,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestMSBuildThisProperties ()
                {
                        Engine engine = new Engine (Consts.BinPath);
@@ -2005,6 +2012,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestRequiredTask_TaskItemArray1 ()
                {
                        Project p = CheckProjectForRequiredTests ("RequiredTestTask_TaskItems", "@(NonExistant)",
@@ -2016,6 +2024,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestRequiredTask_TaskItemArray2 ()
                {
                        Project p = CheckProjectForRequiredTests ("RequiredTestTask_TaskItems", "$(NonExistant)",
@@ -2027,6 +2036,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestRequiredTask_TaskItemArray3 ()
                {
                        Project p = CheckProjectForRequiredTests ("RequiredTestTask_IntArray", "$(NonExistant)",
@@ -2038,6 +2048,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestRequiredTask_TaskItemArray4 () {
                        Project p = CheckProjectForRequiredTests ("RequiredTestTask_IntArray", "%(NonExistant.Md)",
                                true, "Build failed", "count: 0");
@@ -2048,6 +2059,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestRequiredTask_TaskItemArray5 () {
                        // with extra space in prop value
                        Project p = CheckProjectForRequiredTests ("RequiredTestTask_IntArray", "  %(NonExistant.Md)",
index 9a40fd342a8f714d53625c640953318592a6b12e..03edf3db2b09f01b3164203c8a92626c59c7e731 100644 (file)
 // 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.
-
 using System;
 using System.Collections;
 using Microsoft.Build.BuildEngine;
 using Microsoft.Build.Framework;
 using Microsoft.Build.Utilities;
+using MonoTests.Microsoft.Build.Tasks;
 using NUnit.Framework;
 using System.IO;
+using System.Xml;
 
 namespace MonoTests.Microsoft.Build.BuildEngine {
        [TestFixture]
@@ -349,38 +350,87 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
 #if NET_3_5
-               [Test]
-               public void BuildProjectWithItemGroupInsideTarget()
+               bool Build (string projectXml, ILogger logger)
                {
-                       ItemGroupInsideATarget ();
+                       if (Environment.OSVersion.Platform == PlatformID.Win32NT) {
+                               var reader = new StringReader (projectXml);
+                               var xml = XmlReader.Create (reader);
+                               return BuildOnWindows (xml, logger);
+                       } else {
+                               return BuildOnLinux (projectXml, logger);
+                       }
                }
 
-               private MonoTests.Microsoft.Build.Tasks.TestMessageLogger ItemGroupInsideATarget() {
-                       var engine = new Engine(Consts.BinPath);
-                       var project = engine.CreateNewProject();
-                       var projectXml = GetProjectXmlWithItemGroupInsideATarget ();
-                       project.LoadXml(projectXml);
+               bool BuildOnWindows (XmlReader reader, ILogger logger)
+               {
+                       var type = Type.GetType ("Microsoft.Build.Evaluation.ProjectCollection, Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
+
+                       var prop = type.GetProperty ("GlobalProjectCollection");
+                       var coll = prop.GetValue (null);
+                               
+                       var loadProject = coll.GetType ().GetMethod (
+                                       "LoadProject", new Type[] { typeof (XmlReader), typeof (string) });
+                       var proj = loadProject.Invoke (coll, new object[] { reader, "4.0" });
+                               
+                       var build = proj.GetType ().GetMethod ("Build", new Type[] { typeof (string), typeof (ILogger[]) });
+                       var ret = (bool)build.Invoke (proj, new object[] { "Main", new ILogger[] { logger }});
+                       return ret;
+               }
 
-                       MonoTests.Microsoft.Build.Tasks.TestMessageLogger logger =
-                               new MonoTests.Microsoft.Build.Tasks.TestMessageLogger ();
+               bool BuildOnLinux (string projectXml, ILogger logger)
+               {
+                       var engine = new Engine (Consts.BinPath);
+                       var project = engine.CreateNewProject ();
+                       project.LoadXml (projectXml);
+                       
                        engine.RegisterLogger (logger);
+                       
+                       return project.Build ("Main");
+               }
 
-                       bool result = project.Build("Main");
-                       if (!result)
-                       {
+               TestMessageLogger CreateLogger (string projectXml)
+               {
+                       var logger = new TestMessageLogger ();
+                       var result = Build (projectXml, logger);
+
+                       if (!result) {
                                logger.DumpMessages ();
-                               Assert.Fail("Build failed");
+                               Assert.Fail ("Build failed");
                        }
 
                        return logger;
                }
 
-               private string GetProjectXmlWithItemGroupInsideATarget ()
+               void ItemGroupInsideTarget (string xml, params string[] messages)
+               {
+                       var logger = CreateLogger (xml);
+                       
+                       try
+                       {
+                               Assert.AreEqual(messages.Length, logger.NormalMessageCount, "Expected number of messages");
+                               for (int i = 0; i < messages.Length; i++)
+                                       logger.CheckLoggedMessageHead (messages [i], i.ToString ());
+                               Assert.AreEqual(0, logger.NormalMessageCount, "Extra messages found");
+                               
+                               Assert.AreEqual(1, logger.TargetStarted, "TargetStarted count");
+                               Assert.AreEqual(1, logger.TargetFinished, "TargetFinished count");
+                               Assert.AreEqual(messages.Length, logger.TaskStarted, "TaskStarted count");
+                               Assert.AreEqual(messages.Length, logger.TaskFinished, "TaskFinished count");
+                       }
+                       catch (AssertionException)
+                       {
+                               logger.DumpMessages();
+                               throw;
+                       }
+               }
+
+               [Test]
+               public void BuildProjectWithItemGroupInsideTarget ()
                {
-                       return
+                       ItemGroupInsideTarget (
                                @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
                                        <ItemGroup>
-                                               <fruit Include=""apple""/>
+                                       <fruit Include=""apple""/>
                                                <fruit Include=""apricot""/>
                                        </ItemGroup>
 
@@ -390,35 +440,258 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                                                </ItemGroup>
                                                <Message Text=""%(fruit.Identity)""/>
                                        </Target>
-                               </Project>";
+                               </Project>", "apple", "apricot", "raspberry");
                }
+               
+               [Test]
+               public void BuildProjectWithItemGroupInsideTarget2 ()
+               {
+                       ItemGroupInsideTarget (
+                               @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" ToolsVersion=""4.0"">
+                                       <ItemGroup>
+                                               <A Include='1'>
+                                                       <Sub>Foo</Sub>
+                                               </A>
+                                       </ItemGroup>
+                                       <PropertyGroup>
+                                               <Foo>Bar</Foo>
+                                       </PropertyGroup>
 
+                                       <Target Name='Main'>
+                                               <ItemGroup>
+                                                       <A Include='2'>
+                                                               <Sub>$(Foo);Hello</Sub>
+                                                       </A>
+                                               </ItemGroup>
+                               
+                                               <Message Text='@(A)' />
+                                               <Message Text='%(A.Sub)' />
+                                       </Target>
+                               </Project>", "1;2", "Foo", "Bar;Hello");
+               }
+               
                [Test]
-               [Category ("NotWorking")] //https://bugzilla.xamarin.com/show_bug.cgi?id=1862
-               public void BuildProjectOutputWithItemGroupInsideTarget()
+               public void BuildProjectWithPropertyGroupInsideTarget ()
                {
-                       var logger = ItemGroupInsideATarget ();
+                       ItemGroupInsideTarget (
+                               @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <PropertyGroup>
+                                               <A>Foo</A>
+                                               <B>Bar</B>
+                                       </PropertyGroup>
 
-                       try
-                       {
-                               Assert.AreEqual(3, logger.NormalMessageCount, "Expected number of messages");
-                               logger.CheckLoggedMessageHead("apple", "A1");
-                               logger.CheckLoggedMessageHead("apricot", "A2");
-                               logger.CheckLoggedMessageHead("raspberry", "A3");
-                               Assert.AreEqual(0, logger.NormalMessageCount, "Extra messages found");
+                                       <Target Name=""Main"">
+                                               <Message Text='$(A)' />
+                                               <PropertyGroup>
+                                                       <A>$(B)</A>
+                                               </PropertyGroup>
+                                               <Message Text='$(A)' />
+                                       </Target>
+                               </Project>", "Foo", "Bar");
+               }
 
-                               Assert.AreEqual(1, logger.TargetStarted, "TargetStarted count");
-                               Assert.AreEqual(1, logger.TargetFinished, "TargetFinished count");
-                               Assert.AreEqual(3, logger.TaskStarted, "TaskStarted count");
-                               Assert.AreEqual(3, logger.TaskFinished, "TaskFinished count");
+               [Test]
+               public void BuildProjectWithPropertyGroupInsideTarget2 ()
+               {
+                       ItemGroupInsideTarget (
+                               @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <PropertyGroup>
+                                               <A>Foo</A>
+                                               <B>Bar</B>
+                                       </PropertyGroup>
 
-                       }
-                       catch (AssertionException)
-                       {
-                               logger.DumpMessages();
-                               throw;
-                       }
+                                       <Target Name=""Main"">
+                                               <Message Text='$(A)' />
+                                               <PropertyGroup Condition='true'>
+                                                       <B Condition='false'>False</B>
+                                               </PropertyGroup>
+                                               <PropertyGroup Condition='true'>
+                                                       <A>$(B)</A>
+                                               </PropertyGroup>
+                                               <Message Text='$(A)' />
+                                               <Message Text='$(B)' />
+                                               <PropertyGroup>
+                                                       <A Condition='$(A) == $(B)'>Equal</A>
+                                               </PropertyGroup>
+                                               <Message Text='$(A)' />
+                                       </Target>
+                               </Project>", "Foo", "Bar", "Bar", "Equal");
                }
+
+               [Test]
+               public void ItemGroupInsideTarget_ModifyMetadata ()
+               {
+                       ItemGroupInsideTarget (
+                               @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <ItemGroup>
+                                               <Server Include='Server1'>
+                                                       <AdminContact>Mono</AdminContact>
+                                               </Server>
+                                               <Server Include='Server2'>
+                                                       <AdminContact>Mono</AdminContact>
+                                               </Server>
+                                               <Server Include='Server3'>
+                                                       <AdminContact>Root</AdminContact>
+                                               </Server>
+                                       </ItemGroup>
+
+                                       <Target Name='Main'>
+                                               <ItemGroup>
+                                                       <Server Condition=""'%(Server.AdminContact)' == 'Mono'"">
+                                                               <AdminContact>Monkey</AdminContact>
+                                                       </Server>
+                                               </ItemGroup>
+                                       
+                                               <Message Text='%(Server.Identity) : %(Server.AdminContact)' />
+                                               </Target>
+                                       </Project>", "Server1 : Monkey", "Server2 : Monkey", "Server3 : Root");
+               }
+
+               [Test]
+               public void ItemGroupInsideTarget_RemoveItem ()
+               {
+                       ItemGroupInsideTarget (
+                               @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <ItemGroup>
+                                               <Foo Include='A;B;C;D' />
+                                       </ItemGroup>
+
+                                       <Target Name='Main'>
+                                               <ItemGroup>
+                                                       <Foo Remove='B' />
+                                               </ItemGroup>
+
+                                               <Message Text='@(Foo)' />
+                                       </Target>
+                               </Project>", "A;C;D");
+               }
+
+               [Test]
+               public void ItemGroupInsideTarget_DontKeepDuplicates ()
+               {
+                       ItemGroupInsideTarget (
+                               @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <ItemGroup>
+                                               <Foo Include='A;B' />
+                                               <Foo Include='C'>
+                                                       <Hello>World</Hello>
+                                               </Foo>
+                                               <Foo Include='D'>
+                                                       <Hello>Boston</Hello>
+                                               </Foo>
+                                       </ItemGroup>
+
+                                       <Target Name='Main'>
+                                               <ItemGroup>
+                                                       <Foo Include='B;C;D' KeepDuplicates='false'>
+                                                               <Hello>Boston</Hello>
+                                                       </Foo>
+                                               </ItemGroup>
+                               
+                                               <Message Text='@(Foo)' />
+                                       </Target>
+                               </Project>", "A;B;C;D;B;C");
+               }
+
+               [Test]
+               public void ItemGroupInsideTarget_RemoveMetadata ()
+               {
+                       ItemGroupInsideTarget (
+                               @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <ItemGroup>
+                                               <Foo Include='A' />
+                                               <Foo Include='B'>
+                                                       <Hello>World</Hello>
+                                               </Foo>
+                                               <Foo Include='C'>
+                                                       <Hello>Boston</Hello>
+                                               </Foo>
+                                               <Foo Include='D'>
+                                                       <Test>Monkey</Test>
+                                               </Foo>
+                                       </ItemGroup>
+                                       <PropertyGroup>
+                                               <Foo>Hello</Foo>
+                                       </PropertyGroup>
+
+                                       <Target Name='Main'>
+                                               <ItemGroup>
+                                                       <Bar Include='@(Foo)' RemoveMetadata='$(Foo)' />
+                                                       <Bar Include='E'>
+                                                               <Hello>Monkey</Hello>
+                                                       </Bar>
+                                               </ItemGroup>
+                               
+                                               <Message Text='%(Bar.Identity)' Condition=""'%(Bar.Hello)' != ''""/>
+                                       </Target>
+                               </Project>", "E");
+               }
+
+               [Test]
+               public void ItemGroupInsideTarget_RemoveMetadata2 ()
+               {
+                       ItemGroupInsideTarget (
+                               @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <ItemGroup>
+                                               <Foo Include='A' />
+                                               <Foo Include='B'>
+                                                       <Hello>World</Hello>
+                                               </Foo>
+                                               <Foo Include='C'>
+                                                       <Hello>Boston</Hello>
+                                               </Foo>
+                                               <Foo Include='D'>
+                                                       <Test>Monkey</Test>
+                                               </Foo>
+                                       </ItemGroup>
+                                       <PropertyGroup>
+                                       <Foo>Hello</Foo>
+                                       </PropertyGroup>
+
+                                       <Target Name='Main'>
+                                               <ItemGroup>
+                                                       <Foo RemoveMetadata='$(Foo)' />
+                                                       <Foo Include='E'>
+                                                               <Hello>Monkey</Hello>
+                                                       </Foo>
+                                               </ItemGroup>
+                               
+                                       <Message Text='%(Foo.Identity)' Condition=""'%(Foo.Hello)' != ''""/>
+                                       </Target>
+                               </Project>", "E");
+               }
+
+               [Test]
+               public void ItemGroupInsideTarget_KeepMetadata ()
+               {
+                       ItemGroupInsideTarget (
+                               @"<Project ToolsVersion=""4.0"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
+                                       <ItemGroup>
+                                               <Foo Include='A' />
+                                               <Foo Include='B'>
+                                                       <Hello>World</Hello>
+                                               </Foo>
+                                               <Foo Include='C'>
+                                                       <Hello>Boston</Hello>
+                                               </Foo>
+                                               <Foo Include='D'>
+                                                       <Test>Monkey</Test>
+                                               </Foo>
+                                       </ItemGroup>
+
+                                       <Target Name='Main'>
+                                               <ItemGroup>
+                                                       <Foo KeepMetadata='Test' />
+                                                       <Foo Include='E'>
+                                                               <Hello>Monkey</Hello>
+                                                       </Foo>
+                                               </ItemGroup>
+                               
+                                               <Message Text='%(Foo.Identity)' Condition=""'%(Foo.Test)' != ''""/>
+                                       </Target>
+                               </Project>", "D");
+               }
+
 #endif
 
                [Test]
@@ -542,6 +815,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
 
 #if NET_4_0
                [Test]
+               [Category ("NotDotNet")]
                public void TestBeforeAndAfterTargets ()
                {
                        Engine engine;
index 4c62d4145cb2796178e9d51f81970a77615533b4..82d5e3009103d442f8f9e8560ee58e2e26226699 100644 (file)
@@ -202,6 +202,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestDuplicate1 ()
                {
                        string documentString = @"
@@ -294,6 +295,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestLazyLoad2 ()
                {
                        string documentString = @"
index d3954a2f322d73ac4320d87f96045efaae9b9ed3..51c3da6cfbf3ff0f779d3b5d4facac81819f1574 100644 (file)
@@ -284,6 +284,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestCondition10 ()
                {
                        Engine engine = new Engine (Consts.BinPath);
index 66968658e8a8e6083cf64c055c6a5ed7c8c2a7c3..77b45eb5bc059022f7cb782e886c1b5d34b0de7a 100644 (file)
@@ -233,6 +233,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestImportOrder1 ()
                {
                        Engine engine = new Engine (Consts.BinPath);
@@ -255,6 +256,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                [ExpectedException (typeof (InvalidProjectFileException))]
                public void TestImportOrder2 ()
                {
@@ -326,6 +328,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestImportOrder5 ()
                {
                        Engine engine = new Engine (Consts.BinPath);
@@ -348,6 +351,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestImportOrder6 ()
                {
                        Engine engine = new Engine (Consts.BinPath);
@@ -370,6 +374,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestImportOrder7 ()
                {
                        Engine engine = new Engine (Consts.BinPath);
index 5f6863be0757e2722555f6cf67a739341239c03c..ee93c4b932d47924a461760dc727b8081bdc2c26 100755 (executable)
@@ -718,6 +718,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestEmptyItemsWithBatching ()
                {
                        string project_xml = @"<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
@@ -799,6 +800,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestItemsInTarget1 ()
                {
                        Engine engine = new Engine (Consts.BinPath);
@@ -891,6 +893,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestItemsInTarget3 ()
                {
                        Engine engine = new Engine (Consts.BinPath);
@@ -934,6 +937,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                //Test with ITaskItem[]
                public void TestItemsInTarget3a ()
                {
@@ -982,6 +986,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                //Test with string[]
                public void TestItemsInTarget3b ()
                {
@@ -1024,6 +1029,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                //Test with string
                public void TestItemsInTarget3c ()
                {
@@ -1131,6 +1137,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestSingleTaskItem1 ()
                {
                        Project proj = BuildProjectForSingleTaskItem ("$(D)$(C)");
@@ -1138,6 +1145,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestSingleTaskItem2 ()
                {
                        Project proj = BuildProjectForSingleTaskItem ("@(Item1)");
@@ -1145,6 +1153,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestSingleTaskItem3 ()
                {
                        Project proj = BuildProjectForSingleTaskItem ("$(A).foo");
@@ -1152,6 +1161,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestSingleTaskItem4 ()
                {
                        Project proj = BuildProjectForSingleTaskItem ("$(C)");
index f5c6bdf307f0439d6f1fa12606f34b267167bfff..70b14ecf9a86862aa63461cfc89906bb5cca2832 100644 (file)
@@ -55,6 +55,7 @@ namespace MonoTests.Microsoft.Build.BuildEngine.Various {
                }
 
                [Test]
+               [Category ("NotDotNet")]
                public void TestProperties2 ()
                {
                        Engine engine = new Engine (Consts.BinPath);
index d1ab7e68ce0341f26a9271e37c42f78edbd97baa..8003473c783bc63f4526fa75259b1b6ff97b3818 100644 (file)
@@ -119,16 +119,20 @@ namespace Mono.Debugger.Soft {
 
                                        val = CreateArg (vm, arg.value);
 
-                                       if (arg.is_property) {
-                                               foreach (var prop in ctor.DeclaringType.GetProperties ()) {
-                                                       if (prop.Id == arg.id)
-                                                               named_args [j] = new CustomAttributeNamedArgumentMirror (prop, null, val);
-                                               }
-                                       } else {
-                                               foreach (var field in ctor.DeclaringType.GetFields ()) {
-                                                       if (field.Id == arg.id)
-                                                               named_args [j] = new CustomAttributeNamedArgumentMirror (null, field, val);
+                                       TypeMirror t = ctor.DeclaringType;
+                                       while (named_args [j] == null && t != null) {
+                                               if (arg.is_property) {
+                                                       foreach (var prop in t.GetProperties ()) {
+                                                               if (prop.Id == arg.id)
+                                                                       named_args [j] = new CustomAttributeNamedArgumentMirror (prop, null, val);
+                                                       }
+                                               } else {
+                                                       foreach (var field in t.GetFields ()) {
+                                                               if (field.Id == arg.id)
+                                                                       named_args [j] = new CustomAttributeNamedArgumentMirror (null, field, val);
+                                                       }
                                                }
+                                               t = t.BaseType;
                                        }
                                        if (named_args [j] == null)
                                                throw new NotImplementedException ();
index a7a698dfdc31b9c00c94ba92a6561de7e4b80d8b..ac97cb02fb43742c806aedec74020c48f04d6e00 100644 (file)
@@ -240,13 +240,13 @@ namespace Mono.Debugger.Soft
 
                public LocalVariable[] GetLocals () {
                        if (locals == null) {
-
                                LocalsInfo li = new LocalsInfo ();
                                try {
                                        li = vm.conn.Method_GetLocalsInfo (id);
                                } catch (CommandException) {
-                                       throw new ArgumentException ("Method doesn't have a body.");
+                                       throw new AbsentInformationException ();
                                }
+
                                // Add the arguments as well
                                var pi = vm.conn.Method_GetParamInfo (id);
 
index 61c284dfcfcdef30048998733af22ab625bc2607..d6a2a7896fc2a25457512ef2defa4ca7b78f04c5 100644 (file)
@@ -681,9 +681,9 @@ namespace Mono.Debugger.Soft
         }
     }
 
-       internal class CommandException : Exception {
+       public class CommandException : Exception {
 
-               public CommandException (ErrorCode error_code) : base ("Debuggee returned error code " + error_code + ".") {
+               internal CommandException (ErrorCode error_code) : base ("Debuggee returned error code " + error_code + ".") {
                        ErrorCode = error_code;
                }
 
index 1b13d3bbb13ee20fb9add504bdb840db7904a31d..2208c579bf9f2fb751cd22b444f36d8e341cff6a 100644 (file)
@@ -49,8 +49,17 @@ public static class Tests4 {
        }
 }
 
+public class AAttribute : Attribute {
+       public int afield;
+}
+
+public class BAttribute : AAttribute {
+       public int bfield;
+}
+
 [DebuggerDisplay ("Tests", Name="FOO", Target=typeof (int))]
 [DebuggerTypeProxy (typeof (Tests))]
+[BAttribute (afield = 1, bfield = 2)]
 public class Tests2 {
        [DebuggerBrowsableAttribute (DebuggerBrowsableState.Collapsed)]
        public int field_j;
index ac458762d43eef05acc9f72a19a9fb20cc20c229..db35c63a7737adb516cea1dfa85adb4e9f04ed7b 100644 (file)
@@ -1091,7 +1091,7 @@ public class DebuggerTests
                t = frame.Method.GetParameters ()[8].ParameterType;
                Assert.AreEqual ("Tests2", t.Name);
                var attrs = t.GetCustomAttributes (true);
-               Assert.AreEqual (2, attrs.Length);
+               Assert.AreEqual (3, attrs.Length);
                foreach (var attr in attrs) {
                        if (attr.Constructor.DeclaringType.Name == "DebuggerDisplayAttribute") {
                                Assert.AreEqual (1, attr.ConstructorArguments.Count);
@@ -1106,6 +1106,10 @@ public class DebuggerTests
                                Assert.AreEqual (1, attr.ConstructorArguments.Count);
                                Assert.IsInstanceOfType (typeof (TypeMirror), attr.ConstructorArguments [0].Value);
                                Assert.AreEqual ("Tests", (attr.ConstructorArguments [0].Value as TypeMirror).Name);
+                       } else if (attr.Constructor.DeclaringType.Name == "BAttribute") {
+                               Assert.AreEqual (2, attr.NamedArguments.Count);
+                               Assert.AreEqual ("afield", attr.NamedArguments [0].Field.Name);
+                               Assert.AreEqual ("bfield", attr.NamedArguments [1].Field.Name);
                        } else {
                                Assert.Fail (attr.Constructor.DeclaringType.Name);
                        }
index 7ac5a750f411def545f26595c5c960f0299194ca..4c56a293d517780d16e64f0e8107db4c6cf71dad 100644 (file)
@@ -318,6 +318,22 @@ namespace Mono.Unix.Native {
                        return fopen_mode;
                }
 
+               [DllImport (LIB, EntryPoint="Mono_Posix_FromStat")]
+               private static extern int FromStat (ref Stat source, IntPtr destination);
+
+               public static bool TryCopy (ref Stat source, IntPtr destination)
+               {
+                       return FromStat (ref source, destination) == 0;
+               }
+
+               [DllImport (LIB, EntryPoint="Mono_Posix_ToStat")]
+               private static extern int ToStat (IntPtr source, out Stat destination);
+
+               public static bool TryCopy (IntPtr source, out Stat destination)
+               {
+                       return ToStat (source, out destination) == 0;
+               }
+
                [DllImport (LIB, EntryPoint="Mono_Posix_FromStatvfs")]
                private static extern int FromStatvfs (ref Statvfs source, IntPtr destination);
 
index be846a892c168fe195d48e0fc1ed44e677afef18..d9097f8d7a3394610167957639000144950b97e6 100644 (file)
@@ -54,6 +54,38 @@ namespace Mono.Unix.Native {
                        return rval;
                }
 
+               [DllImport (LIB, EntryPoint="Mono_Posix_FromAtFlags")]
+               private static extern int FromAtFlags (AtFlags value, out Int32 rval);
+
+               public static bool TryFromAtFlags (AtFlags value, out Int32 rval)
+               {
+                       return FromAtFlags (value, out rval) == 0;
+               }
+
+               public static Int32 FromAtFlags (AtFlags value)
+               {
+                       Int32 rval;
+                       if (FromAtFlags (value, out rval) == -1)
+                               ThrowArgumentException (value);
+                       return rval;
+               }
+
+               [DllImport (LIB, EntryPoint="Mono_Posix_ToAtFlags")]
+               private static extern int ToAtFlags (Int32 value, out AtFlags rval);
+
+               public static bool TryToAtFlags (Int32 value, out AtFlags rval)
+               {
+                       return ToAtFlags (value, out rval) == 0;
+               }
+
+               public static AtFlags ToAtFlags (Int32 value)
+               {
+                       AtFlags rval;
+                       if (ToAtFlags (value, out rval) == -1)
+                               ThrowArgumentException (value);
+                       return rval;
+               }
+
                [DllImport (LIB, EntryPoint="Mono_Posix_FromConfstrName")]
                private static extern int FromConfstrName (ConfstrName value, out Int32 rval);
 
@@ -294,6 +326,22 @@ namespace Mono.Unix.Native {
                        return ToFlock (source, out destination) == 0;
                }
 
+               [DllImport (LIB, EntryPoint="Mono_Posix_FromIovec")]
+               private static extern int FromIovec (ref Iovec source, IntPtr destination);
+
+               public static bool TryCopy (ref Iovec source, IntPtr destination)
+               {
+                       return FromIovec (ref source, destination) == 0;
+               }
+
+               [DllImport (LIB, EntryPoint="Mono_Posix_ToIovec")]
+               private static extern int ToIovec (IntPtr source, out Iovec destination);
+
+               public static bool TryCopy (IntPtr source, out Iovec destination)
+               {
+                       return ToIovec (source, out destination) == 0;
+               }
+
                [DllImport (LIB, EntryPoint="Mono_Posix_FromLockType")]
                private static extern int FromLockType (LockType value, out Int16 rval);
 
@@ -790,22 +838,6 @@ namespace Mono.Unix.Native {
                        return rval;
                }
 
-               [DllImport (LIB, EntryPoint="Mono_Posix_FromStat")]
-               private static extern int FromStat (ref Stat source, IntPtr destination);
-
-               public static bool TryCopy (ref Stat source, IntPtr destination)
-               {
-                       return FromStat (ref source, destination) == 0;
-               }
-
-               [DllImport (LIB, EntryPoint="Mono_Posix_ToStat")]
-               private static extern int ToStat (IntPtr source, out Stat destination);
-
-               public static bool TryCopy (IntPtr source, out Stat destination)
-               {
-                       return ToStat (source, out destination) == 0;
-               }
-
                [DllImport (LIB, EntryPoint="Mono_Posix_FromSysconfName")]
                private static extern int FromSysconfName (SysconfName value, out Int32 rval);
 
index e5ef6c7a93bfc103178b244a163da9624d39668a..27d241539d5a7e3a35ea4d74436ff211bdfd4afb 100644 (file)
@@ -149,7 +149,19 @@ namespace Mono.Unix.Native {
                O_DIRECTORY = 0x00010000,
                O_DIRECT    = 0x00004000,
                O_ASYNC     = 0x00002000,
-               O_LARGEFILE = 0x00008000
+               O_LARGEFILE = 0x00008000,
+               O_CLOEXEC   = 0x00080000,
+               O_PATH      = 0x00200000
+       }
+       
+       [Map][Flags]
+       [CLSCompliant (false)]
+       public enum AtFlags : int {
+               AT_SYMLINK_NOFOLLOW = 0x00000100,
+               AT_REMOVEDIR        = 0x00000200,
+               AT_SYMLINK_FOLLOW   = 0x00000400,
+               AT_NO_AUTOMOUNT     = 0x00000800,
+               AT_EMPTY_PATH       = 0x00001000
        }
        
        // mode_t
@@ -808,7 +820,7 @@ namespace Mono.Unix.Native {
                }
        }
 
-       [Map ("struct stat")]
+       // Use manually written To/From methods to handle fields st_atime_nsec etc.
        public struct Stat
 #if NET_2_0
                : IEquatable <Stat>
@@ -838,6 +850,39 @@ namespace Mono.Unix.Native {
                [time_t]    public  long    st_atime;   // time of last access
                [time_t]    public  long    st_mtime;   // time of last modification
                [time_t]    public  long    st_ctime;   // time of last status change
+               public  long             st_atime_nsec; // Timespec.tv_nsec partner to st_atime
+               public  long             st_mtime_nsec; // Timespec.tv_nsec partner to st_mtime
+               public  long             st_ctime_nsec; // Timespec.tv_nsec partner to st_ctime
+
+               public Timespec st_atim {
+                       get {
+                               return new Timespec { tv_sec = st_atime, tv_nsec = st_atime_nsec };
+                       }
+                       set {
+                               st_atime = value.tv_sec;
+                               st_atime_nsec = value.tv_nsec;
+                       }
+               }
+
+               public Timespec st_mtim {
+                       get {
+                               return new Timespec { tv_sec = st_mtime, tv_nsec = st_mtime_nsec };
+                       }
+                       set {
+                               st_mtime = value.tv_sec;
+                               st_mtime_nsec = value.tv_nsec;
+                       }
+               }
+
+               public Timespec st_ctim {
+                       get {
+                               return new Timespec { tv_sec = st_ctime, tv_nsec = st_ctime_nsec };
+                       }
+                       set {
+                               st_ctime = value.tv_sec;
+                               st_ctime_nsec = value.tv_nsec;
+                       }
+               }
 
                public override int GetHashCode ()
                {
@@ -853,7 +898,10 @@ namespace Mono.Unix.Native {
                                st_blocks.GetHashCode () ^
                                st_atime.GetHashCode () ^
                                st_mtime.GetHashCode () ^
-                               st_ctime.GetHashCode ();
+                               st_ctime.GetHashCode () ^
+                               st_atime_nsec.GetHashCode () ^
+                               st_mtime_nsec.GetHashCode () ^
+                               st_ctime_nsec.GetHashCode ();
                }
 
                public override bool Equals (object obj)
@@ -873,7 +921,10 @@ namespace Mono.Unix.Native {
                                value.st_blocks == st_blocks &&
                                value.st_atime == st_atime &&
                                value.st_mtime == st_mtime &&
-                               value.st_ctime == st_ctime;
+                               value.st_ctime == st_ctime &&
+                               value.st_atime_nsec == st_atime_nsec &&
+                               value.st_mtime_nsec == st_mtime_nsec &&
+                               value.st_ctime_nsec == st_ctime_nsec;
                }
 
                public bool Equals (Stat value)
@@ -890,7 +941,10 @@ namespace Mono.Unix.Native {
                                value.st_blocks == st_blocks &&
                                value.st_atime == st_atime &&
                                value.st_mtime == st_mtime &&
-                               value.st_ctime == st_ctime;
+                               value.st_ctime == st_ctime &&
+                               value.st_atime_nsec == st_atime_nsec &&
+                               value.st_mtime_nsec == st_mtime_nsec &&
+                               value.st_ctime_nsec == st_ctime_nsec;
                }
 
                public static bool operator== (Stat lhs, Stat rhs)
@@ -1137,6 +1191,14 @@ namespace Mono.Unix.Native {
                }
        }
 
+       [Map ("struct iovec")]
+       public struct Iovec
+       {
+               public IntPtr   iov_base; // Starting address
+               [CLSCompliant (false)]
+               public ulong    iov_len;  // Number of bytes to transfer
+       }
+
        [Flags][Map]
        public enum EpollFlags {
                EPOLL_CLOEXEC = 02000000,
@@ -2005,6 +2067,9 @@ namespace Mono.Unix.Native {
 
                [DllImport (LIBC, SetLastError=true)]
                public static extern int dirfd (IntPtr dir);
+
+               [DllImport (LIBC, SetLastError=true)]
+               public static extern IntPtr fdopendir (int fd);
                #endregion
 
                #region <fcntl.h> Declarations
@@ -2068,6 +2133,40 @@ namespace Mono.Unix.Native {
                [DllImport (MPH, SetLastError=true, 
                                EntryPoint="Mono_Posix_Syscall_posix_fallocate")]
                public static extern int posix_fallocate (int fd, long offset, ulong len);
+
+               [DllImport (LIBC, SetLastError=true, 
+                               EntryPoint="openat")]
+               private static extern int sys_openat (int dirfd,
+                               [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(FileNameMarshaler))]
+                               string pathname, int flags);
+
+               // openat(2)
+               //    int openat(int dirfd, const char *pathname, int flags, mode_t mode);
+               [DllImport (LIBC, SetLastError=true, 
+                               EntryPoint="openat")]
+               private static extern int sys_openat (int dirfd,
+                               [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(FileNameMarshaler))]
+                               string pathname, int flags, uint mode);
+
+               public static int openat (int dirfd, string pathname, OpenFlags flags)
+               {
+                       int _flags = NativeConvert.FromOpenFlags (flags);
+                       return sys_openat (dirfd, pathname, _flags);
+               }
+
+               public static int openat (int dirfd, string pathname, OpenFlags flags, FilePermissions mode)
+               {
+                       int _flags = NativeConvert.FromOpenFlags (flags);
+                       uint _mode = NativeConvert.FromFilePermissions (mode);
+                       return sys_openat (dirfd, pathname, _flags, _mode);
+               }
+
+               [DllImport (MPH, SetLastError=true, 
+                               EntryPoint="Mono_Posix_Syscall_get_at_fdcwd")]
+               private static extern int get_at_fdcwd ();
+
+               public static readonly int AT_FDCWD = get_at_fdcwd ();
+
                #endregion
 
                #region <fstab.h> Declarations
@@ -2664,6 +2763,12 @@ namespace Mono.Unix.Native {
                        }
                }
 
+               [DllImport (LIBC, SetLastError=true)]
+               public static extern int renameat (int olddirfd,
+                               [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(FileNameMarshaler))]
+                               string oldpath, int newdirfd,
+                               [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(FileNameMarshaler))]
+                               string newpath);
                #endregion
 
                #region <stdlib.h> Declarations
@@ -2673,6 +2778,16 @@ namespace Mono.Unix.Native {
                [DllImport (LIBC, SetLastError=true)]
                public static extern int mkstemp (StringBuilder template);
 
+               [DllImport (LIBC, SetLastError=true, EntryPoint="mkdtemp")]
+               private static extern IntPtr sys_mkdtemp (StringBuilder template);
+
+               public static StringBuilder mkdtemp (StringBuilder template)
+               {
+                       if (sys_mkdtemp (template) == IntPtr.Zero)
+                               return null;
+                       return template;
+               }
+
                [DllImport (LIBC, SetLastError=true)]
                public static extern int ttyslot ();
 
@@ -2980,6 +3095,100 @@ namespace Mono.Unix.Native {
                        return sys_mkfifo (pathname, _mode);
                }
 
+               // fchmodat(2)
+               //    int fchmodat(int dirfd, const char *pathname, mode_t mode, int flags);
+               [DllImport (LIBC, SetLastError=true, EntryPoint="fchmodat")]
+               private static extern int sys_fchmodat (int dirfd,
+                               [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(FileNameMarshaler))]
+                               string pathname, uint mode, int flags);
+
+               public static int fchmodat (int dirfd, string pathname, FilePermissions mode, AtFlags flags)
+               {
+                       uint _mode = NativeConvert.FromFilePermissions (mode);
+                       int _flags = NativeConvert.FromAtFlags (flags);
+                       return sys_fchmodat (dirfd, pathname, _mode, _flags);
+               }
+
+               [DllImport (MPH, SetLastError=true, 
+                               EntryPoint="Mono_Posix_Syscall_fstatat")]
+               public static extern int fstatat (int dirfd,
+                               [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(FileNameMarshaler))]
+                               string file_name, out Stat buf, AtFlags flags);
+
+               [DllImport (MPH, SetLastError=true, 
+                               EntryPoint="Mono_Posix_Syscall_get_utime_now")]
+               private static extern long get_utime_now ();
+
+               [DllImport (MPH, SetLastError=true, 
+                               EntryPoint="Mono_Posix_Syscall_get_utime_omit")]
+               private static extern long get_utime_omit ();
+
+               public static readonly long UTIME_NOW = get_utime_now ();
+
+               public static readonly long UTIME_OMIT = get_utime_omit ();
+
+               [DllImport (MPH, SetLastError=true, 
+                               EntryPoint="Mono_Posix_Syscall_futimens")]
+               private static extern int sys_futimens (int fd, Timespec[] times);
+
+               public static int futimens (int fd, Timespec[] times)
+               {
+                       if (times != null && times.Length != 2) {
+                               SetLastError (Errno.EINVAL);
+                               return -1;
+                       }
+                       return sys_futimens (fd, times);
+               }
+
+               [DllImport (MPH, SetLastError=true, 
+                               EntryPoint="Mono_Posix_Syscall_utimensat")]
+               private static extern int sys_utimensat (int dirfd,
+                               [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(FileNameMarshaler))]
+                               string pathname, Timespec[] times, int flags);
+
+               public static int utimensat (int dirfd, string pathname, Timespec[] times, AtFlags flags)
+               {
+                       if (times != null && times.Length != 2) {
+                               SetLastError (Errno.EINVAL);
+                               return -1;
+                       }
+                       int _flags = NativeConvert.FromAtFlags (flags);
+                       return sys_utimensat (dirfd, pathname, times, _flags);
+               }
+
+               // mkdirat(2)
+               //    int mkdirat(int dirfd, const char *pathname, mode_t mode);
+               [DllImport (LIBC, SetLastError=true, EntryPoint="mkdirat")]
+               private static extern int sys_mkdirat (int dirfd,
+                               [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(FileNameMarshaler))]
+                               string oldpath, uint mode);
+
+               public static int mkdirat (int dirfd, string oldpath, FilePermissions mode)
+               {
+                       uint _mode = NativeConvert.FromFilePermissions (mode);
+                       return sys_mkdirat (dirfd, oldpath, _mode);
+               }
+
+               // mknodat(2)
+               //    int mknodat (int dirfd, const char *pathname, mode_t mode, dev_t dev);
+               [DllImport (MPH, SetLastError=true,
+                               EntryPoint="Mono_Posix_Syscall_mknodat")]
+               public static extern int mknodat (int dirfd,
+                               [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(FileNameMarshaler))]
+                               string pathname, FilePermissions mode, ulong dev);
+
+               // mkfifoat(3)
+               //    int mkfifoat(int dirfd, const char *pathname, mode_t mode);
+               [DllImport (LIBC, SetLastError=true, EntryPoint="mkfifoat")]
+               private static extern int sys_mkfifoat (int dirfd,
+                               [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(FileNameMarshaler))]
+                               string pathname, uint mode);
+
+               public static int mkfifoat (int dirfd, string pathname, FilePermissions mode)
+               {
+                       uint _mode = NativeConvert.FromFilePermissions (mode);
+                       return sys_mkfifoat (dirfd, pathname, _mode);
+               }
                #endregion
 
                #region <sys/stat.h> Declarations
@@ -3978,6 +4187,74 @@ namespace Mono.Unix.Native {
                        swab ((IntPtr) from, (IntPtr) to, n);
                }
 
+               [DllImport (LIBC, SetLastError=true, EntryPoint="faccessat")]
+               private static extern int sys_faccessat (int dirfd,
+                               [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(FileNameMarshaler))]
+                               string pathname, int mode, int flags);
+
+               public static int faccessat (int dirfd, string pathname, AccessModes mode, AtFlags flags)
+               {
+                       int _mode = NativeConvert.FromAccessModes (mode);
+                       int _flags = NativeConvert.FromAtFlags (flags);
+                       return sys_faccessat (dirfd, pathname, _mode, _flags);
+               }
+
+               // fchownat(2)
+               //    int fchownat(int dirfd, const char *path, uid_t owner, gid_t group, int flags);
+               [DllImport (LIBC, SetLastError=true, EntryPoint="fchownat")]
+               private static extern int sys_fchownat (int dirfd,
+                               [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(FileNameMarshaler))]
+                               string pathname, uint owner, uint group, int flags);
+
+               public static int fchownat (int dirfd, string pathname, uint owner, uint group, AtFlags flags)
+               {
+                       int _flags = NativeConvert.FromAtFlags (flags);
+                       return sys_fchownat (dirfd, pathname, owner, group, _flags);
+               }
+
+               [DllImport (LIBC, SetLastError=true, EntryPoint="linkat")]
+               private static extern int sys_linkat (int olddirfd,
+                               [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(FileNameMarshaler))]
+                               string oldpath, int newdirfd,
+                               [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(FileNameMarshaler))]
+                               string newpath, int flags);
+
+               public static int linkat (int olddirfd, string oldpath, int newdirfd, string newpath, AtFlags flags)
+               {
+                       int _flags = NativeConvert.FromAtFlags (flags);
+                       return sys_linkat (olddirfd, oldpath, newdirfd, newpath, _flags);
+               }
+
+               // readlinkat(2)
+               //    int readlinkat(int dirfd, const char *pathname, char *buf, size_t bufsize);
+               [DllImport (MPH, SetLastError=true,
+                               EntryPoint="Mono_Posix_Syscall_readlinkat")]
+               public static extern int readlinkat (int dirfd,
+                               [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(FileNameMarshaler))]
+                               string pathname, [Out] StringBuilder buf, ulong bufsiz);
+
+               public static int readlinkat (int dirfd, string pathname, [Out] StringBuilder buf)
+               {
+                       return readlinkat (dirfd, pathname, buf, (ulong) buf.Capacity);
+               }
+
+               [DllImport (LIBC, SetLastError=true)]
+               public static extern int symlinkat (
+                               [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(FileNameMarshaler))]
+                               string oldpath, int dirfd,
+                               [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(FileNameMarshaler))]
+                               string newpath);
+
+               [DllImport (LIBC, SetLastError=true, EntryPoint="unlinkat")]
+               private static extern int sys_unlinkat (int dirfd,
+                               [MarshalAs (UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(FileNameMarshaler))]
+                               string pathname, int flags);
+
+               public static int unlinkat (int dirfd, string pathname, AtFlags flags)
+               {
+                       int _flags = NativeConvert.FromAtFlags (flags);
+                       return sys_unlinkat (dirfd, pathname, _flags);
+               }
                #endregion
 
                #region <utime.h> Declarations
@@ -4002,6 +4279,56 @@ namespace Mono.Unix.Native {
                        return sys_utime (filename, ref buf, 0);
                }
                #endregion
+
+               #region <sys/uio.h> Declarations
+               //
+               // <sys/uio.h> -- COMPLETE
+               //
+
+               // readv(2)
+               //    ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
+               [DllImport (MPH, SetLastError=true,
+                               EntryPoint="Mono_Posix_Syscall_readv")]
+               private static extern long sys_readv (int fd, Iovec[] iov, int iovcnt);
+
+               public static long readv (int fd, Iovec[] iov)
+               {
+                       return sys_readv (fd, iov, iov.Length);
+               }
+
+               // writev(2)
+               //    ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
+               [DllImport (MPH, SetLastError=true,
+                               EntryPoint="Mono_Posix_Syscall_writev")]
+               private static extern long sys_writev (int fd, Iovec[] iov, int iovcnt);
+
+               public static long writev (int fd, Iovec[] iov)
+               {
+                       return sys_writev (fd, iov, iov.Length);
+               }
+
+               // preadv(2)
+               //    ssize_t preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset);
+               [DllImport (MPH, SetLastError=true,
+                               EntryPoint="Mono_Posix_Syscall_preadv")]
+               private static extern long sys_preadv (int fd, Iovec[] iov, int iovcnt, long offset);
+
+               public static long preadv (int fd, Iovec[] iov, long offset)
+               {
+                       return sys_preadv (fd, iov, iov.Length, offset);
+               }
+
+               // pwritev(2)
+               //    ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset);
+               [DllImport (MPH, SetLastError=true,
+                               EntryPoint="Mono_Posix_Syscall_pwritev")]
+               private static extern long sys_pwritev (int fd, Iovec[] iov, int iovcnt, long offset);
+
+               public static long pwritev (int fd, Iovec[] iov, long offset)
+               {
+                       return sys_pwritev (fd, iov, iov.Length, offset);
+               }
+               #endregion
        }
 
        #endregion
index 89547d0a059a2f196ca70cd897616932fcbcc897..71f392690a47666dc15496f0ffbcca58fe56dae7 100644 (file)
@@ -2885,7 +2885,7 @@ namespace System.Linq
                                collection.CopyTo (array, 0);
                                return array;
                        }
-                       
+
                        int pos = 0;
                        array = EmptyOf<TSource>.Instance;
                        foreach (var element in source) {
@@ -3105,6 +3105,11 @@ namespace System.Linq
                {
                        Check.SourceAndPredicate (source, predicate);
 
+                       // It cannot be IList<TSource> because it may break on user implementation
+                       var array = source as TSource[];
+                       if (array != null)
+                               return CreateWhereIterator (array, predicate);
+
                        return CreateWhereIterator (source, predicate);
                }
 
@@ -3115,14 +3120,27 @@ namespace System.Linq
                                        yield return element;
                }
 
+               static IEnumerable<TSource> CreateWhereIterator<TSource> (TSource[] source, Func<TSource, bool> predicate)
+               {
+                       for (int i = 0; i < source.Length; ++i) {
+                               var element = source [i];
+                               if (predicate (element))
+                                       yield return element;
+                       }
+               }       
+
                public static IEnumerable<TSource> Where<TSource> (this IEnumerable<TSource> source, Func<TSource, int, bool> predicate)
                {
                        Check.SourceAndPredicate (source, predicate);
 
+                       var array = source as TSource[];
+                       if (array != null)
+                               return CreateWhereIterator (array, predicate);
+
                        return CreateWhereIterator (source, predicate);
                }
 
-               static IEnumerable<TSource> CreateWhereIterator<TSource> (this IEnumerable<TSource> source, Func<TSource, int, bool> predicate)
+               static IEnumerable<TSource> CreateWhereIterator<TSource> (IEnumerable<TSource> source, Func<TSource, int, bool> predicate)
                {
                        int counter = 0;
                        foreach (TSource element in source) {
@@ -3132,6 +3150,15 @@ namespace System.Linq
                        }
                }
 
+               static IEnumerable<TSource> CreateWhereIterator<TSource> (TSource[] source, Func<TSource, int, bool> predicate)
+               {
+                       for (int i = 0; i < source.Length; ++i) {
+                               var element = source [i];
+                               if (predicate (element, i))
+                                       yield return element;
+                       }
+               }
+
                #endregion
 
                internal static ReadOnlyCollection<TSource> ToReadOnlyCollection<TSource> (this IEnumerable<TSource> source)
index db4ad0c29c9a7c613b58052fd4454093a948cbb2..c3df83b3b0c3b4790f8a38dd7bb80271ff892bbe 100644 (file)
@@ -1365,7 +1365,7 @@ namespace System.Data {
                /// </summary>
                public void SetParentRow (DataRow parentRow, DataRelation relation)
                {
-                       if (_table == null || parentRow.Table == null)
+                       if (_table == null || (parentRow != null && parentRow.Table == null))
                                throw new RowNotInTableException ("This row has been removed from a table and does not have any data.  BeginEdit() will allow creation of new data in this row.");
 
                        if (parentRow != null && _table.DataSet != parentRow.Table.DataSet)
@@ -1378,10 +1378,13 @@ namespace System.Data {
                        BeginEdit();
 
                        IEnumerable relations;
-                       if (relation == null)
-                               relations = _table.ParentRelations;
-                       else
+                       if (relation != null) {
+                               if (parentRow != null && relation.ParentColumns [0].Table != parentRow.Table)
+                                       throw new InvalidConstraintException (string.Format ("Parent belongs to table {0} but relation is for table {1}", parentRow.Table, relation.ParentColumns [0].Table));
                                relations = new DataRelation [] { relation };
+                       } else {
+                               relations = _table.ParentRelations;
+                       }
 
                        foreach (DataRelation rel in relations) {
                                DataColumn [] childCols = rel.ChildColumns;
@@ -1390,7 +1393,7 @@ namespace System.Data {
                                for (int i = 0; i < parentCols.Length; i++) {
                                        if (parentRow == null) {
                                                childCols [i].DataContainer [Proposed] = DBNull.Value;
-                                       } else {
+                                       } else if (parentCols [i].Table == parentRow.Table) {
                                                int defaultIdx = parentRow.IndexFromVersion (DataRowVersion.Default);
                                                childCols [i].DataContainer.CopyValue(parentCols [i].DataContainer, defaultIdx, Proposed);
                                        }
index 21204a5d5680d74a660b4d786a850d48b05d1e89..36e93707be5e57b8032e0b31d64bf9e987239c9a 100644 (file)
@@ -274,9 +274,9 @@ namespace System.Data
                        int count = 0, match = -1;
                        for (int i = start; i < List.Count; i++) {
                                String name2 = ((DataTable) List[i]).TableName;
-                               if (String.Compare (name, name2, false) == 0)
+                               if (String.Compare (name, name2, false, dataSet.Locale) == 0)
                                        return i;
-                               if (String.Compare (name, name2, true) == 0) {
+                               if (String.Compare (name, name2, true, dataSet.Locale) == 0) {
                                        match = i;
                                        count++;
                                }
index 7446bb4e6266118449c686645e0d3006e682be27..2a9f7cdada47f9412343c5f13fffed815e86b799 100644 (file)
@@ -51,6 +51,9 @@ namespace MonoTests.System.Data.Common
        }\r
 \r
        [TestFixture]\r
+#if MOBILE\r
+       [Ignore ("CAS is not supported and parts will be linked away")]\r
+#endif\r
        public class DBDataPermissionAttributeTest\r
        {\r
                [Test]\r
index 9c2842619f4fc1686b43d6067164f1b5471c2892..ff8bd76f393dbadac8b95c70ba30b8e8e1caa555 100644 (file)
@@ -82,6 +82,9 @@ namespace MonoTests.System.Data.Common {
        }
 
        [TestFixture]
+#if MOBILE
+       [Ignore ("CAS is not supported and parts will be linked away")]
+#endif
        public class DBDataPermissionTest {
 
                private const string defaultConnectString = "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;";
index 4923e644ebcf848af8ff4e1b5f23094f334f0b8d..f6d1336ae2ecd435b9328f4eaff497dab31246a6 100644 (file)
@@ -37,6 +37,9 @@ using System.Security.Permissions;
 namespace MonoTests.System.Data.SqlClient {\r
 \r
        [TestFixture]\r
+#if MOBILE\r
+       [Ignore ("CAS is not supported and parts will be linked away")]\r
+#endif\r
        public class SqlClientPermissionAttributeTest {\r
 \r
                [Test]\r
index da430b1ac2dd4d343f6f5cb0e5cfe9b83e0b9c8f..5d2602ae500eff277c2134f1ca392d3f83f5ee99 100644 (file)
@@ -39,6 +39,9 @@ namespace MonoTests.System.Data.SqlClient {
        // NOTE: Most tests are are located in the base class, DBDataPermission\r
 \r
        [TestFixture]\r
+#if MOBILE\r
+       [Ignore ("CAS is not supported and parts will be linked away")]\r
+#endif\r
        public class SqlClientPermissionTest {\r
 \r
                private void Check (string msg, DBDataPermission dbdp, bool blank, bool unrestricted, int count)\r
index d5bbcf4586ac4c91ae159585f6dff8797a3bed00..5b2fd8ca9f3d66c97964d7d1ae0b44fc596f32cd 100644 (file)
@@ -1007,5 +1007,163 @@ namespace MonoTests.System.Data
                        AssertEquals (DataRowState.Detached, dr.RowState);
                        object o = dr ["col"];
                }
+
+               [Test]
+               public void SetParentRow_Null ()
+               {
+                       DataSet ds = new DataSet();
+
+                       DataTable       child   = ds.Tables.Add("child");
+                       child.Columns.Add("column1");
+
+                       DataRow r1 = child.NewRow();
+
+                       r1.SetParentRow(null);
+               }
+
+               [Test]
+               public void SetParentRow_DataInheritance ()
+               {
+                       var ds = new DataSet() ;
+
+                       var     child                   = ds.Tables.Add("child") ;
+
+                       var     childColumn1    = child.Columns.Add("column1");
+                       var     childColumn2    = child.Columns.Add("column2");
+
+                       var     parent1                 = ds.Tables.Add("parent1");
+                       var     parent1Column1  = parent1.Columns.Add("column1");
+                       var     parent1Column2  = parent1.Columns.Add("column2");
+
+                       var     parent2                 = ds.Tables.Add("parent2");
+                       var     parent2Column1  = parent2.Columns.Add("column1");
+                       var     parent2Column2  = parent2.Columns.Add("column2");
+
+                       var relation1 = ds.Relations.Add("parent1-child", parent1Column1, childColumn1);
+                                                       ds.Relations.Add("parent2-child", parent2Column2, childColumn2);
+
+                       var childRow1   = child.NewRow();
+                       var parent1Row  = parent1.NewRow();
+                       var parent2Row  = parent2.NewRow();
+
+                       parent1Row[parent1Column1] = "p1c1";
+                       parent1Row[parent1Column2] = "p1c2";
+                       parent2Row[parent2Column1] = "p2c1";
+                       parent2Row[parent2Column2] = "p2c2";
+
+                       child.Rows.Add(childRow1);
+                       parent1.Rows.Add(parent1Row);
+                       parent2.Rows.Add(parent2Row);
+
+                       childRow1.SetParentRow(parent1Row);
+                       AssertEquals ("p1c1", childRow1[childColumn1]);
+                       AssertEquals (DBNull.Value, childRow1[childColumn2]);
+
+                       childRow1.SetParentRow(parent2Row);
+                       AssertEquals ("p1c1", childRow1[childColumn1]);
+                       AssertEquals ("p2c2", childRow1[childColumn2]);
+
+                       childRow1.SetParentRow(null);
+                       AssertEquals (DBNull.Value, childRow1[childColumn1]);
+                       AssertEquals (DBNull.Value, childRow1[childColumn2]);
+
+                       childRow1.SetParentRow(parent2Row);
+                       AssertEquals (DBNull.Value, childRow1[childColumn1]);
+                       AssertEquals ("p2c2", childRow1[childColumn2]);
+               }
+
+               [Test]
+               public void SetParentRow_with_Relation ()
+               {
+                       var ds = new DataSet() ;
+
+                       var     child                   = ds.Tables.Add("child") ;
+
+                       var     childColumn1    = child.Columns.Add("column1");
+                       var     childColumn2    = child.Columns.Add("column2");
+
+                       var     parent1                 = ds.Tables.Add("parent1");
+                       var     parent1Column1  = parent1.Columns.Add("column1");
+                       var     parent1Column2  = parent1.Columns.Add("column2");
+
+                       var     parent2                 = ds.Tables.Add("parent2");
+                       var     parent2Column1  = parent2.Columns.Add("column1");
+                       var     parent2Column2  = parent2.Columns.Add("column2");
+
+                       var relation1 = ds.Relations.Add("parent1-child", parent1Column1, childColumn1) ; 
+                       var relation2 = ds.Relations.Add("parent2-child", parent2Column2, childColumn2) ;
+
+                       var childRow1   = child.NewRow();
+                       var parent1Row  = parent1.NewRow();
+                       var parent2Row  = parent2.NewRow();
+
+                       parent1Row[parent1Column1] = "p1c1";
+                       parent1Row[parent1Column2] = "p1c2";
+                       parent2Row[parent2Column1] = "p2c1";
+                       parent2Row[parent2Column2] = "p2c2";
+
+                       child.Rows.Add(childRow1);
+                       parent1.Rows.Add(parent1Row);
+                       parent2.Rows.Add(parent2Row);
+
+
+                       childRow1.SetParentRow (null, relation2);
+                       AssertEquals (DBNull.Value, childRow1[childColumn1]);
+                       AssertEquals (DBNull.Value, childRow1[childColumn2]);
+
+                       try {
+                               childRow1.SetParentRow(parent1Row, relation2);
+                               Fail ("Must throw InvalidConstaintException");
+                       } catch (InvalidConstraintException e) {
+                       }
+                       AssertEquals (DBNull.Value, childRow1[childColumn1]);
+                       AssertEquals (DBNull.Value, childRow1[childColumn2]);
+
+                       childRow1.SetParentRow(parent1Row, relation1);
+                       AssertEquals ("p1c1", childRow1[childColumn1]);
+                       AssertEquals (DBNull.Value, childRow1[childColumn2]);
+
+
+                       childRow1.SetParentRow (null, relation2);
+                       AssertEquals ("p1c1", childRow1[childColumn1]);
+                       AssertEquals (DBNull.Value, childRow1[childColumn2]);
+
+                       childRow1.SetParentRow (null, relation1);
+                       AssertEquals (DBNull.Value, childRow1[childColumn1]);
+                       AssertEquals (DBNull.Value, childRow1[childColumn2]);
+               }
+
+               [Test]
+               public void SetParent_missing_ParentRow ()
+               {
+                       var ds = new DataSet() ;
+
+                       var     child                   = ds.Tables.Add("child") ;
+
+                       var     childColumn1    = child.Columns.Add("column1");
+                       var     childColumn2    = child.Columns.Add("column2");
+
+                       var     parent1                 = ds.Tables.Add("parent1");
+                       var     parentColumn1   = parent1.Columns.Add("column1");
+
+                       var     parent2                 = ds.Tables.Add("parent2");
+                       var     parentColumn2   = parent2.Columns.Add("column2");
+
+                       ds.Relations.Add("parent1-child", parentColumn1, childColumn1);
+                       ds.Relations.Add("parent2-child", parentColumn2, childColumn2);
+
+                       var childRow = child.NewRow();
+                       var parentRow = parent2.NewRow();
+
+                       parentRow[parentColumn2] = "value";
+
+                       child.Rows.Add(childRow);
+                       parent2.Rows.Add(parentRow);
+
+                       childRow.SetParentRow(parentRow);
+                       AssertEquals (DBNull.Value, childRow[childColumn1]);
+                       AssertEquals ("value", childRow[childColumn2]);
+               }
+
        }
 }
index 6a63a23207ea76380733151f69a4987b4db4bcd6..a8d26bdae3b2019f7d4381a23ec00c4829c1d638 100644 (file)
@@ -801,13 +801,14 @@ namespace MonoTests.System.Data
                        dataSet1.Tables.Add(table);\r
                        table.LoadDataRow(new object[]{1, "One"}, false);\r
                        table.LoadDataRow(new object[]{2, "Two"}, false);\r
+                       string file = Path.Combine (Path.GetTempPath (), "schemas-test.xml");\r
                        try {\r
-                               dataSet1.WriteXml("Test/System.Data/schemas/test.xml", XmlWriteMode.WriteSchema);\r
+                               dataSet1.WriteXml (file, XmlWriteMode.WriteSchema);\r
                        }\r
                        catch (Exception ex) {\r
                                Assert.Fail ("DSExtPropTest failed: WriteXml failed with : "+ex.Message);\r
                        } finally {\r
-                               File.Delete ("Test/System.Data/schemas/test.xml");\r
+                               File.Delete (file);\r
                        }\r
                        \r
                        DataSet dataSet2 = new DataSet();\r
index fe6701a579ede5b6c267595d56773a8fecf9c440..27df0f589849c36eb477a933314db4f1f253993c 100644 (file)
@@ -37,6 +37,7 @@ using MonoTests.System.Data.Utils;
 using System.Xml;
 using System.Runtime.Serialization;
 using System.Runtime.Serialization.Formatters.Binary;
+using System.Globalization;
 
 namespace MonoTests_System.Data
 {
@@ -985,6 +986,17 @@ namespace MonoTests_System.Data
                        Assert.AreEqual(culInfo , ds.Locale , "DS157");
                }
 
+               [Test]
+               [SetCulture ("cs-CZ")]
+               public void DataSetSpecificCulture ()
+               {                       
+                       var ds = new DataSet() ;
+                       ds.Locale = CultureInfo.GetCultureInfo (1033);
+                       var dt = ds.Tables.Add ("machine");
+                       dt.Locale = ds.Locale;
+                       Assert.AreSame (dt, ds.Tables["MACHINE"]);
+               }               
+
                [Test] public void MergeFailed()
                {
                        EventRaised = false;
@@ -2022,7 +2034,7 @@ namespace MonoTests_System.Data
 
                [Test] public void ReadXmlSchema_ByFileName()
                {
-                       string sTempFileName = "tmpDataSet_ReadWriteXml_43899.xml"  ;
+                       string sTempFileName = Path.Combine (Path.GetTempPath (), "tmpDataSet_ReadWriteXml_43899.xml");
 
                        DataSet ds1 = new DataSet();
                        ds1.Tables.Add(DataProvider.CreateParentDataTable());
index d41235ef4b3f9c441d409d9d71642c36a5976658..d752df4f1ac2c291267ff18e0a7ff3f7c12aaaee 100644 (file)
@@ -3091,8 +3091,8 @@ namespace MonoTests.System.Data
                [Test]
                public void ReadWriteXmlSchema_ByFileName ()
                {
-                       string sTempFileName1 = "tmpDataSet_ReadWriteXml_43899-1.xml";
-                       string sTempFileName2 = "tmpDataSet_ReadWriteXml_43899-2.xml";
+                       string sTempFileName1 = Path.Combine (Path.GetTempPath (), "tmpDataSet_ReadWriteXml_43899-1.xml");
+                       string sTempFileName2 = Path.Combine (Path.GetTempPath (), "tmpDataSet_ReadWriteXml_43899-2.xml");
 
                        DataSet ds1 = new DataSet ();
                        ds1.Tables.Add (DataProvider.CreateParentDataTable ());
index eb336f70d87b43a048592bfa00181f251b22b19b..68004b990133bdb3f1956725e540b8fcc320f63c 100644 (file)
@@ -308,7 +308,7 @@ namespace System.Net.Http
                                        }
                                }
 
-                               var stream = wrequest.GetRequestStream ();
+                               var stream = await wrequest.GetRequestStreamAsync ().ConfigureAwait (false);
                                await request.Content.CopyToAsync (stream).ConfigureAwait (false);
                        }
 
index e6395385c1b41aa8798c4dcdece97d44cc3746fd..d56ecc9c089141149ac55cb6fb607415eb0020ef 100644 (file)
@@ -23,12 +23,12 @@ RESOURCES = $(RESX_RESOURCES)
 PREBUILT = $(RESX_RESOURCES:=.prebuilt)
 
 ifeq (2.1, $(FRAMEWORK_VERSION))
-LIB_MCS_FLAGS += -d:NO_TASK_DELAY
+LIB_MCS_FLAGS += -d:NO_TASK_DELAY -d:HAS_AWAIT
 endif
 
 NET_4_5 := $(filter 4.5, $(FRAMEWORK_VERSION))
 ifdef NET_4_5
-LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC
+LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC -d:HAS_AWAIT
 endif
 
 TEST_MCS_FLAGS = $(LIB_MCS_FLAGS)
index 65d30c049ba6fdb0d50cc4d9083fc485f588f5b9..8c6dee9af40207a26fe02edc69c121ed6d1292b0 100644 (file)
@@ -12,12 +12,12 @@ LIB_MCS_FLAGS = \
                -r:System.Reactive.Linq.dll
 
 ifeq (2.1, $(FRAMEWORK_VERSION))
-LIB_MCS_FLAGS += -d:NO_TASK_DELAY
+LIB_MCS_FLAGS += -d:NO_TASK_DELAY -d:HAS_AWAIT
 endif
 
 NET_4_5 := $(filter 4.5, $(FRAMEWORK_VERSION))
 ifdef NET_4_5
-LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC
+LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC -d:HAS_AWAIT
 endif
 
 TEST_MCS_FLAGS = $(LIB_MCS_FLAGS)
index 966b95daff9a43e63db6640e93b20e32d99ba172..e7b128f3813acfa295c09e97bdde638075c55f04 100644 (file)
@@ -12,12 +12,12 @@ LIB_MCS_FLAGS = \
                -r:System.Reactive.Linq.dll
 
 ifeq (2.1, $(FRAMEWORK_VERSION))
-LIB_MCS_FLAGS += -d:NO_TASK_DELAY
+LIB_MCS_FLAGS += -d:NO_TASK_DELAY -d:HAS_AWAIT
 endif
 
 NET_4_5 := $(filter 4.5, $(FRAMEWORK_VERSION))
 ifdef NET_4_5
-LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC
+LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC -d:HAS_AWAIT
 endif
 
 TEST_MCS_FLAGS = $(LIB_MCS_FLAGS)
index b001529523d0f4a1cf51c57746625c794b3c4585..967a34327dedc252bce24e7128581e54bc2fbb1c 100644 (file)
@@ -9,12 +9,12 @@ LIB_MCS_FLAGS = \
                -r:System.Core.dll
 
 ifeq (2.1, $(FRAMEWORK_VERSION))
-LIB_MCS_FLAGS += -d:NO_TASK_DELAY
+LIB_MCS_FLAGS += -d:NO_TASK_DELAY -d:HAS_AWAIT
 endif
 
 NET_4_5 := $(filter 4.5, $(FRAMEWORK_VERSION))
 ifdef NET_4_5
-LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC
+LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC -d:HAS_AWAIT
 endif
 
 TEST_MCS_FLAGS = $(LIB_MCS_FLAGS)
index 690aa82dbc5e38df7fc53a798e2baf3d511d469e..3afa5560431d689a6389bafd2c99f783b123ce06 100644 (file)
@@ -24,12 +24,12 @@ RESOURCES = $(RESX_RESOURCES)
 PREBUILT = $(RESX_RESOURCES:=.prebuilt)
 
 ifeq (2.1, $(FRAMEWORK_VERSION))
-LIB_MCS_FLAGS += -d:NO_TASK_DELAY
+LIB_MCS_FLAGS += -d:NO_TASK_DELAY -d:HAS_AWAIT
 endif
 
 NET_4_5 := $(filter 4.5, $(FRAMEWORK_VERSION))
 ifdef NET_4_5
-LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC
+LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC -d:HAS_AWAIT
 endif
 
 TEST_MCS_FLAGS = $(LIB_MCS_FLAGS)
index e8b78f2d3bba873857f86db5c98ffdfd4fad0b8e..80e88566ca6d2b1006b7e4a20d63e4097ccff13a 100644 (file)
@@ -25,12 +25,12 @@ RESOURCES = $(RESX_RESOURCES)
 PREBUILT = $(RESX_RESOURCES:=.prebuilt)
 
 ifeq (2.1, $(FRAMEWORK_VERSION))
-LIB_MCS_FLAGS += -d:NO_TASK_DELAY
+LIB_MCS_FLAGS += -d:NO_TASK_DELAY -d:HAS_AWAIT
 endif
 
 NET_4_5 := $(filter 4.5, $(FRAMEWORK_VERSION))
 ifdef NET_4_5
-LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC
+LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC -d:HAS_AWAIT
 endif
 
 NO_TASK_DELAY := $(filter 4.5 2.1, $(FRAMEWORK_VERSION))
index 44088a17101c830f8e70d80864bbd4bd9ba46de2..06ec402a0df5d5c058ce2fedfeb1b411c0bc9ace 100644 (file)
@@ -25,12 +25,12 @@ RESOURCES = $(RESX_RESOURCES)
 PREBUILT = $(RESX_RESOURCES:=.prebuilt)
 
 ifeq (2.1, $(FRAMEWORK_VERSION))
-LIB_MCS_FLAGS += -d:NO_TASK_DELAY
+LIB_MCS_FLAGS += -d:NO_TASK_DELAY -d:HAS_AWAIT
 endif
 
 NET_4_5 := $(filter 4.5, $(FRAMEWORK_VERSION))
 ifdef NET_4_5
-LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC
+LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC -d:HAS_AWAIT
 endif
 
 TEST_MCS_FLAGS = $(LIB_MCS_FLAGS)
index deaf483c32776a66c99eb9a5ea0c47bca18ac18e..e5fbf287ad261a8568c4a08ba84d2029acdf1a60 100644 (file)
@@ -17,7 +17,7 @@ endif
 
 NET_4_5 := $(filter 4.5, $(FRAMEWORK_VERSION))
 ifdef NET_4_5
-LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC
+LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC -d:HAS_AWAIT
 endif
 
 TEST_MCS_FLAGS = $(LIB_MCS_FLAGS)
index 63b3fe0f4a529541c664f7111fd81fbb45896f7a..bc427b92a19e358efaa0acc2e53a41d36f646e31 100644 (file)
@@ -13,12 +13,12 @@ LIB_MCS_FLAGS = \
                -r:System.Windows.Forms.dll
 
 ifeq (2.1, $(FRAMEWORK_VERSION))
-LIB_MCS_FLAGS += -d:NO_TASK_DELAY
+LIB_MCS_FLAGS += -d:NO_TASK_DELAY -d:HAS_AWAIT
 endif
 
 NET_4_5 := $(filter 4.5, $(FRAMEWORK_VERSION))
 ifdef NET_4_5
-LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC
+LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC -d:HAS_AWAIT
 endif
 
 TEST_MCS_FLAGS = $(LIB_MCS_FLAGS)
index 8e1641a8cb5793371b6bb28fe38a255c74a1979f..dd68cd5a03bd484cf8d4d7447c057e7854ac4584 100644 (file)
@@ -26,12 +26,12 @@ RESOURCES = $(RESX_RESOURCES)
 PREBUILT = $(RESX_RESOURCES:=.prebuilt)
 
 ifeq (2.1, $(FRAMEWORK_VERSION))
-LIB_MCS_FLAGS += -d:NO_TASK_DELAY
+LIB_MCS_FLAGS += -d:NO_TASK_DELAY -d:HAS_AWAIT
 endif
 
 NET_4_5 := $(filter 4.5, $(FRAMEWORK_VERSION))
 ifdef NET_4_5
-LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC
+LIB_MCS_FLAGS += -d:HAS_EDI -d:PREFERASYNC -d:PREFER_ASYNC -d:HAS_AWAIT
 endif
 
 TEST_MCS_FLAGS = $(LIB_MCS_FLAGS)
index 9c0319d943382ef8b982633dbfe375cf037e64bf..2abb7663fed0fb002c3a3d00223a1fd65a5c9dec 100644 (file)
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-#if NET_2_0
 using System;
 using System.Collections;
 using System.IO;
+using System.Text;
 using System.Reflection;
 using System.Runtime.Serialization.Formatters.Binary;
 using System.Xml;
@@ -61,7 +61,9 @@ namespace System.Runtime.Serialization
 
                public virtual object ReadObject (Stream stream)
                {
-                       return ReadObject (XmlReader.Create (stream));
+                       var settings = new XmlReaderSettings ();
+                       settings.CheckCharacters = false;
+                       return ReadObject (XmlReader.Create (stream, settings));
                }
 
                public virtual object ReadObject (XmlReader reader)
@@ -86,7 +88,12 @@ namespace System.Runtime.Serialization
 
                public virtual void WriteObject (Stream stream, object graph)
                {
-                       using (XmlWriter xw = XmlDictionaryWriter.CreateTextWriter (stream)) {
+                       var settings = new XmlWriterSettings ();
+                       settings.Encoding = Encoding.UTF8;
+                       settings.CloseOutput = false;
+                       settings.OmitXmlDeclaration = true;
+                       settings.CheckCharacters = false;
+                       using (XmlWriter xw = XmlDictionaryWriter.CreateDictionaryWriter (XmlWriter.Create (stream, settings))) {
                                WriteObject (xw, graph);
                        }
                }
@@ -130,4 +137,3 @@ namespace System.Runtime.Serialization
                        XmlDictionaryWriter writer);
        }
 }
-#endif
index aa860040ea37f40861adb0f20c5fbf723d2c9467..9c52901aa8bac2b12b420ddf47f0cd41343119b6 100644 (file)
@@ -7,6 +7,7 @@ System.Runtime.Serialization/Bug695203Test.cs
 System.Runtime.Serialization/DataContractResolverTest.cs
 System.Runtime.Serialization/DataContractSerializerTest_DuplicateQName.cs
 System.Runtime.Serialization/DataContractSerializerTest_NullableWithDictionary.cs
+System.Runtime.Serialization/DataContractSerializerTest_InvalidCharacters.cs
 System.Runtime.Serialization/KnownTypeAttributeTest.cs
 System.Runtime.Serialization/XmlObjectSerializerTest.cs
 System.Runtime.Serialization/XsdDataContractExporterTest.cs
diff --git a/mcs/class/System.Runtime.Serialization/Test/System.Runtime.Serialization/DataContractSerializerTest_InvalidCharacters.cs b/mcs/class/System.Runtime.Serialization/Test/System.Runtime.Serialization/DataContractSerializerTest_InvalidCharacters.cs
new file mode 100644 (file)
index 0000000..260c3e3
--- /dev/null
@@ -0,0 +1,71 @@
+//
+// DataContractSerializerTest_InvalidCharacters.cs
+//
+// Author:
+//       Martin Baulig <martin.baulig@xamarin.com>
+//
+// Copyright (c) 2013 Xamarin Inc. (http://www.xamarin.com)
+//
+// 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.
+using System;
+using System.IO;
+using System.Text;
+using System.Runtime.Serialization;
+
+using NUnit.Framework;
+
+namespace MonoTests.System.Runtime.Serialization
+{
+       [TestFixture]
+       public class DataContractSerializerTest_InvalidCharacters
+       {
+               [Serializable]
+               public class MyData
+               {
+                       public string Text;
+               }
+
+               [Test]
+               public void Test ()
+               {
+                       var data = new MyData
+                       {
+                               Text = "Test " + ASCIIEncoding.ASCII.GetString (new byte[] { 0x06 })
+                       };
+
+                       var serializer = new DataContractSerializer (typeof(MyData), "MyData", string.Empty);
+
+                       string serialized;
+                       using (var ms = new MemoryStream ()) {
+                               serializer.WriteObject (ms, data);
+                               serialized = new string (Encoding.UTF8.GetChars (ms.GetBuffer ()));
+
+                               Assert.IsTrue (serialized.Contains ("Test &#x6;"), "#1");
+
+                               ms.Seek (0, SeekOrigin.Begin);
+
+                               var data2 = (MyData)serializer.ReadObject (ms);
+                               Assert.AreEqual (data2.Text.Length, 6, "#2");
+                               Assert.AreEqual (data2.Text [5], (char)0x06, "#3");
+                       }
+               }
+
+               
+       }
+}
index a2b66f4176d3331c5208e560d15f928f8142e032..e25a680e0019c0191272684b7e41b17ce4f2e2dc 100755 (executable)
@@ -81,7 +81,7 @@ namespace MonoTests.System.Runtime.Serialization
                public void ConstructorKnownTypesNull ()
                {
                        // null knownTypes is allowed. Though the property is filled.
-                       Assert.IsNotNull (new DataContractSerializer (typeof (Sample1), null).KnownTypes, "#1");
+                       Assert.IsNotNull (new DataContractSerializer (typeof (Sample1), (IEnumerable<Type>)null).KnownTypes, "#1");
                        Assert.IsNotNull (new DataContractSerializer (typeof (Sample1), "Foo", String.Empty, null).KnownTypes, "#2");
                        Assert.IsNotNull (new DataContractSerializer (typeof (Sample1), new XmlDictionary ().Add ("Foo"), XmlDictionaryString.Empty, null).KnownTypes, "#3");
                }
index f58657f7769ee862db58fec73973c7957b1c15c5..97c88830976542ee11ec081e577b11c4366d5d9a 100644 (file)
@@ -15,7 +15,8 @@ TEST_MCS_FLAGS = $(LIB_MCS_FLAGS)
 
 EXTRA_DISTFILES = $(RESOURCE_FILES) \
        Test/config/webHttpBinding \
-       Test/config/webHttpBinding.config
+       Test/config/webHttpBinding.config \
+       System.Runtime.Serialization.Json/DataContractJsonSerializerSettings.cs
 
 VALID_PROFILE := $(filter 2 4, $(FRAMEWORK_VERSION_MAJOR))
 ifndef VALID_PROFILE
index 0fe6bbfd0d5f0d8c764b6e66b3c3eb7aeb904499..50ae808fcbd680be813ba1b64265e5abb64379ad 100644 (file)
@@ -38,7 +38,7 @@ namespace System.ServiceModel.Channels
 {
        internal class HttpChannelFactory<TChannel> : TransportChannelFactoryBase<TChannel>
        {
-#if NET_2_1
+#if NET_2_1 || NET_4_0
                IHttpCookieContainerManager cookie_manager;
 #endif
 
@@ -50,12 +50,16 @@ namespace System.ServiceModel.Channels
                                MessageEncodingBindingElement mbe = be as MessageEncodingBindingElement;
                                if (mbe != null) {
                                        MessageEncoder = CreateEncoder<TChannel> (mbe);
-                                       break;
+                                       continue;
                                }
 #if NET_2_1
                                var cbe = be as HttpCookieContainerBindingElement;
                                if (cbe != null)
                                        cookie_manager = cbe.GetProperty<IHttpCookieContainerManager> (ctx);
+#elif NET_4_0
+                               var tbe = be as HttpTransportBindingElement;
+                               if (tbe != null)
+                                       cookie_manager = tbe.GetProperty<IHttpCookieContainerManager> (ctx);
 #endif
                        }
                        if (MessageEncoder == null)
@@ -109,7 +113,7 @@ namespace System.ServiceModel.Channels
 
                public override T GetProperty<T> ()
                {
-#if NET_2_1
+#if NET_2_1 || NET_4_0
                        if (cookie_manager is T)
                                return (T) (object) cookie_manager;
 #endif
index d718bfb467a2381a9001cc534d70bd1787e708d2..b9dc0ab748df237b0440160306389619cf1b2caa 100644 (file)
@@ -4,6 +4,9 @@ using System.ServiceModel;
 
 namespace System.ServiceModel.Channels
 {
+#if NET_4_0
+       [Obsolete ("Use AllowCookies.")]
+#endif
        public class HttpCookieContainerBindingElement : BindingElement
        {
                HttpCookieContainerManager manager;
index ff5d658f39fc7cad5d3e0eac157fd4baa121080c..e209ec8062b37a374ac7b6a661e66d5072a0d2b3 100644 (file)
@@ -90,11 +90,11 @@ namespace System.ServiceModel.Channels
                        result.WebRequest = web_request;
                        web_request.Method = "POST";
                        web_request.ContentType = Encoder.ContentType;
-#if NET_2_1
+#if NET_2_1 || NET_4_0
                        HttpWebRequest hwr = (web_request as HttpWebRequest);
-                               var cmgr = source.GetProperty<IHttpCookieContainerManager> ();
-                               if (cmgr != null)
-                                       hwr.CookieContainer = cmgr.CookieContainer;
+                       var cmgr = source.GetProperty<IHttpCookieContainerManager> ();
+                       if (cmgr != null)
+                               hwr.CookieContainer = cmgr.CookieContainer;
 #endif
 
                        // client authentication (while SL3 has NetworkCredential class, it is not implemented yet. So, it is non-SL only.)
index 2c6b082867592bb770b231f7fcce7b9d7e603784..84388adcb087a721ba4997cc371084baa54be586 100644 (file)
@@ -62,6 +62,9 @@ namespace System.ServiceModel.Channels
                AuthenticationSchemes proxy_auth_scheme =
                        AuthenticationSchemes.Anonymous;
                // If you add fields, do not forget them in copy constructor.
+#if NET_4_0
+               HttpCookieContainerManager cookie_manager;
+#endif
 
                public HttpTransportBindingElement ()
                {
@@ -90,6 +93,7 @@ namespace System.ServiceModel.Channels
                        DecompressionEnabled = other.DecompressionEnabled;
                        LegacyExtendedProtectionPolicy = other.LegacyExtendedProtectionPolicy;
                        ExtendedProtectionPolicy = other.ExtendedProtectionPolicy;
+                       cookie_manager = other.cookie_manager;
 #endif
                }
 
@@ -257,6 +261,15 @@ namespace System.ServiceModel.Channels
                                return (T) (object) new HttpBindingProperties (this);
                        if (typeof (T) == typeof (TransferMode))
                                return (T) (object) TransferMode;
+#if NET_4_0
+                       if (typeof(T) == typeof(IHttpCookieContainerManager)) {
+                               if (!AllowCookies)
+                                       return null;
+                               if (cookie_manager == null)
+                                       cookie_manager = new HttpCookieContainerManager ();
+                               return (T) (object) cookie_manager;
+                       }
+#endif
                        return base.GetProperty<T> (context);
                }
                
index e016772f0b504c25bd260c28d7a329bbf4d522d6..b14d7a2290b9cd944fcd8e8626d14b884e10b772 100644 (file)
@@ -1,3 +1,4 @@
+#if NET_2_1 || NET_4_0
 using System;
 using System.Net;
 
@@ -9,3 +10,4 @@ namespace System.ServiceModel.Channels
                CookieContainer CookieContainer { get; set; }
        }
 }
+#endif
index 0ff234382a2e71750bcc894e33a008b7f56d9ab8..89d971656ff844c0604e758fa2e3cbcaf547603a 100644 (file)
@@ -66,12 +66,14 @@ namespace System.ServiceModel.Channels
                {
                        if (bufferManager == null)
                                throw new ArgumentNullException ("bufferManager");
+                       var settings = new XmlReaderSettings ();
+                       settings.CheckCharacters = false;
                        var ret = Message.CreateMessage (
                                XmlDictionaryReader.CreateDictionaryReader (
                                        XmlReader.Create (new StreamReader (
                                                new MemoryStream (
                                                buffer.Array, buffer.Offset,
-                                               buffer.Count), encoding))),
+                                               buffer.Count), encoding), settings)),
                                // FIXME: supply max header size
                                int.MaxValue,
                                version);
@@ -84,9 +86,11 @@ namespace System.ServiceModel.Channels
                {
                        if (stream == null)
                                throw new ArgumentNullException ("stream");
+                       var settings = new XmlReaderSettings ();
+                       settings.CheckCharacters = false;
                        var ret = Message.CreateMessage (
                                XmlDictionaryReader.CreateDictionaryReader (
-                                       XmlReader.Create (new StreamReader (stream, encoding))),
+                                       XmlReader.Create (new StreamReader (stream, encoding), settings)),
                                maxSizeOfHeaders,
                                version);
                        ret.Properties.Encoder = this;
@@ -113,6 +117,7 @@ namespace System.ServiceModel.Channels
 
                        XmlWriterSettings s = new XmlWriterSettings ();
                        s.Encoding = encoding;
+                       s.CheckCharacters = false;
                        using (XmlWriter w = XmlWriter.Create (stream, s)) {
                                message.WriteMessage (
                                        XmlDictionaryWriter.CreateDictionaryWriter (w));
@@ -131,6 +136,7 @@ namespace System.ServiceModel.Channels
                                messageOffset, maxMessageSize);
                        XmlWriterSettings s = new XmlWriterSettings ();
                        s.Encoding = encoding;
+                       s.CheckCharacters = false;
                        using (XmlWriter w = XmlWriter.Create (
                                new MemoryStream (seg.Array, seg.Offset, seg.Count), s)) {
                                message.WriteMessage (
index 5b0f404f090cbf7cf75979b127eeb77d5e0f83f3..4feebc7a115d7a98ceb6ef70cefc67d83f62c679 100644 (file)
@@ -98,7 +98,15 @@ namespace System.ServiceModel
                }
 
 #if NET_2_1
-               public bool EnableHttpCookieContainer { get; set; }
+               public bool EnableHttpCookieContainer {
+                       get; set;
+               }
+#elif NET_4_5
+               [Obsolete ("Use AllowCookies.")]
+               public bool EnableHttpCookieContainer {
+                       get { return AllowCookies; }
+                       set { AllowCookies = value; }
+               }
 #endif
 
                public HostNameComparisonMode HostNameComparisonMode {
index 5e15c5a72bee4bcb66bcc2470d9fd8553e80fa83..442a33113f543c1ee0fae0fc83a71ec0e4ab94af 100644 (file)
@@ -282,7 +282,7 @@ namespace System.ServiceModel
                public T GetProperty<T> () where T : class
                {
                        if (OpenedChannelFactory != null)
-                               OpenedChannelFactory.GetProperty<T> ();
+                               return OpenedChannelFactory.GetProperty<T> ();
                        return null;
                }
 
index fafcd01f62bb16e0276220185b38407334c0ae7b..742c71e6d14d6112fca75470ed0f661dd7e21407 100644 (file)
@@ -224,6 +224,11 @@ namespace MonoTests.System.ServiceModel.Description
                }
 
                [Test]
+               [Category ("NotWorking")]
+               // System.Xml.Schema.XmlSchemaException : XmlSchema error: Named item
+               // http://schemas.datacontract.org/2004/07/System.Reflection:ArrayOfTypeInfo was already contained
+               // in the schema object table. Consider setting MONO_STRICT_MS_COMPLIANT to 'yes' to mimic
+               // MS implementation. Related schema item SourceUri: , Line 0, Position 0.
                public void ExportMessageContract ()
                {
                        WsdlExporter we = new WsdlExporter ();
index f8b48c78c8388b1483b8cce3f1effdfc43bc849e..9a588704229f82a800f9096d12a3cfcc813f9982 100644 (file)
@@ -2,6 +2,9 @@
 ../../build/common/MonoTODOAttribute.cs
 #include System.ServiceModel.dll.sources
 
+System.ServiceModel.Channels/IHttpCookieContainer.cs
+System.ServiceModel.Channels/HttpCookieContainerBindingElement.cs
+
 ../System.ServiceModel.Web/System.ServiceModel.Syndication/Atom10FeedFormatter.cs
 ../System.ServiceModel.Web/System.ServiceModel.Syndication/Atom10FeedFormatter_1.cs
 ../System.ServiceModel.Web/System.ServiceModel.Syndication/Atom10ItemFormatter.cs
diff --git a/mcs/class/System.Web.Http.WebHost/Makefile b/mcs/class/System.Web.Http.WebHost/Makefile
new file mode 100644 (file)
index 0000000..0a898cf
--- /dev/null
@@ -0,0 +1,23 @@
+thisdir = class/System.Web.Http.WebHost        
+SUBDIRS = 
+include ../../build/rules.make
+
+LIBRARY = System.Web.Http.WebHost.dll
+
+System.Web.Http.WebHost.Properties.CommonWebApiResources.resources: ../../../external/aspnetwebstack/src/Common/CommonWebApiResources.resx
+       $(RESGEN) "$<" "$@"
+       
+System.Web.Http.WebHost.Properties.SRResources.resources: ../../../external/aspnetwebstack/src/System.Web.Http.WebHost/Properties/SRResources.resx
+       $(RESGEN) "$<" "$@"
+
+
+LIB_MCS_FLAGS = -r:System.Core.dll -r:System.dll -r:System.Xml.dll -r:System.Configuration.dll -r:System.Net.Http.dll \
+               -r:System.Runtime.Serialization.dll -r:System.ServiceModel.dll -r:System.IdentityModel.dll \
+               -r:System.Web.Http.dll -r:System.Net.Http.Formatting.dll  -r:System.Web.Routing.dll -r:System.Web.dll \
+        -r:Microsoft.Web.Infrastructure.dll \
+               -d:ASPNETMVC -keyfile:../winfx.pub -delaysign
+
+include ../../build/library.make
+
+$(the_lib): System.Web.Http.WebHost.Properties.CommonWebApiResources.resources \
+       System.Web.Http.WebHost.Properties.SRResources.resources
diff --git a/mcs/class/System.Web.Http.WebHost/System.Web.Http.WebHost.dll.sources b/mcs/class/System.Web.Http.WebHost/System.Web.Http.WebHost.dll.sources
new file mode 100644 (file)
index 0000000..a71b88d
--- /dev/null
@@ -0,0 +1,32 @@
+../../../external/aspnetwebstack/src/CommonAssemblyInfo.cs
+../../../external/aspnetwebstack/src/TransparentCommonAssemblyInfo.cs
+
+../../../external/aspnetwebstack/src/Common/DictionaryExtensions.cs
+../../../external/aspnetwebstack/src/Common/Error.cs
+../../../external/aspnetwebstack/src/Common/HttpMethodHelper.cs
+../../../external/aspnetwebstack/src/Common/TaskHelpers.cs
+../../../external/aspnetwebstack/src/Common/TaskHelpersExtensions.cs
+../../../external/aspnetwebstack/src/Common/CommonWebApiResources.Designer.cs
+
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/GlobalConfiguration.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/GlobalSuppressions.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/HttpControllerHandler.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/HttpControllerRouteHandler.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/HttpControllerTypeCacheSerializer.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/PreApplicationStartCode.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/Properties/SRResources.Designer.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/Properties/AssemblyInfo.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/RouteCollectionExtensions.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/Routing/HostedHttpRouteCollection.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/Routing/HostedHttpVirtualPathData.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/Routing/HttpContextBaseExtensions.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/Routing/HostedHttpRouteData.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/Routing/HttpRouteExtensions.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/Routing/HttpRouteDataExtensions.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/Routing/HttpWebRoute.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/Routing/HostedHttpRoute.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/SuppressFormsAuthRedirectModule.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/TaskWrapperAsyncResult.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/WebHostAssembliesResolver.cs
+../../../external/aspnetwebstack/src/System.Web.Http.WebHost/WebHostHttpControllerTypeResolver.cs
+
index 99fe6c62b0df8c072c2cf370fcb83b016ff37b45..a0c0489d7017db62fa427059ba04759fc30253ba 100644 (file)
@@ -59,7 +59,7 @@ namespace MonoTests.System.Web.Services.Description
                [Test]
                public void Namespaces ()
                {
-                       FileStream fs = new FileStream ("Test/System.Web.Services.Description/test.wsdl", FileMode.Open);
+                       FileStream fs = new FileStream ("Test/System.Web.Services.Description/test.wsdl", FileMode.Open, FileAccess.Read);
                        XmlTextReader xtr = new XmlTextReader (fs);
 
                        ServiceDescription sd = ServiceDescription.Read (xtr);
@@ -84,7 +84,7 @@ namespace MonoTests.System.Web.Services.Description
                [Test]
                public void ExtensibleAttributes ()
                {
-                   FileStream fs = new FileStream("Test/System.Web.Services.Description/test.wsdl", FileMode.Open);
+                   FileStream fs = new FileStream ("Test/System.Web.Services.Description/test.wsdl", FileMode.Open, FileAccess.Read);
                    XmlTextReader xtr = new XmlTextReader(fs);
 
                    ServiceDescription sd = ServiceDescription.Read(xtr);
@@ -105,7 +105,7 @@ namespace MonoTests.System.Web.Services.Description
                [Test]
                public void Extensions ()
                {
-                   FileStream fs = new FileStream("Test/System.Web.Services.Description/test.wsdl", FileMode.Open);
+                       FileStream fs = new FileStream("Test/System.Web.Services.Description/test.wsdl", FileMode.Open, FileAccess.Read);
                    XmlTextReader xtr = new XmlTextReader(fs);
 
                    ServiceDescription sd = ServiceDescription.Read(xtr);
index 779c8bd1e1ea3de3d279be722c5b3c4ba63d7c23..8ae833f9dcc623e4cf598cb7c7736764ecdc047e 100644 (file)
@@ -586,7 +586,7 @@ namespace MonoTests.System.Xml
                public void TestResolveUri ()
                {
                        XmlSchemaSet schemaSet = new XmlSchemaSet ();
-                       FileStream stream = new FileStream ("Test/XmlFiles/xsd/resolveUriSchema.xsd", FileMode.Open);
+                       FileStream stream = new FileStream ("Test/XmlFiles/xsd/resolveUriSchema.xsd", FileMode.Open, FileAccess.Read);
                        schemaSet.Add ("http://tempuri.org/resolveUriSchema.xsd", new XmlTextReader (stream));
 
                        XmlTestResolver resolver = new XmlTestResolver ();              
index 751242425ccbb4a706dc2bd24c6d8c464b7cf5ae..9e1c9f2b52e500ab541eec8e6a05a50406ea80a8 100644 (file)
@@ -1639,18 +1639,19 @@ namespace MonoTests.System.XmlSerialization
                [Test]
                public void Bug708178Type()
                {
+                       string file = Path.Combine (Path.GetTempPath (), "Bug708178Type.xml");
                        XmlSerializer xmlSerializer = new XmlSerializer (typeof(Bug708178Type));
                        Bug708178Type bugType = new Bug708178Type ();
                        bugType.Foo.Add ("test");
                        Assert.AreEqual (1, bugType.Foo.Count);
                 
                        //xml Serialize
-                       TextWriter WriteFileStream = new StreamWriter (@"Bug708178Type.xml", false);
+                       TextWriter WriteFileStream = new StreamWriter (file, false);
                        xmlSerializer.Serialize (WriteFileStream, bugType);
                        WriteFileStream.Close ();
                 
                        //xml Deserialize
-                       FileStream ReadFileStream = new FileStream (@"Bug708178Type.xml", FileMode.Open, FileAccess.Read, FileShare.Read);
+                       FileStream ReadFileStream = new FileStream (file, FileMode.Open, FileAccess.Read, FileShare.Read);
                        Bug708178Type bugTypeReload = (Bug708178Type)xmlSerializer.Deserialize (ReadFileStream);
                 
                        //should have deserialized the relationship
index 18cef9df4860bf0b7a921298714d6c6acc76b1bd..b276342806c1743a75280bfd13d3a79a0eedb38a 100644 (file)
@@ -36,10 +36,11 @@ namespace MonoTests.System.Xml.Xsl
                [Test]
                public void TestBasicTransform ()
                {
+                       string output = Path.Combine (Path.GetTempPath (), "result.xml");
                        doc.LoadXml ("<root/>");
                        xslt.Load ("Test/XmlFiles/xsl/empty.xsl");
-                       xslt.Transform ("Test/XmlFiles/xsl/empty.xsl", "Test/XmlFiles/xsl/result.xml");
-                       result.Load ("Test/XmlFiles/xsl/result.xml");
+                       xslt.Transform ("Test/XmlFiles/xsl/empty.xsl", output);
+                       result.Load (output);
                        Assert.AreEqual (2, result.ChildNodes.Count, "count");
                }
 
index 8f522a85e56a00cb2fed3a09dabf1d5ff5e14f0d..749e601abdaa53a98fce481c4c7cd278bb66a154 100644 (file)
@@ -1540,7 +1540,7 @@ namespace MonoTests.System.Xml
                // a bit revised version of bug #78706\r
                public void CreateFromUrlClose ()\r
                {\r
-                       string file = "Test/XmlFiles/78706.xml";\r
+                       string file = Path.Combine (Path.GetTempPath (), "78706.xml");\r
                        try {\r
                                if (!File.Exists (file))\r
                                        File.Create (file).Close ();\r
@@ -1560,7 +1560,7 @@ namespace MonoTests.System.Xml
                // a bit revised version of bug #385638\r
                public void CreateFromUrlClose2 ()\r
                {\r
-                       string file = "Test/XmlFiles/385638.xml";\r
+                       string file = Path.Combine (Path.GetTempPath (), "385638.xml");\r
                        try {\r
                                if (File.Exists (file))\r
                                        File.Delete (file);\r
index 552060abdffb8d28cc9ed5af3dc994dbf25a1926..1dc3d5584ce8b94f3f10e55c3c9961c4abe70f89 100644 (file)
@@ -820,18 +820,20 @@ namespace MonoTests.System.Xml
                // imported testcase from sys.security which had regression.\r
                public void ResolveEntityAndBaseURI ()\r
                {\r
+                       string world = Path.Combine (Path.GetTempPath (), "world.txt");\r
+                       string dtd = Path.Combine (Path.GetTempPath (), "doc.dtd");\r
                        try {\r
-                               using (TextWriter w = File.CreateText ("world.txt")) {\r
+                               using (TextWriter w = File.CreateText (world)) {\r
                                        w.WriteLine ("world");\r
                                }\r
-                               using (TextWriter w = File.CreateText ("doc.dtd")) {\r
+                               using (TextWriter w = File.CreateText (dtd)) {\r
                                        w.WriteLine ("<!-- dummy -->");\r
                                }\r
 \r
-                               string xml =  "<!DOCTYPE doc SYSTEM \"doc.dtd\" [\n" +\r
+                               string xml = String.Format ("<!DOCTYPE doc SYSTEM \"{1}\" [\n" +\r
                                        "<!ATTLIST doc attrExtEnt ENTITY #IMPLIED>\n" +\r
                                        "<!ENTITY ent1 \"Hello\">\n" +\r
-                                       "<!ENTITY ent2 SYSTEM \"world.txt\">\n" +\r
+                                       "<!ENTITY ent2 SYSTEM \"{0}\">\n" +\r
                                        "<!ENTITY entExt SYSTEM \"earth.gif\" NDATA gif>\n" +\r
                                        "<!NOTATION gif SYSTEM \"viewgif.exe\">\n" +\r
                                        "]>\n" +\r
@@ -839,7 +841,8 @@ namespace MonoTests.System.Xml
                                        "   &ent1;, &ent2;!\n" +\r
                                        "</doc>\n" +\r
                                        "\n" +\r
-                                       "<!-- Let world.txt contain \"world\" (excluding the quotes) -->\n";\r
+                                       "<!-- Let world.txt contain \"world\" (excluding the quotes) -->\n",\r
+                                       world, dtd);\r
 \r
                                XmlValidatingReader xvr =\r
                                        new XmlValidatingReader (\r
@@ -851,10 +854,10 @@ namespace MonoTests.System.Xml
                                doc.Load (xvr);\r
 \r
                        } finally {\r
-                               if (File.Exists ("world.txt"))\r
-                                       File.Delete ("world.txt");\r
-                               if (File.Exists ("doc.dtd"))\r
-                                       File.Delete ("doc.dtd");\r
+                               if (File.Exists (world))\r
+                                       File.Delete (world);\r
+                               if (File.Exists (dtd))\r
+                                       File.Delete (dtd);\r
                        }\r
                }\r
 \r
index d5bb836f5743ed8aa24307bcefc520617a86a188..a39768c9a3a6df64eb8cd8834505b2e9ff724f46 100644 (file)
@@ -39,7 +39,7 @@ using System.Text;
 
 namespace System.Net {
 
-       internal sealed class HttpUtility
+       static class HttpUtility
        {
                sealed class HttpQSCollection : NameValueCollection
                {
@@ -58,291 +58,518 @@ namespace System.Net {
                                return sb.ToString ();
                        }
                }
-               #region Fields
-       
-               static Hashtable entities;
-               static object lock_ = new object ();
-       
-               #endregion // Fields
-       
-               static Hashtable Entities {
-                       get {
-                               lock (lock_) {
-                                       if (entities == null)
-                                               InitEntities ();
-
-                                       return entities;
-                               }
-                       }
-               }
-               
-               #region Constructors
 
-               static void InitEntities ()
-               {
-                       // Build the hash table of HTML entity references.  This list comes
-                       // from the HTML 4.01 W3C recommendation.
-                       entities = new Hashtable ();
-                       entities.Add ("nbsp", '\u00A0');
-                       entities.Add ("iexcl", '\u00A1');
-                       entities.Add ("cent", '\u00A2');
-                       entities.Add ("pound", '\u00A3');
-                       entities.Add ("curren", '\u00A4');
-                       entities.Add ("yen", '\u00A5');
-                       entities.Add ("brvbar", '\u00A6');
-                       entities.Add ("sect", '\u00A7');
-                       entities.Add ("uml", '\u00A8');
-                       entities.Add ("copy", '\u00A9');
-                       entities.Add ("ordf", '\u00AA');
-                       entities.Add ("laquo", '\u00AB');
-                       entities.Add ("not", '\u00AC');
-                       entities.Add ("shy", '\u00AD');
-                       entities.Add ("reg", '\u00AE');
-                       entities.Add ("macr", '\u00AF');
-                       entities.Add ("deg", '\u00B0');
-                       entities.Add ("plusmn", '\u00B1');
-                       entities.Add ("sup2", '\u00B2');
-                       entities.Add ("sup3", '\u00B3');
-                       entities.Add ("acute", '\u00B4');
-                       entities.Add ("micro", '\u00B5');
-                       entities.Add ("para", '\u00B6');
-                       entities.Add ("middot", '\u00B7');
-                       entities.Add ("cedil", '\u00B8');
-                       entities.Add ("sup1", '\u00B9');
-                       entities.Add ("ordm", '\u00BA');
-                       entities.Add ("raquo", '\u00BB');
-                       entities.Add ("frac14", '\u00BC');
-                       entities.Add ("frac12", '\u00BD');
-                       entities.Add ("frac34", '\u00BE');
-                       entities.Add ("iquest", '\u00BF');
-                       entities.Add ("Agrave", '\u00C0');
-                       entities.Add ("Aacute", '\u00C1');
-                       entities.Add ("Acirc", '\u00C2');
-                       entities.Add ("Atilde", '\u00C3');
-                       entities.Add ("Auml", '\u00C4');
-                       entities.Add ("Aring", '\u00C5');
-                       entities.Add ("AElig", '\u00C6');
-                       entities.Add ("Ccedil", '\u00C7');
-                       entities.Add ("Egrave", '\u00C8');
-                       entities.Add ("Eacute", '\u00C9');
-                       entities.Add ("Ecirc", '\u00CA');
-                       entities.Add ("Euml", '\u00CB');
-                       entities.Add ("Igrave", '\u00CC');
-                       entities.Add ("Iacute", '\u00CD');
-                       entities.Add ("Icirc", '\u00CE');
-                       entities.Add ("Iuml", '\u00CF');
-                       entities.Add ("ETH", '\u00D0');
-                       entities.Add ("Ntilde", '\u00D1');
-                       entities.Add ("Ograve", '\u00D2');
-                       entities.Add ("Oacute", '\u00D3');
-                       entities.Add ("Ocirc", '\u00D4');
-                       entities.Add ("Otilde", '\u00D5');
-                       entities.Add ("Ouml", '\u00D6');
-                       entities.Add ("times", '\u00D7');
-                       entities.Add ("Oslash", '\u00D8');
-                       entities.Add ("Ugrave", '\u00D9');
-                       entities.Add ("Uacute", '\u00DA');
-                       entities.Add ("Ucirc", '\u00DB');
-                       entities.Add ("Uuml", '\u00DC');
-                       entities.Add ("Yacute", '\u00DD');
-                       entities.Add ("THORN", '\u00DE');
-                       entities.Add ("szlig", '\u00DF');
-                       entities.Add ("agrave", '\u00E0');
-                       entities.Add ("aacute", '\u00E1');
-                       entities.Add ("acirc", '\u00E2');
-                       entities.Add ("atilde", '\u00E3');
-                       entities.Add ("auml", '\u00E4');
-                       entities.Add ("aring", '\u00E5');
-                       entities.Add ("aelig", '\u00E6');
-                       entities.Add ("ccedil", '\u00E7');
-                       entities.Add ("egrave", '\u00E8');
-                       entities.Add ("eacute", '\u00E9');
-                       entities.Add ("ecirc", '\u00EA');
-                       entities.Add ("euml", '\u00EB');
-                       entities.Add ("igrave", '\u00EC');
-                       entities.Add ("iacute", '\u00ED');
-                       entities.Add ("icirc", '\u00EE');
-                       entities.Add ("iuml", '\u00EF');
-                       entities.Add ("eth", '\u00F0');
-                       entities.Add ("ntilde", '\u00F1');
-                       entities.Add ("ograve", '\u00F2');
-                       entities.Add ("oacute", '\u00F3');
-                       entities.Add ("ocirc", '\u00F4');
-                       entities.Add ("otilde", '\u00F5');
-                       entities.Add ("ouml", '\u00F6');
-                       entities.Add ("divide", '\u00F7');
-                       entities.Add ("oslash", '\u00F8');
-                       entities.Add ("ugrave", '\u00F9');
-                       entities.Add ("uacute", '\u00FA');
-                       entities.Add ("ucirc", '\u00FB');
-                       entities.Add ("uuml", '\u00FC');
-                       entities.Add ("yacute", '\u00FD');
-                       entities.Add ("thorn", '\u00FE');
-                       entities.Add ("yuml", '\u00FF');
-                       entities.Add ("fnof", '\u0192');
-                       entities.Add ("Alpha", '\u0391');
-                       entities.Add ("Beta", '\u0392');
-                       entities.Add ("Gamma", '\u0393');
-                       entities.Add ("Delta", '\u0394');
-                       entities.Add ("Epsilon", '\u0395');
-                       entities.Add ("Zeta", '\u0396');
-                       entities.Add ("Eta", '\u0397');
-                       entities.Add ("Theta", '\u0398');
-                       entities.Add ("Iota", '\u0399');
-                       entities.Add ("Kappa", '\u039A');
-                       entities.Add ("Lambda", '\u039B');
-                       entities.Add ("Mu", '\u039C');
-                       entities.Add ("Nu", '\u039D');
-                       entities.Add ("Xi", '\u039E');
-                       entities.Add ("Omicron", '\u039F');
-                       entities.Add ("Pi", '\u03A0');
-                       entities.Add ("Rho", '\u03A1');
-                       entities.Add ("Sigma", '\u03A3');
-                       entities.Add ("Tau", '\u03A4');
-                       entities.Add ("Upsilon", '\u03A5');
-                       entities.Add ("Phi", '\u03A6');
-                       entities.Add ("Chi", '\u03A7');
-                       entities.Add ("Psi", '\u03A8');
-                       entities.Add ("Omega", '\u03A9');
-                       entities.Add ("alpha", '\u03B1');
-                       entities.Add ("beta", '\u03B2');
-                       entities.Add ("gamma", '\u03B3');
-                       entities.Add ("delta", '\u03B4');
-                       entities.Add ("epsilon", '\u03B5');
-                       entities.Add ("zeta", '\u03B6');
-                       entities.Add ("eta", '\u03B7');
-                       entities.Add ("theta", '\u03B8');
-                       entities.Add ("iota", '\u03B9');
-                       entities.Add ("kappa", '\u03BA');
-                       entities.Add ("lambda", '\u03BB');
-                       entities.Add ("mu", '\u03BC');
-                       entities.Add ("nu", '\u03BD');
-                       entities.Add ("xi", '\u03BE');
-                       entities.Add ("omicron", '\u03BF');
-                       entities.Add ("pi", '\u03C0');
-                       entities.Add ("rho", '\u03C1');
-                       entities.Add ("sigmaf", '\u03C2');
-                       entities.Add ("sigma", '\u03C3');
-                       entities.Add ("tau", '\u03C4');
-                       entities.Add ("upsilon", '\u03C5');
-                       entities.Add ("phi", '\u03C6');
-                       entities.Add ("chi", '\u03C7');
-                       entities.Add ("psi", '\u03C8');
-                       entities.Add ("omega", '\u03C9');
-                       entities.Add ("thetasym", '\u03D1');
-                       entities.Add ("upsih", '\u03D2');
-                       entities.Add ("piv", '\u03D6');
-                       entities.Add ("bull", '\u2022');
-                       entities.Add ("hellip", '\u2026');
-                       entities.Add ("prime", '\u2032');
-                       entities.Add ("Prime", '\u2033');
-                       entities.Add ("oline", '\u203E');
-                       entities.Add ("frasl", '\u2044');
-                       entities.Add ("weierp", '\u2118');
-                       entities.Add ("image", '\u2111');
-                       entities.Add ("real", '\u211C');
-                       entities.Add ("trade", '\u2122');
-                       entities.Add ("alefsym", '\u2135');
-                       entities.Add ("larr", '\u2190');
-                       entities.Add ("uarr", '\u2191');
-                       entities.Add ("rarr", '\u2192');
-                       entities.Add ("darr", '\u2193');
-                       entities.Add ("harr", '\u2194');
-                       entities.Add ("crarr", '\u21B5');
-                       entities.Add ("lArr", '\u21D0');
-                       entities.Add ("uArr", '\u21D1');
-                       entities.Add ("rArr", '\u21D2');
-                       entities.Add ("dArr", '\u21D3');
-                       entities.Add ("hArr", '\u21D4');
-                       entities.Add ("forall", '\u2200');
-                       entities.Add ("part", '\u2202');
-                       entities.Add ("exist", '\u2203');
-                       entities.Add ("empty", '\u2205');
-                       entities.Add ("nabla", '\u2207');
-                       entities.Add ("isin", '\u2208');
-                       entities.Add ("notin", '\u2209');
-                       entities.Add ("ni", '\u220B');
-                       entities.Add ("prod", '\u220F');
-                       entities.Add ("sum", '\u2211');
-                       entities.Add ("minus", '\u2212');
-                       entities.Add ("lowast", '\u2217');
-                       entities.Add ("radic", '\u221A');
-                       entities.Add ("prop", '\u221D');
-                       entities.Add ("infin", '\u221E');
-                       entities.Add ("ang", '\u2220');
-                       entities.Add ("and", '\u2227');
-                       entities.Add ("or", '\u2228');
-                       entities.Add ("cap", '\u2229');
-                       entities.Add ("cup", '\u222A');
-                       entities.Add ("int", '\u222B');
-                       entities.Add ("there4", '\u2234');
-                       entities.Add ("sim", '\u223C');
-                       entities.Add ("cong", '\u2245');
-                       entities.Add ("asymp", '\u2248');
-                       entities.Add ("ne", '\u2260');
-                       entities.Add ("equiv", '\u2261');
-                       entities.Add ("le", '\u2264');
-                       entities.Add ("ge", '\u2265');
-                       entities.Add ("sub", '\u2282');
-                       entities.Add ("sup", '\u2283');
-                       entities.Add ("nsub", '\u2284');
-                       entities.Add ("sube", '\u2286');
-                       entities.Add ("supe", '\u2287');
-                       entities.Add ("oplus", '\u2295');
-                       entities.Add ("otimes", '\u2297');
-                       entities.Add ("perp", '\u22A5');
-                       entities.Add ("sdot", '\u22C5');
-                       entities.Add ("lceil", '\u2308');
-                       entities.Add ("rceil", '\u2309');
-                       entities.Add ("lfloor", '\u230A');
-                       entities.Add ("rfloor", '\u230B');
-                       entities.Add ("lang", '\u2329');
-                       entities.Add ("rang", '\u232A');
-                       entities.Add ("loz", '\u25CA');
-                       entities.Add ("spades", '\u2660');
-                       entities.Add ("clubs", '\u2663');
-                       entities.Add ("hearts", '\u2665');
-                       entities.Add ("diams", '\u2666');
-                       entities.Add ("quot", '\u0022');
-                       entities.Add ("amp", '\u0026');
-                       entities.Add ("lt", '\u003C');
-                       entities.Add ("gt", '\u003E');
-                       entities.Add ("OElig", '\u0152');
-                       entities.Add ("oelig", '\u0153');
-                       entities.Add ("Scaron", '\u0160');
-                       entities.Add ("scaron", '\u0161');
-                       entities.Add ("Yuml", '\u0178');
-                       entities.Add ("circ", '\u02C6');
-                       entities.Add ("tilde", '\u02DC');
-                       entities.Add ("ensp", '\u2002');
-                       entities.Add ("emsp", '\u2003');
-                       entities.Add ("thinsp", '\u2009');
-                       entities.Add ("zwnj", '\u200C');
-                       entities.Add ("zwj", '\u200D');
-                       entities.Add ("lrm", '\u200E');
-                       entities.Add ("rlm", '\u200F');
-                       entities.Add ("ndash", '\u2013');
-                       entities.Add ("mdash", '\u2014');
-                       entities.Add ("lsquo", '\u2018');
-                       entities.Add ("rsquo", '\u2019');
-                       entities.Add ("sbquo", '\u201A');
-                       entities.Add ("ldquo", '\u201C');
-                       entities.Add ("rdquo", '\u201D');
-                       entities.Add ("bdquo", '\u201E');
-                       entities.Add ("dagger", '\u2020');
-                       entities.Add ("Dagger", '\u2021');
-                       entities.Add ("permil", '\u2030');
-                       entities.Add ("lsaquo", '\u2039');
-                       entities.Add ("rsaquo", '\u203A');
-                       entities.Add ("euro", '\u20AC');
-               }
+               // Must be sorted
+               static readonly long[] entities = new long[] {
+                       (long)'A' << 56 | (long)'E' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24, 
+                       (long)'A' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
+                       (long)'A' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
+                       (long)'A' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
+                       (long)'A' << 56 | (long)'l' << 48 | (long)'p' << 40 | (long)'h' << 32 | (long)'a' << 24, 
+                       (long)'A' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'g' << 24, 
+                       (long)'A' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16, 
+                       (long)'A' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
+                       (long)'B' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32, 
+                       (long)'C' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'d' << 32 | (long)'i' << 24 | (long)'l' << 16, 
+                       (long)'C' << 56 | (long)'h' << 48 | (long)'i' << 40, 
+                       (long)'D' << 56 | (long)'a' << 48 | (long)'g' << 40 | (long)'g' << 32 | (long)'e' << 24 | (long)'r' << 16, 
+                       (long)'D' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'t' << 32 | (long)'a' << 24, 
+                       (long)'E' << 56 | (long)'T' << 48 | (long)'H' << 40, 
+                       (long)'E' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
+                       (long)'E' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
+                       (long)'E' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
+                       (long)'E' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8, 
+                       (long)'E' << 56 | (long)'t' << 48 | (long)'a' << 40, 
+                       (long)'E' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
+                       (long)'G' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'m' << 32 | (long)'a' << 24, 
+                       (long)'I' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
+                       (long)'I' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
+                       (long)'I' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
+                       (long)'I' << 56 | (long)'o' << 48 | (long)'t' << 40 | (long)'a' << 32, 
+                       (long)'I' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
+                       (long)'K' << 56 | (long)'a' << 48 | (long)'p' << 40 | (long)'p' << 32 | (long)'a' << 24, 
+                       (long)'L' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'b' << 32 | (long)'d' << 24 | (long)'a' << 16, 
+                       (long)'M' << 56 | (long)'u' << 48, 
+                       (long)'N' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16, 
+                       (long)'N' << 56 | (long)'u' << 48, 
+                       (long)'O' << 56 | (long)'E' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24, 
+                       (long)'O' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
+                       (long)'O' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
+                       (long)'O' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
+                       (long)'O' << 56 | (long)'m' << 48 | (long)'e' << 40 | (long)'g' << 32 | (long)'a' << 24, 
+                       (long)'O' << 56 | (long)'m' << 48 | (long)'i' << 40 | (long)'c' << 32 | (long)'r' << 24 | (long)'o' << 16 | (long)'n' << 8, 
+                       (long)'O' << 56 | (long)'s' << 48 | (long)'l' << 40 | (long)'a' << 32 | (long)'s' << 24 | (long)'h' << 16, 
+                       (long)'O' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16, 
+                       (long)'O' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
+                       (long)'P' << 56 | (long)'h' << 48 | (long)'i' << 40, 
+                       (long)'P' << 56 | (long)'i' << 48, 
+                       (long)'P' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'m' << 32 | (long)'e' << 24, 
+                       (long)'P' << 56 | (long)'s' << 48 | (long)'i' << 40, 
+                       (long)'R' << 56 | (long)'h' << 48 | (long)'o' << 40, 
+                       (long)'S' << 56 | (long)'c' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'o' << 24 | (long)'n' << 16, 
+                       (long)'S' << 56 | (long)'i' << 48 | (long)'g' << 40 | (long)'m' << 32 | (long)'a' << 24, 
+                       (long)'T' << 56 | (long)'H' << 48 | (long)'O' << 40 | (long)'R' << 32 | (long)'N' << 24, 
+                       (long)'T' << 56 | (long)'a' << 48 | (long)'u' << 40, 
+                       (long)'T' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'t' << 32 | (long)'a' << 24, 
+                       (long)'U' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
+                       (long)'U' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
+                       (long)'U' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
+                       (long)'U' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8, 
+                       (long)'U' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
+                       (long)'X' << 56 | (long)'i' << 48, 
+                       (long)'Y' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
+                       (long)'Y' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
+                       (long)'Z' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32, 
+                       (long)'a' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
+                       (long)'a' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
+                       (long)'a' << 56 | (long)'c' << 48 | (long)'u' << 40 | (long)'t' << 32 | (long)'e' << 24, 
+                       (long)'a' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24, 
+                       (long)'a' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
+                       (long)'a' << 56 | (long)'l' << 48 | (long)'e' << 40 | (long)'f' << 32 | (long)'s' << 24 | (long)'y' << 16 | (long)'m' << 8, 
+                       (long)'a' << 56 | (long)'l' << 48 | (long)'p' << 40 | (long)'h' << 32 | (long)'a' << 24, 
+                       (long)'a' << 56 | (long)'m' << 48 | (long)'p' << 40, 
+                       (long)'a' << 56 | (long)'n' << 48 | (long)'d' << 40, 
+                       (long)'a' << 56 | (long)'n' << 48 | (long)'g' << 40, 
+                       (long)'a' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'g' << 24, 
+                       (long)'a' << 56 | (long)'s' << 48 | (long)'y' << 40 | (long)'m' << 32 | (long)'p' << 24, 
+                       (long)'a' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16, 
+                       (long)'a' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
+                       (long)'b' << 56 | (long)'d' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 
+                       (long)'b' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32, 
+                       (long)'b' << 56 | (long)'r' << 48 | (long)'v' << 40 | (long)'b' << 32 | (long)'a' << 24 | (long)'r' << 16, 
+                       (long)'b' << 56 | (long)'u' << 48 | (long)'l' << 40 | (long)'l' << 32, 
+                       (long)'c' << 56 | (long)'a' << 48 | (long)'p' << 40, 
+                       (long)'c' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'d' << 32 | (long)'i' << 24 | (long)'l' << 16, 
+                       (long)'c' << 56 | (long)'e' << 48 | (long)'d' << 40 | (long)'i' << 32 | (long)'l' << 24, 
+                       (long)'c' << 56 | (long)'e' << 48 | (long)'n' << 40 | (long)'t' << 32, 
+                       (long)'c' << 56 | (long)'h' << 48 | (long)'i' << 40, 
+                       (long)'c' << 56 | (long)'i' << 48 | (long)'r' << 40 | (long)'c' << 32, 
+                       (long)'c' << 56 | (long)'l' << 48 | (long)'u' << 40 | (long)'b' << 32 | (long)'s' << 24, 
+                       (long)'c' << 56 | (long)'o' << 48 | (long)'n' << 40 | (long)'g' << 32, 
+                       (long)'c' << 56 | (long)'o' << 48 | (long)'p' << 40 | (long)'y' << 32, 
+                       (long)'c' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'r' << 24, 
+                       (long)'c' << 56 | (long)'u' << 48 | (long)'p' << 40, 
+                       (long)'c' << 56 | (long)'u' << 48 | (long)'r' << 40 | (long)'r' << 32 | (long)'e' << 24 | (long)'n' << 16, 
+                       (long)'d' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32, 
+                       (long)'d' << 56 | (long)'a' << 48 | (long)'g' << 40 | (long)'g' << 32 | (long)'e' << 24 | (long)'r' << 16, 
+                       (long)'d' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32, 
+                       (long)'d' << 56 | (long)'e' << 48 | (long)'g' << 40, 
+                       (long)'d' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'t' << 32 | (long)'a' << 24, 
+                       (long)'d' << 56 | (long)'i' << 48 | (long)'a' << 40 | (long)'m' << 32 | (long)'s' << 24, 
+                       (long)'d' << 56 | (long)'i' << 48 | (long)'v' << 40 | (long)'i' << 32 | (long)'d' << 24 | (long)'e' << 16, 
+                       (long)'e' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
+                       (long)'e' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
+                       (long)'e' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
+                       (long)'e' << 56 | (long)'m' << 48 | (long)'p' << 40 | (long)'t' << 32 | (long)'y' << 24, 
+                       (long)'e' << 56 | (long)'m' << 48 | (long)'s' << 40 | (long)'p' << 32, 
+                       (long)'e' << 56 | (long)'n' << 48 | (long)'s' << 40 | (long)'p' << 32, 
+                       (long)'e' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8, 
+                       (long)'e' << 56 | (long)'q' << 48 | (long)'u' << 40 | (long)'i' << 32 | (long)'v' << 24, 
+                       (long)'e' << 56 | (long)'t' << 48 | (long)'a' << 40, 
+                       (long)'e' << 56 | (long)'t' << 48 | (long)'h' << 40, 
+                       (long)'e' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
+                       (long)'e' << 56 | (long)'u' << 48 | (long)'r' << 40 | (long)'o' << 32, 
+                       (long)'e' << 56 | (long)'x' << 48 | (long)'i' << 40 | (long)'s' << 32 | (long)'t' << 24, 
+                       (long)'f' << 56 | (long)'n' << 48 | (long)'o' << 40 | (long)'f' << 32, 
+                       (long)'f' << 56 | (long)'o' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'l' << 24 | (long)'l' << 16, 
+                       (long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'c' << 32 | (long)'1' << 24 | (long)'2' << 16, 
+                       (long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'c' << 32 | (long)'1' << 24 | (long)'4' << 16, 
+                       (long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'c' << 32 | (long)'3' << 24 | (long)'4' << 16, 
+                       (long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'s' << 32 | (long)'l' << 24, 
+                       (long)'g' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'m' << 32 | (long)'a' << 24, 
+                       (long)'g' << 56 | (long)'e' << 48, 
+                       (long)'g' << 56 | (long)'t' << 48, 
+                       (long)'h' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32, 
+                       (long)'h' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32, 
+                       (long)'h' << 56 | (long)'e' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'t' << 24 | (long)'s' << 16, 
+                       (long)'h' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'l' << 32 | (long)'i' << 24 | (long)'p' << 16, 
+                       (long)'i' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
+                       (long)'i' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
+                       (long)'i' << 56 | (long)'e' << 48 | (long)'x' << 40 | (long)'c' << 32 | (long)'l' << 24, 
+                       (long)'i' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
+                       (long)'i' << 56 | (long)'m' << 48 | (long)'a' << 40 | (long)'g' << 32 | (long)'e' << 24, 
+                       (long)'i' << 56 | (long)'n' << 48 | (long)'f' << 40 | (long)'i' << 32 | (long)'n' << 24, 
+                       (long)'i' << 56 | (long)'n' << 48 | (long)'t' << 40, 
+                       (long)'i' << 56 | (long)'o' << 48 | (long)'t' << 40 | (long)'a' << 32, 
+                       (long)'i' << 56 | (long)'q' << 48 | (long)'u' << 40 | (long)'e' << 32 | (long)'s' << 24 | (long)'t' << 16, 
+                       (long)'i' << 56 | (long)'s' << 48 | (long)'i' << 40 | (long)'n' << 32, 
+                       (long)'i' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
+                       (long)'k' << 56 | (long)'a' << 48 | (long)'p' << 40 | (long)'p' << 32 | (long)'a' << 24, 
+                       (long)'l' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32, 
+                       (long)'l' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'b' << 32 | (long)'d' << 24 | (long)'a' << 16, 
+                       (long)'l' << 56 | (long)'a' << 48 | (long)'n' << 40 | (long)'g' << 32, 
+                       (long)'l' << 56 | (long)'a' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 
+                       (long)'l' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32, 
+                       (long)'l' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'i' << 32 | (long)'l' << 24, 
+                       (long)'l' << 56 | (long)'d' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 
+                       (long)'l' << 56 | (long)'e' << 48, 
+                       (long)'l' << 56 | (long)'f' << 48 | (long)'l' << 40 | (long)'o' << 32 | (long)'o' << 24 | (long)'r' << 16, 
+                       (long)'l' << 56 | (long)'o' << 48 | (long)'w' << 40 | (long)'a' << 32 | (long)'s' << 24 | (long)'t' << 16, 
+                       (long)'l' << 56 | (long)'o' << 48 | (long)'z' << 40, 
+                       (long)'l' << 56 | (long)'r' << 48 | (long)'m' << 40, 
+                       (long)'l' << 56 | (long)'s' << 48 | (long)'a' << 40 | (long)'q' << 32 | (long)'u' << 24 | (long)'o' << 16, 
+                       (long)'l' << 56 | (long)'s' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 
+                       (long)'l' << 56 | (long)'t' << 48, 
+                       (long)'m' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'r' << 32, 
+                       (long)'m' << 56 | (long)'d' << 48 | (long)'a' << 40 | (long)'s' << 32 | (long)'h' << 24, 
+                       (long)'m' << 56 | (long)'i' << 48 | (long)'c' << 40 | (long)'r' << 32 | (long)'o' << 24, 
+                       (long)'m' << 56 | (long)'i' << 48 | (long)'d' << 40 | (long)'d' << 32 | (long)'o' << 24 | (long)'t' << 16, 
+                       (long)'m' << 56 | (long)'i' << 48 | (long)'n' << 40 | (long)'u' << 32 | (long)'s' << 24, 
+                       (long)'m' << 56 | (long)'u' << 48, 
+                       (long)'n' << 56 | (long)'a' << 48 | (long)'b' << 40 | (long)'l' << 32 | (long)'a' << 24, 
+                       (long)'n' << 56 | (long)'b' << 48 | (long)'s' << 40 | (long)'p' << 32, 
+                       (long)'n' << 56 | (long)'d' << 48 | (long)'a' << 40 | (long)'s' << 32 | (long)'h' << 24, 
+                       (long)'n' << 56 | (long)'e' << 48, 
+                       (long)'n' << 56 | (long)'i' << 48, 
+                       (long)'n' << 56 | (long)'o' << 48 | (long)'t' << 40, 
+                       (long)'n' << 56 | (long)'o' << 48 | (long)'t' << 40 | (long)'i' << 32 | (long)'n' << 24, 
+                       (long)'n' << 56 | (long)'s' << 48 | (long)'u' << 40 | (long)'b' << 32, 
+                       (long)'n' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16, 
+                       (long)'n' << 56 | (long)'u' << 48, 
+                       (long)'o' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
+                       (long)'o' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
+                       (long)'o' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24, 
+                       (long)'o' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
+                       (long)'o' << 56 | (long)'l' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'e' << 24, 
+                       (long)'o' << 56 | (long)'m' << 48 | (long)'e' << 40 | (long)'g' << 32 | (long)'a' << 24, 
+                       (long)'o' << 56 | (long)'m' << 48 | (long)'i' << 40 | (long)'c' << 32 | (long)'r' << 24 | (long)'o' << 16 | (long)'n' << 8, 
+                       (long)'o' << 56 | (long)'p' << 48 | (long)'l' << 40 | (long)'u' << 32 | (long)'s' << 24, 
+                       (long)'o' << 56 | (long)'r' << 48, 
+                       (long)'o' << 56 | (long)'r' << 48 | (long)'d' << 40 | (long)'f' << 32, 
+                       (long)'o' << 56 | (long)'r' << 48 | (long)'d' << 40 | (long)'m' << 32, 
+                       (long)'o' << 56 | (long)'s' << 48 | (long)'l' << 40 | (long)'a' << 32 | (long)'s' << 24 | (long)'h' << 16, 
+                       (long)'o' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16, 
+                       (long)'o' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'m' << 32 | (long)'e' << 24 | (long)'s' << 16, 
+                       (long)'o' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
+                       (long)'p' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'a' << 32, 
+                       (long)'p' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'t' << 32, 
+                       (long)'p' << 56 | (long)'e' << 48 | (long)'r' << 40 | (long)'m' << 32 | (long)'i' << 24 | (long)'l' << 16, 
+                       (long)'p' << 56 | (long)'e' << 48 | (long)'r' << 40 | (long)'p' << 32, 
+                       (long)'p' << 56 | (long)'h' << 48 | (long)'i' << 40, 
+                       (long)'p' << 56 | (long)'i' << 48, 
+                       (long)'p' << 56 | (long)'i' << 48 | (long)'v' << 40, 
+                       (long)'p' << 56 | (long)'l' << 48 | (long)'u' << 40 | (long)'s' << 32 | (long)'m' << 24 | (long)'n' << 16, 
+                       (long)'p' << 56 | (long)'o' << 48 | (long)'u' << 40 | (long)'n' << 32 | (long)'d' << 24, 
+                       (long)'p' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'m' << 32 | (long)'e' << 24, 
+                       (long)'p' << 56 | (long)'r' << 48 | (long)'o' << 40 | (long)'d' << 32, 
+                       (long)'p' << 56 | (long)'r' << 48 | (long)'o' << 40 | (long)'p' << 32, 
+                       (long)'p' << 56 | (long)'s' << 48 | (long)'i' << 40, 
+                       (long)'q' << 56 | (long)'u' << 48 | (long)'o' << 40 | (long)'t' << 32, 
+                       (long)'r' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32, 
+                       (long)'r' << 56 | (long)'a' << 48 | (long)'d' << 40 | (long)'i' << 32 | (long)'c' << 24, 
+                       (long)'r' << 56 | (long)'a' << 48 | (long)'n' << 40 | (long)'g' << 32, 
+                       (long)'r' << 56 | (long)'a' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 
+                       (long)'r' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32, 
+                       (long)'r' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'i' << 32 | (long)'l' << 24, 
+                       (long)'r' << 56 | (long)'d' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 
+                       (long)'r' << 56 | (long)'e' << 48 | (long)'a' << 40 | (long)'l' << 32, 
+                       (long)'r' << 56 | (long)'e' << 48 | (long)'g' << 40, 
+                       (long)'r' << 56 | (long)'f' << 48 | (long)'l' << 40 | (long)'o' << 32 | (long)'o' << 24 | (long)'r' << 16, 
+                       (long)'r' << 56 | (long)'h' << 48 | (long)'o' << 40, 
+                       (long)'r' << 56 | (long)'l' << 48 | (long)'m' << 40, 
+                       (long)'r' << 56 | (long)'s' << 48 | (long)'a' << 40 | (long)'q' << 32 | (long)'u' << 24 | (long)'o' << 16, 
+                       (long)'r' << 56 | (long)'s' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 
+                       (long)'s' << 56 | (long)'b' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 
+                       (long)'s' << 56 | (long)'c' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'o' << 24 | (long)'n' << 16, 
+                       (long)'s' << 56 | (long)'d' << 48 | (long)'o' << 40 | (long)'t' << 32, 
+                       (long)'s' << 56 | (long)'e' << 48 | (long)'c' << 40 | (long)'t' << 32, 
+                       (long)'s' << 56 | (long)'h' << 48 | (long)'y' << 40, 
+                       (long)'s' << 56 | (long)'i' << 48 | (long)'g' << 40 | (long)'m' << 32 | (long)'a' << 24, 
+                       (long)'s' << 56 | (long)'i' << 48 | (long)'g' << 40 | (long)'m' << 32 | (long)'a' << 24 | (long)'f' << 16, 
+                       (long)'s' << 56 | (long)'i' << 48 | (long)'m' << 40, 
+                       (long)'s' << 56 | (long)'p' << 48 | (long)'a' << 40 | (long)'d' << 32 | (long)'e' << 24 | (long)'s' << 16, 
+                       (long)'s' << 56 | (long)'u' << 48 | (long)'b' << 40, 
+                       (long)'s' << 56 | (long)'u' << 48 | (long)'b' << 40 | (long)'e' << 32, 
+                       (long)'s' << 56 | (long)'u' << 48 | (long)'m' << 40, 
+                       (long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40, 
+                       (long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'1' << 32, 
+                       (long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'2' << 32, 
+                       (long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'3' << 32, 
+                       (long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'e' << 32, 
+                       (long)'s' << 56 | (long)'z' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24, 
+                       (long)'t' << 56 | (long)'a' << 48 | (long)'u' << 40, 
+                       (long)'t' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'r' << 32 | (long)'e' << 24 | (long)'4' << 16, 
+                       (long)'t' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'t' << 32 | (long)'a' << 24, 
+                       (long)'t' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'t' << 32 | (long)'a' << 24 | (long)'s' << 16 | (long)'y' << 8 | (long)'m' << 0, 
+                       (long)'t' << 56 | (long)'h' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'s' << 24 | (long)'p' << 16, 
+                       (long)'t' << 56 | (long)'h' << 48 | (long)'o' << 40 | (long)'r' << 32 | (long)'n' << 24, 
+                       (long)'t' << 56 | (long)'i' << 48 | (long)'l' << 40 | (long)'d' << 32 | (long)'e' << 24, 
+                       (long)'t' << 56 | (long)'i' << 48 | (long)'m' << 40 | (long)'e' << 32 | (long)'s' << 24, 
+                       (long)'t' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'d' << 32 | (long)'e' << 24, 
+                       (long)'u' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32, 
+                       (long)'u' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
+                       (long)'u' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32, 
+                       (long)'u' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
+                       (long)'u' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
+                       (long)'u' << 56 | (long)'m' << 48 | (long)'l' << 40, 
+                       (long)'u' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'h' << 24, 
+                       (long)'u' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8, 
+                       (long)'u' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
+                       (long)'w' << 56 | (long)'e' << 48 | (long)'i' << 40 | (long)'e' << 32 | (long)'r' << 24 | (long)'p' << 16, 
+                       (long)'x' << 56 | (long)'i' << 48, 
+                       (long)'y' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
+                       (long)'y' << 56 | (long)'e' << 48 | (long)'n' << 40, 
+                       (long)'y' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
+                       (long)'z' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32, 
+                       (long)'z' << 56 | (long)'w' << 48 | (long)'j' << 40, 
+                       (long)'z' << 56 | (long)'w' << 48 | (long)'n' << 40 | (long)'j' << 32
+               };
+
+               static readonly char[] entities_values = new char[] {
+                       '\u00C6',
+                       '\u00C1',
+                       '\u00C2',
+                       '\u00C0',
+                       '\u0391',
+                       '\u00C5',
+                       '\u00C3',
+                       '\u00C4',
+                       '\u0392',
+                       '\u00C7',
+                       '\u03A7',
+                       '\u2021',
+                       '\u0394',
+                       '\u00D0',
+                       '\u00C9',
+                       '\u00CA',
+                       '\u00C8',
+                       '\u0395',
+                       '\u0397',
+                       '\u00CB',
+                       '\u0393',
+                       '\u00CD',
+                       '\u00CE',
+                       '\u00CC',
+                       '\u0399',
+                       '\u00CF',
+                       '\u039A',
+                       '\u039B',
+                       '\u039C',
+                       '\u00D1',
+                       '\u039D',
+                       '\u0152',
+                       '\u00D3',
+                       '\u00D4',
+                       '\u00D2',
+                       '\u03A9',
+                       '\u039F',
+                       '\u00D8',
+                       '\u00D5',
+                       '\u00D6',
+                       '\u03A6',
+                       '\u03A0',
+                       '\u2033',
+                       '\u03A8',
+                       '\u03A1',
+                       '\u0160',
+                       '\u03A3',
+                       '\u00DE',
+                       '\u03A4',
+                       '\u0398',
+                       '\u00DA',
+                       '\u00DB',
+                       '\u00D9',
+                       '\u03A5',
+                       '\u00DC',
+                       '\u039E',
+                       '\u00DD',
+                       '\u0178',
+                       '\u0396',
+                       '\u00E1',
+                       '\u00E2',
+                       '\u00B4',
+                       '\u00E6',
+                       '\u00E0',
+                       '\u2135',
+                       '\u03B1',
+                       '\u0026',
+                       '\u2227',
+                       '\u2220',
+                       '\u00E5',
+                       '\u2248',
+                       '\u00E3',
+                       '\u00E4',
+                       '\u201E',
+                       '\u03B2',
+                       '\u00A6',
+                       '\u2022',
+                       '\u2229',
+                       '\u00E7',
+                       '\u00B8',
+                       '\u00A2',
+                       '\u03C7',
+                       '\u02C6',
+                       '\u2663',
+                       '\u2245',
+                       '\u00A9',
+                       '\u21B5',
+                       '\u222A',
+                       '\u00A4',
+                       '\u21D3',
+                       '\u2020',
+                       '\u2193',
+                       '\u00B0',
+                       '\u03B4',
+                       '\u2666',
+                       '\u00F7',
+                       '\u00E9',
+                       '\u00EA',
+                       '\u00E8',
+                       '\u2205',
+                       '\u2003',
+                       '\u2002',
+                       '\u03B5',
+                       '\u2261',
+                       '\u03B7',
+                       '\u00F0',
+                       '\u00EB',
+                       '\u20AC',
+                       '\u2203',
+                       '\u0192',
+                       '\u2200',
+                       '\u00BD',
+                       '\u00BC',
+                       '\u00BE',
+                       '\u2044',
+                       '\u03B3',
+                       '\u2265',
+                       '\u003E',
+                       '\u21D4',
+                       '\u2194',
+                       '\u2665',
+                       '\u2026',
+                       '\u00ED',
+                       '\u00EE',
+                       '\u00A1',
+                       '\u00EC',
+                       '\u2111',
+                       '\u221E',
+                       '\u222B',
+                       '\u03B9',
+                       '\u00BF',
+                       '\u2208',
+                       '\u00EF',
+                       '\u03BA',
+                       '\u21D0',
+                       '\u03BB',
+                       '\u2329',
+                       '\u00AB',
+                       '\u2190',
+                       '\u2308',
+                       '\u201C',
+                       '\u2264',
+                       '\u230A',
+                       '\u2217',
+                       '\u25CA',
+                       '\u200E',
+                       '\u2039',
+                       '\u2018',
+                       '\u003C',
+                       '\u00AF',
+                       '\u2014',
+                       '\u00B5',
+                       '\u00B7',
+                       '\u2212',
+                       '\u03BC',
+                       '\u2207',
+                       '\u00A0',
+                       '\u2013',
+                       '\u2260',
+                       '\u220B',
+                       '\u00AC',
+                       '\u2209',
+                       '\u2284',
+                       '\u00F1',
+                       '\u03BD',
+                       '\u00F3',
+                       '\u00F4',
+                       '\u0153',
+                       '\u00F2',
+                       '\u203E',
+                       '\u03C9',
+                       '\u03BF',
+                       '\u2295',
+                       '\u2228',
+                       '\u00AA',
+                       '\u00BA',
+                       '\u00F8',
+                       '\u00F5',
+                       '\u2297',
+                       '\u00F6',
+                       '\u00B6',
+                       '\u2202',
+                       '\u2030',
+                       '\u22A5',
+                       '\u03C6',
+                       '\u03C0',
+                       '\u03D6',
+                       '\u00B1',
+                       '\u00A3',
+                       '\u2032',
+                       '\u220F',
+                       '\u221D',
+                       '\u03C8',
+                       '\u0022',
+                       '\u21D2',
+                       '\u221A',
+                       '\u232A',
+                       '\u00BB',
+                       '\u2192',
+                       '\u2309',
+                       '\u201D',
+                       '\u211C',
+                       '\u00AE',
+                       '\u230B',
+                       '\u03C1',
+                       '\u200F',
+                       '\u203A',
+                       '\u2019',
+                       '\u201A',
+                       '\u0161',
+                       '\u22C5',
+                       '\u00A7',
+                       '\u00AD',
+                       '\u03C3',
+                       '\u03C2',
+                       '\u223C',
+                       '\u2660',
+                       '\u2282',
+                       '\u2286',
+                       '\u2211',
+                       '\u2283',
+                       '\u00B9',
+                       '\u00B2',
+                       '\u00B3',
+                       '\u2287',
+                       '\u00DF',
+                       '\u03C4',
+                       '\u2234',
+                       '\u03B8',
+                       '\u03D1',
+                       '\u2009',
+                       '\u00FE',
+                       '\u02DC',
+                       '\u00D7',
+                       '\u2122',
+                       '\u21D1',
+                       '\u00FA',
+                       '\u2191',
+                       '\u00FB',
+                       '\u00F9',
+                       '\u00A8',
+                       '\u03D2',
+                       '\u03C5',
+                       '\u00FC',
+                       '\u2118',
+                       '\u03BE',
+                       '\u00FD',
+                       '\u00A5',
+                       '\u00FF',
+                       '\u03B6',
+                       '\u200D',
+                       '\u200C'
+               };
 
-               public HttpUtility () 
-               {
-               }
-       
-               #endregion // Constructors
-       
                #region Methods
        
                public static void HtmlAttributeEncode (string s, TextWriter output) 
@@ -816,6 +1043,36 @@ namespace System.Net {
                        return result.ToArray ();
                }
 
+               static string ConvertKeyToEntity (string key)
+               {
+                       var token = CalculateKeyValue (key);
+                       if (token == 0)
+                               return key;
+
+                       var idx = Array.BinarySearch (entities, token);
+                       if (idx < 0)
+                               return key;
+
+                       return entities_values [idx].ToString ();
+               }
+
+               static long CalculateKeyValue (string s)
+               {
+                       if (s.Length > 8)
+                               return 0;
+
+                       long key = 0;
+                       for (int i = 0; i < s.Length; ++i) {
+                               long ch = s[i];
+                               if (ch > 'z' || ch < '0')
+                                       return 0;
+
+                               key |= ch << ((7 - i) * 8);
+                       }
+
+                       return key;
+               }
+
                /// <summary>
                /// Decodes an HTML-encoded string and returns the decoded string.
                /// </summary>
@@ -884,8 +1141,10 @@ namespace System.Net {
                                        entity.Append (c);
                                        if (c == ';') {
                                                string key = entity.ToString ();
-                                               if (key.Length > 1 && Entities.ContainsKey (key.Substring (1, key.Length - 2)))
-                                                       key = Entities [key.Substring (1, key.Length - 2)].ToString ();
+                                               if (key.Length > 1) {
+                                                       var skey = key.Substring (1, key.Length - 2);
+                                                       key = ConvertKeyToEntity (skey);
+                                               }
 
                                                output.Append (key);
                                                state = 0;
index 54f5691ca3ee9c74ef8b9ccbc208af0b459968a1..6130257f88f1cf73d1f0b8d009b53c37158fa3fd 100644 (file)
 
 #if SECURITY_DEP
 
+extern alias MonoSecurity;
+
 using System.Collections;
 using System.Text;
 
-using Mono.Security;
-using MX = Mono.Security.X509;
+using MonoSecurity::Mono.Security;
+using MX = MonoSecurity::Mono.Security.X509;
 
 namespace System.Security.Cryptography.X509Certificates {
 
@@ -91,7 +93,7 @@ namespace System.Security.Cryptography.X509Certificates {
                                RawData = new byte [2] { 0x30, 0x00 };
                                DecodeRawData ();
                        } else {
-                               ASN1 dn = MX.X501.FromString (distinguishedName);
+                               var dn = MX.X501.FromString (distinguishedName);
                                if ((flag & X500DistinguishedNameFlags.Reversed) != 0) {
                                        ASN1 rdn = new ASN1 (0x30);
                                        for (int i = dn.Count - 1; i >= 0; i--) 
index 59eb0e209a4341cc42a1482a4d7d21e81cfa6612..1a3eff95e7d39af0dc3231046439dde2a1d0b654 100644 (file)
 
 #if SECURITY_DEP
 
+extern alias MonoSecurity;
+
 using System.Text;
 
-using Mono.Security;
+using MonoSecurity::Mono.Security;
 
 namespace System.Security.Cryptography.X509Certificates {
 
index 0cab0a8bdf8e0a5544b80e64472d3dd71de3beb1..99f40f4d0c1eabc8ec828284d1666faf4a9009b5 100644 (file)
@@ -893,7 +893,7 @@ namespace System.Security.Cryptography.X509Certificates {
                        string ski = GetSubjectKeyIdentifier (caCertificate);
 
                        // consider that the LocalMachine directories could not exists... and cannot be created by the user
-                       MX.X509Crl result = (LMCAStore.Store == null) ? null : CheckCrls (subject, ski, LMCAStore.Store.Crls);
+                       var result = (LMCAStore.Store == null) ? null : CheckCrls (subject, ski, LMCAStore.Store.Crls);
                        if (result != null)
                                return result;
                        if (location == StoreLocation.CurrentUser) {
index efe2abed317b118ae01d3201c27b173a70e8138e..ebc7df34b7e9c68c724d63adf14cde40149c1740 100644 (file)
 
 #if SECURITY_DEP
 
+extern alias MonoSecurity;
+
 using System.Text;
 
-using Mono.Security;
+using MonoSecurity::Mono.Security;
 
 namespace System.Security.Cryptography.X509Certificates {
 
index ce5df95e0b6ce01c2d11ba895563da02ca54e3d1..ac7e05387511b019f3425b21f2aef3cd2d1f0813 100644 (file)
 
 #if SECURITY_DEP
 
+extern alias MonoSecurity;
+
 using System.Text;
 
-using Mono.Security;
+using MonoSecurity::Mono.Security;
 
 namespace System.Security.Cryptography.X509Certificates {
 
index b527f34e39ffe26adf7e233baaab7fe1353ccd7e..208754d9fd800bc34f5169aa5da5118e49167170 100644 (file)
 
 #if SECURITY_DEP
 
+extern alias MonoSecurity;
+
 using System.Security.Permissions;
-using MX = Mono.Security.X509;
+using MX = MonoSecurity::Mono.Security.X509;
 
 namespace System.Security.Cryptography.X509Certificates {
 
index d24e4806bb994bcbd58c9f337cedea7d6a1301d3..b7a7af852fc06554de833ed6ffac788465a13ec0 100644 (file)
 
 #if SECURITY_DEP
 
+extern alias MonoSecurity;
+
 using System.Text;
 
-using Mono.Security;
-using Mono.Security.Cryptography;
+using MonoSecurity::Mono.Security;
+using MonoSecurity::Mono.Security.Cryptography;
 
 namespace System.Security.Cryptography.X509Certificates {
 
index b4c17f84103574250eed74cd5011dc0aa9d62bd7..14b8ccedfabdccb9b3726b9d2e30a6072857991c 100644 (file)
 
 #if SECURITY_DEP
 
+extern alias MonoSecurity;
+
 using System.Security.Cryptography.X509Certificates;
 using System.Text;
 
-using Mono.Security;
-using Mono.Security.Cryptography;
+using MonoSecurity::Mono.Security;
+using MonoSecurity::Mono.Security.Cryptography;
 
 namespace System.Security.Cryptography {
 
index 7fe4c29dbf31c7a481226a7250c810356e389cba..16d12af943c993e9ac2a8cfbb46a474b760b2d86 100644 (file)
@@ -188,6 +188,10 @@ namespace MonoTests.System.ComponentModel.Design.Serialization {
                [Test]
                public void Property_Arguments_Mismatch ()
                {
+#if MOBILE
+                       // ensure the property is not linked out of the application since it make the test fails
+                       Assert.NotNull (Thread.CurrentPrincipal, "pre-test");
+#endif
                        PropertyInfo pi = typeof (Thread).GetProperty ("CurrentPrincipal");
 
                        InstanceDescriptor id = new InstanceDescriptor (pi, new object [] { url });
@@ -207,6 +211,10 @@ namespace MonoTests.System.ComponentModel.Design.Serialization {
                [Test]
                public void Property_Arguments_Null ()
                {
+#if MOBILE
+                       // ensure the property is not linked out of the application since it make the test fails
+                       Assert.NotNull (Thread.CurrentPrincipal, "pre-test");
+#endif
                        PropertyInfo pi = typeof (Thread).GetProperty ("CurrentPrincipal");
 
                        InstanceDescriptor id = new InstanceDescriptor (pi, null);
index 2fdd8db64d109efc49cba925b3c0c19db84036b8..a09776a9c00b41810928d26ee0e118948744c9de 100644 (file)
@@ -1465,6 +1465,10 @@ namespace MonoTests.System.ComponentModel
                [Test]
                public void GetProperties_Order ()
                {
+#if MOBILE
+                       // Component.Container will be be linked out (when using Link SDK) if unused
+                       Assert.Null (new Component ().Container, "pre-test");
+#endif
                        MyComponent com = new MyComponent (new MyContainer ());
 
                        PropertyDescriptorCollection col = TypeDescriptor.GetProperties (com);
index 9917fa9a441b49b185509681aedbd0445f2c5898..3505926f41074e31c559b69c2187940f9fd475ef 100644 (file)
@@ -193,10 +193,10 @@ namespace MonoTests.System.Net
                [Test] // DownloadFile (string, string)
                public void DownloadFile1_Address_SchemeNotSupported ()
                {
+                       string file = Path.Combine (Path.GetTempPath (), "tmp.out");
                        WebClient wc = new WebClient ();
                        try {
-                               wc.DownloadFile ("tp://scheme.notsupported",
-                                       "tmp.out");
+                               wc.DownloadFile ("tp://scheme.notsupported", file);
                                Assert.Fail ("#1");
                        } catch (WebException ex) {
                                // An error occurred performing a WebClient request
@@ -212,6 +212,10 @@ namespace MonoTests.System.Net
                                Assert.IsNull (inner.InnerException, "#8");
                                Assert.IsNotNull (inner.Message, "#9");
                        }
+                       finally {
+                               if (File.Exists (file))
+                                       File.Delete (file);
+                       }
                }
 
                [Test] // DownloadFile (string, string)
@@ -270,10 +274,10 @@ namespace MonoTests.System.Net
                [Test] // DownloadFile (Uri, string)
                public void DownloadFile2_Address_SchemeNotSupported ()
                {
+                       string file = Path.Combine (Path.GetTempPath (), "tmp.out");
                        WebClient wc = new WebClient ();
                        try {
-                               wc.DownloadFile (new Uri ("tp://scheme.notsupported"),
-                                       "tmp.out");
+                               wc.DownloadFile (new Uri ("tp://scheme.notsupported"), file);
                                Assert.Fail ("#1");
                        } catch (WebException ex) {
                                // An error occurred performing a WebClient request
@@ -289,6 +293,10 @@ namespace MonoTests.System.Net
                                Assert.IsNull (inner.InnerException, "#8");
                                Assert.IsNotNull (inner.Message, "#9");
                        }
+                       finally {
+                               if (File.Exists (file))
+                                       File.Delete (file);
+                       }
                }
 
                [Test] // DownloadFile (Uri, string)
index 3b940e5fa9cd6d2de41eaa52bc2a66ee6743993f..77c4b75c0980af7bd888d2650d67089f768aeb25 100644 (file)
@@ -36,6 +36,9 @@ using System.Text.RegularExpressions;
 namespace MonoTests.System.Net {
 
        [TestFixture]
+#if MOBILE
+       [Ignore ("CAS is not supported and parts will be linked away")]
+#endif
        public class WebPermissionAttributeTest {
 
                [Test]
index f2adab019132024d7e041f0d7acb761aafdecefc..39d7045ca0dd6bf57dc9e9c6cc21666f9692d950 100644 (file)
@@ -37,6 +37,9 @@ namespace MonoTests.System.Net {
        
        [TestFixture]
        [Category ("CAS")]
+#if MOBILE
+       [Ignore ("CAS is not supported and parts will be linked away")]
+#endif
        public class WebPermissionTest {
 
                [Test]
index 8a4414fb774442d89415ec9da15f045592858027..92c1a54300ba13b5cdb3488875de883f32c32d15 100644 (file)
@@ -180,6 +180,16 @@ namespace MonoTests.System.Net {
                                        " + \"&mid=\" + ModuleID + \"&pageindex=\" + Request.Params.Get(\"pageindex\") %>";
                        Assert.AreEqual (str, WebUtility.HtmlDecode (str));
                }
+
+               [Test]
+               public void EntityEncoding ()
+               {
+                       var expected = "\u00A0\u00A1\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7\u00A8\u00A9\u00AA\u00AB\u00AC\u00AD\u00AE\u00AF\u00B0\u00B1\u00B2\u00B3\u00B4\u00B5\u00B6\u00B7\u00B8\u00B9\u00BA\u00BB\u00BC\u00BD\u00BE\u00BF\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u00C7\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF\u00D0\u00D1\u00D2\u00D3\u00D4\u00D5\u00D6\u00D7\u00D8\u00D9\u00DA\u00DB\u00DC\u00DD\u00DE\u00DF\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF\u00F0\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00F7\u00F8\u00F9\u00FA\u00FB\u00FC\u00FD\u00FE\u00FF\u0192\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039A\u039B\u039C\u039D\u039E\u039F\u03A0\u03A1\u03A3\u03A4\u03A5\u03A6\u03A7\u03A8\u03A9\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD\u03BE\u03BF\u03C0\u03C1\u03C2\u03C3\u03C4\u03C5\u03C6\u03C7\u03C8\u03C9\u03D1\u03D2\u03D6\u2022\u2026\u2032\u2033\u203E\u2044\u2118\u2111\u211C\u2122\u2135\u2190\u2191\u2192\u2193\u2194\u21B5\u21D0\u21D1\u21D2\u21D3\u21D4\u2200\u2202\u2203\u2205\u2207\u2208\u2209\u220B\u220F\u2211\u2212\u2217\u221A\u221D\u221E\u2220\u2227\u2228\u2229\u222A\u222B\u2234\u223C\u2245\u2248\u2260\u2261\u2264\u2265\u2282\u2283\u2284\u2286\u2287\u2295\u2297\u22A5\u22C5\u2308\u2309\u230A\u230B\u2329\u232A\u25CA\u2660\u2663\u2665\u2666\u0022\u0026\u003C\u003E\u0152\u0153\u0160\u0161\u0178\u02C6\u02DC\u2002\u2003\u2009\u200C\u200D\u200E\u200F\u2013\u2014\u2018\u2019\u201A\u201C\u201D\u201E\u2020\u2021\u2030\u2039\u203A\u20AC";
+
+                       var htmlDecoded = WebUtility.HtmlDecode ("&nbsp;&iexcl;&cent;&pound;&curren;&yen;&brvbar;&sect;&uml;&copy;&ordf;&laquo;&not;&shy;&reg;&macr;&deg;&plusmn;&sup2;&sup3;&acute;&micro;&para;&middot;&cedil;&sup1;&ordm;&raquo;&frac14;&frac12;&frac34;&iquest;&Agrave;&Aacute;&Acirc;&Atilde;&Auml;&Aring;&AElig;&Ccedil;&Egrave;&Eacute;&Ecirc;&Euml;&Igrave;&Iacute;&Icirc;&Iuml;&ETH;&Ntilde;&Ograve;&Oacute;&Ocirc;&Otilde;&Ouml;&times;&Oslash;&Ugrave;&Uacute;&Ucirc;&Uuml;&Yacute;&THORN;&szlig;&agrave;&aacute;&acirc;&atilde;&auml;&aring;&aelig;&ccedil;&egrave;&eacute;&ecirc;&euml;&igrave;&iacute;&icirc;&iuml;&eth;&ntilde;&ograve;&oacute;&ocirc;&otilde;&ouml;&divide;&oslash;&ugrave;&uacute;&ucirc;&uuml;&yacute;&thorn;&yuml;&fnof;&Alpha;&Beta;&Gamma;&Delta;&Epsilon;&Zeta;&Eta;&Theta;&Iota;&Kappa;&Lambda;&Mu;&Nu;&Xi;&Omicron;&Pi;&Rho;&Sigma;&Tau;&Upsilon;&Phi;&Chi;&Psi;&Omega;&alpha;&beta;&gamma;&delta;&epsilon;&zeta;&eta;&theta;&iota;&kappa;&lambda;&mu;&nu;&xi;&omicron;&pi;&rho;&sigmaf;&sigma;&tau;&upsilon;&phi;&chi;&psi;&omega;&thetasym;&upsih;&piv;&bull;&hellip;&prime;&Prime;&oline;&frasl;&weierp;&image;&real;&trade;&alefsym;&larr;&uarr;&rarr;&darr;&harr;&crarr;&lArr;&uArr;&rArr;&dArr;&hArr;&forall;&part;&exist;&empty;&nabla;&isin;&notin;&ni;&prod;&sum;&minus;&lowast;&radic;&prop;&infin;&ang;&and;&or;&cap;&cup;&int;&there4;&sim;&cong;&asymp;&ne;&equiv;&le;&ge;&sub;&sup;&nsub;&sube;&supe;&oplus;&otimes;&perp;&sdot;&lceil;&rceil;&lfloor;&rfloor;&lang;&rang;&loz;&spades;&clubs;&hearts;&diams;&quot;&amp;&lt;&gt;&OElig;&oelig;&Scaron;&scaron;&Yuml;&circ;&tilde;&ensp;&emsp;&thinsp;&zwnj;&zwj;&lrm;&rlm;&ndash;&mdash;&lsquo;&rsquo;&sbquo;&ldquo;&rdquo;&bdquo;&dagger;&Dagger;&permil;&lsaquo;&rsaquo;&euro;");
+                       
+                       Assert.AreEqual (expected, htmlDecoded);
+               }
        }
 }
 #endif
index 1e0cc11cb763863a39a562435ca2dc31299ac4fe..8b740044e34df7f9a1c29cf1b997c5a5113abc92 100644 (file)
@@ -279,8 +279,15 @@ namespace System.Globalization
                                if (parent_culture == null) {
                                        if (!constructed)
                                                Construct ();
-                                       if (parent_lcid == cultureID)
+                                       if (parent_lcid == cultureID) {
+                                               //
+                                               // Parent lcid is same but culture info is not for legacy zh culture
+                                               //
+                                               if (parent_lcid == 0x7C04 && EnglishName.EndsWith (" Legacy", StringComparison.Ordinal))
+                                                       return parent_culture = new CultureInfo ("zh-Hant");
+
                                                return null;
+                                       }
                                        
                                        if (parent_lcid == InvariantCultureId)
                                                parent_culture = InvariantCulture;
index 746e1f6f35ff8d0a775da5d01d9facfa45f59f15..a3134933a312865392cb309f979a53957438d7f3 100644 (file)
@@ -705,11 +705,16 @@ namespace System.Runtime.InteropServices
 
                public static byte ReadByte (IntPtr ptr)
                {
-                       return ReadByte (ptr, 0);
+                       unsafe {
+                               return *(byte*)ptr;
+                       }
                }
 
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               public extern static byte ReadByte (IntPtr ptr, int ofs);
+               public static byte ReadByte (IntPtr ptr, int ofs) {
+                       unsafe {
+                               return *((byte*)ptr + ofs);
+                       }
+               }
 
                [MonoTODO]
                [SuppressUnmanagedCodeSecurity]
@@ -718,13 +723,32 @@ namespace System.Runtime.InteropServices
                        throw new NotImplementedException ();
                }
 
-               public static short ReadInt16 (IntPtr ptr)
+               public unsafe static short ReadInt16 (IntPtr ptr)
                {
-                       return ReadInt16 (ptr, 0);
+                       byte *addr = (byte *) ptr;
+                       
+                       // The mono JIT can't inline this due to the hight number of calls
+                       // return ReadInt16 (ptr, 0);
+                       
+                       if (((uint)addr & 1) == 0) 
+                               return *(short*)addr;
+
+                       short s;
+                       String.memcpy ((byte*)&s, (byte*)ptr, 2);
+                       return s;
                }
 
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               public extern static short ReadInt16 (IntPtr ptr, int ofs);
+               public unsafe static short ReadInt16 (IntPtr ptr, int ofs)
+               {
+                       byte *addr = ((byte *) ptr) + ofs;
+
+                       if (((uint) addr & 1) == 0)
+                               return *(short*)addr;
+
+                       short s;
+                       String.memcpy ((byte*)&s, addr, 2);
+                       return s;
+               }
 
                [MonoTODO]
                [SuppressUnmanagedCodeSecurity]
@@ -734,14 +758,31 @@ namespace System.Runtime.InteropServices
                }
 
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-               public static int ReadInt32 (IntPtr ptr)
+               public unsafe static int ReadInt32 (IntPtr ptr)
                {
-                       return ReadInt32 (ptr, 0);
+                       byte *addr = (byte *) ptr;
+                       
+                       if (((uint)addr & 3) == 0) 
+                               return *(int*)addr;
+
+                       int s;
+                       String.memcpy ((byte*)&s, addr, 4);
+                       return s;
                }
 
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               public extern static int ReadInt32 (IntPtr ptr, int ofs);
+               public unsafe static int ReadInt32 (IntPtr ptr, int ofs)
+               {
+                       byte *addr = ((byte *) ptr) + ofs;
+                       
+                       if ((((int) addr) & 3) == 0)
+                               return *(int*)addr;
+                       else {
+                               int s;
+                               String.memcpy ((byte*)&s, addr, 4);
+                               return s;
+                       }
+               }
 
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
                [MonoTODO]
@@ -752,13 +793,31 @@ namespace System.Runtime.InteropServices
                }
 
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-               public static long ReadInt64 (IntPtr ptr)
+               public unsafe static long ReadInt64 (IntPtr ptr)
                {
-                       return ReadInt64 (ptr, 0);
+                       byte *addr = (byte *) ptr;
+                               
+                       // The real alignment might be 4 on some platforms, but this is just an optimization,
+                       // so it doesn't matter.
+                       if (((uint) addr & 7) == 0)
+                               return *(long*)ptr;
+
+                       long s;
+                       String.memcpy ((byte*)&s, addr, 8);
+                       return s;
                }
 
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               public extern static long ReadInt64 (IntPtr ptr, int ofs);
+               public unsafe static long ReadInt64 (IntPtr ptr, int ofs)
+               {
+                       byte *addr = ((byte *) ptr) + ofs;
+
+                       if (((uint) addr & 7) == 0)
+                               return *(long*)addr;
+                       
+                       long s;
+                       String.memcpy ((byte*)&s, addr, 8);
+                       return s;
+               }
 
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
                [MonoTODO]
@@ -771,12 +830,20 @@ namespace System.Runtime.InteropServices
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
                public static IntPtr ReadIntPtr (IntPtr ptr)
                {
-                       return ReadIntPtr (ptr, 0);
+                       if (IntPtr.Size == 4)
+                               return (IntPtr)ReadInt32 (ptr);
+                       else
+                               return (IntPtr)ReadInt64 (ptr);
                }
                
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               public extern static IntPtr ReadIntPtr (IntPtr ptr, int ofs);
+               public static IntPtr ReadIntPtr (IntPtr ptr, int ofs)
+               {
+                       if (IntPtr.Size == 4)
+                               return (IntPtr)ReadInt32 (ptr, ofs);
+                       else
+                               return (IntPtr)ReadInt64 (ptr, ofs);
+               }
 
                [ReliabilityContractAttribute (Consistency.WillNotCorruptState, Cer.Success)]
                [MonoTODO]
@@ -1009,11 +1076,16 @@ namespace System.Runtime.InteropServices
 
                public static void WriteByte (IntPtr ptr, byte val)
                {
-                       WriteByte (ptr, 0, val);
+                       unsafe {
+                               *(byte*)ptr = val;
+                       }
                }
 
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               public extern static void WriteByte (IntPtr ptr, int ofs, byte val);
+               public static void WriteByte (IntPtr ptr, int ofs, byte val) {
+                       unsafe {
+                               *(byte*)(IntPtr.Add (ptr, ofs)) = val;
+                       }
+               }
 
                [MonoTODO]
                [SuppressUnmanagedCodeSecurity]
@@ -1022,13 +1094,26 @@ namespace System.Runtime.InteropServices
                        throw new NotImplementedException ();
                }
 
-               public static void WriteInt16 (IntPtr ptr, short val)
+               public static unsafe void WriteInt16 (IntPtr ptr, short val)
                {
-                       WriteInt16 (ptr, 0, val);
+                       byte *addr = (byte *) ptr;
+                       
+                       if (((uint)addr & 1) == 0)
+                               *(short*)addr = val;
+                       else
+                               String.memcpy (addr, (byte*)&val, 2);
                }
 
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               public extern static void WriteInt16 (IntPtr ptr, int ofs, short val);
+               public static unsafe void WriteInt16 (IntPtr ptr, int ofs, short val)
+               {
+                       byte *addr = ((byte *) ptr) + ofs;
+
+                       if (((uint)addr & 1) == 0)
+                               *(short*)addr = val;
+                       else {
+                               String.memcpy (addr, (byte*)&val, 2);
+                       }
+               }
 
                [MonoTODO]
                [SuppressUnmanagedCodeSecurity]
@@ -1039,12 +1124,13 @@ namespace System.Runtime.InteropServices
 
                public static void WriteInt16 (IntPtr ptr, char val)
                {
-                       WriteInt16 (ptr, 0, val);
+                       WriteInt16 (ptr, 0, (short)val);
                }
 
-               [MonoTODO]
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               public extern static void WriteInt16 (IntPtr ptr, int ofs, char val);
+               public static void WriteInt16 (IntPtr ptr, int ofs, char val)
+               {
+                       WriteInt16 (ptr, ofs, (short)val);
+               }
 
                [MonoTODO]
                public static void WriteInt16([In, Out] object ptr, int ofs, char val)
@@ -1052,13 +1138,27 @@ namespace System.Runtime.InteropServices
                        throw new NotImplementedException ();
                }
 
-               public static void WriteInt32 (IntPtr ptr, int val)
+               public static unsafe void WriteInt32 (IntPtr ptr, int val)
                {
-                       WriteInt32 (ptr, 0, val);
+                       byte *addr = (byte *) ptr;
+                       
+                       if (((uint)addr & 3) == 0) 
+                               *(int*)addr = val;
+                       else {
+                               String.memcpy (addr, (byte*)&val, 4);
+                       }
                }
 
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               public extern static void WriteInt32 (IntPtr ptr, int ofs, int val);
+               public unsafe static void WriteInt32 (IntPtr ptr, int ofs, int val)
+               {
+                       byte *addr = ((byte *) ptr) + ofs;
+
+                       if (((uint)addr & 3) == 0) 
+                               *(int*)addr = val;
+                       else {
+                               String.memcpy (addr, (byte*)&val, 4);
+                       }
+               }
 
                [MonoTODO]
                [SuppressUnmanagedCodeSecurity]
@@ -1067,13 +1167,29 @@ namespace System.Runtime.InteropServices
                        throw new NotImplementedException ();
                }
 
-               public static void WriteInt64 (IntPtr ptr, long val)
+               public static unsafe void WriteInt64 (IntPtr ptr, long val)
                {
-                       WriteInt64 (ptr, 0, val);
+                       byte *addr = (byte *) ptr;
+                       
+                       // The real alignment might be 4 on some platforms, but this is just an optimization,
+                       // so it doesn't matter.
+                       if (((uint)addr & 7) == 0) 
+                               *(long*)addr = val;
+                       else 
+                               String.memcpy (addr, (byte*)&val, 8);
                }
 
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               public extern static void WriteInt64 (IntPtr ptr, int ofs, long val);
+               public static unsafe void WriteInt64 (IntPtr ptr, int ofs, long val)
+               {
+                       byte *addr = ((byte *) ptr) + ofs;
+
+                       // The real alignment might be 4 on some platforms, but this is just an optimization,
+                       // so it doesn't matter.
+                       if (((uint)addr & 7) == 0) 
+                               *(long*)addr = val;
+                       else 
+                               String.memcpy (addr, (byte*)&val, 8);
+               }
 
                [MonoTODO]
                [SuppressUnmanagedCodeSecurity]
@@ -1084,11 +1200,19 @@ namespace System.Runtime.InteropServices
 
                public static void WriteIntPtr (IntPtr ptr, IntPtr val)
                {
-                       WriteIntPtr (ptr, 0, val);
+                       if (IntPtr.Size == 4)
+                               WriteInt32 (ptr, (int)val);
+                       else
+                               WriteInt64 (ptr, (long)val);
                }
 
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               public extern static void WriteIntPtr (IntPtr ptr, int ofs, IntPtr val);
+               public static void WriteIntPtr (IntPtr ptr, int ofs, IntPtr val)
+               {
+                       if (IntPtr.Size == 4)
+                               WriteInt32 (ptr, ofs, (int)val);
+                       else
+                               WriteInt64 (ptr, ofs, (long)val);
+               }
 
                [MonoTODO]
                public static void WriteIntPtr([In, Out, MarshalAs(UnmanagedType.AsAny)] object ptr, int ofs, IntPtr val)
index cf59c6138454b12d90b5eff711adf58a757da315..1f6e451c83193e25f5f6291f867e8a61009285e7 100644 (file)
@@ -347,7 +347,7 @@ namespace System.Threading.Tasks
                                continuation.Execute ();
                }
 
-               void RemoveContinuation (IContinuation continuation)
+               internal void RemoveContinuation (IContinuation continuation)
                {
                        continuations.Remove (continuation);
                }
index a48c5cdd5c275b9681459399f00d3869a4e505ae..8189df744b867defe928bf5a56d04dd12c905f34 100644 (file)
@@ -256,12 +256,13 @@ namespace System.Threading.Tasks
        {
                readonly Task<T> owner;
                readonly IList<T> tasks;
-               AtomicBooleanValue executed = new AtomicBooleanValue ();
+               AtomicBooleanValue executed;
 
                public WhenAnyContinuation (Task<T> owner, IList<T> tasks)
                {
                        this.owner = owner;
                        this.tasks = tasks;
+                       executed = new AtomicBooleanValue ();
                }
 
                public void Execute ()
@@ -269,13 +270,19 @@ namespace System.Threading.Tasks
                        if (!executed.TryRelaxedSet ())
                                return;
 
+                       bool owner_notified = false;
                        for (int i = 0; i < tasks.Count; ++i) {
                                var task = tasks[i];
-                               if (!task.IsCompleted)
+                               if (!task.IsCompleted) {
+                                       task.RemoveContinuation (this);
+                                       continue;
+                               }
+
+                               if (owner_notified)
                                        continue;
 
                                owner.TrySetResult (task);
-                               return;
+                               owner_notified = true;
                        }
                }
        }
index 99304d33dbc9e6b9cb983dfbff795f5d69bffcc9..5ebd4db216e38dbe783e4d6174a92d63f10acb41 100644 (file)
@@ -195,6 +195,9 @@ namespace System {
 
                public Evidence Evidence {
                        get {
+#if MONOTOUCH
+                               return null;
+#else
                                // if the host (runtime) hasn't provided it's own evidence...
                                if (_evidence == null) {
                                        // ... we will provide our own
@@ -215,6 +218,7 @@ namespace System {
                                        }
                                }
                                return new Evidence ((Evidence)_evidence);      // return a copy
+#endif
                        }
                }
 
index db82bdcf924154678b2d96f359d323b04c80f515..2f90fbd131be5a982ef04f7d984020f5b257d767 100644 (file)
@@ -2808,8 +2808,14 @@ namespace System
                                return;
                        
                        T [] a = new T [newSize];
-                       if (length != 0)
-                               FastCopy (arr, 0, a, 0, Math.Min (newSize, length));
+                       int tocopy = Math.Min (newSize, length);
+
+                       if (tocopy < 9) {
+                               for (int i = 0; i < tocopy; ++i)
+                                       UnsafeStore (a, i, UnsafeLoad (arr, i));
+                       } else {
+                               FastCopy (arr, 0, a, 0, tocopy);
+                       }
                        array = a;
                }
                
index 086f35059acee6b698876d9e787eff1844bb7ff9..6185ae95621eff2b617da03ab1c601b6b522006c 100644 (file)
@@ -2003,10 +2003,9 @@ namespace System
                        if (format == null || format == String.Empty)
                                format = "G";
 
-                       bool useutc = false, use_invariant = false;
-
                        if (format.Length == 1) {
                                char fchar = format [0];
+                               bool use_invariant, useutc;
                                format = DateTimeUtils.GetStandardPattern (fchar, dfi, out useutc, out use_invariant);
                                if (fchar == 'U')
                                        return DateTimeUtils.ToString (ToUniversalTime (), format, dfi);
@@ -2014,6 +2013,9 @@ namespace System
 
                                if (format == null)
                                        throw new FormatException ("format is not one of the format specifier characters defined for DateTimeFormatInfo");
+
+                               if (use_invariant)
+                                       dfi = DateTimeFormatInfo.InvariantInfo;
                        }
 
                        // Don't convert UTC value. It just adds 'Z' for 
index 3def45668ade3752711a5dbc9e42987f04844e48..61bbe7a5db6a6d584aecfba759efba264e021f00 100644 (file)
@@ -184,13 +184,6 @@ namespace System {
                        // Add + 10 for cases like mmmm dddd
                        StringBuilder result = new StringBuilder (format.Length + 10);
 
-                       // For some cases, the output should not use culture dependent calendar
-                       DateTimeFormatInfo inv = DateTimeFormatInfo.InvariantInfo;
-                       if (format == inv.RFC1123Pattern)
-                               dfi = inv;
-                       else if (format == inv.UniversalSortableDateTimePattern)
-                               dfi = inv;
-
                        int i = 0;
                        bool saw_day_specifier = false;
 
index 7610e43dcba91223566c8c34a4e9a3b4a517e163..91b02e64a8e7e3de0f5b89811b2fac6604ed642e 100644 (file)
@@ -565,7 +565,7 @@ namespace System
 
                internal bool IsTransparentProxy ()
                {
-#if MONOTOUCH
+#if DISABLE_REMOTING
                        return false;
 #else
                        return RemotingServices.IsTransparentProxy (m_target);
index b65e3b106964eae061f23d359a90f40f4fe516c4..b78c0a5b14ec32b54a26167defe075bf8f6734db 100644 (file)
@@ -461,10 +461,9 @@ namespace System {
 
                        int number = 0;
                        int nDigits = 0;
-                       bool decimalPointFound = false;
+                       int decimalPointPos = -1;
                        int digitValue;
                        char hexDigit;
-                       int exponent = 0;
                                
                        // Number stuff
                        do {
@@ -474,18 +473,20 @@ namespace System {
                                            (FindOther (ref pos, s, nfi.NumberGroupSeparator)
                                                || FindOther (ref pos, s, nfi.CurrencyGroupSeparator)))
                                            continue;
-                                       else
-                                       if (!decimalPointFound && AllowDecimalPoint &&
+
+                                       if (AllowDecimalPoint && decimalPointPos < 0 &&
                                            (FindOther (ref pos, s, nfi.NumberDecimalSeparator)
                                                || FindOther (ref pos, s, nfi.CurrencyDecimalSeparator))) {
-                                           decimalPointFound = true;
+                                               decimalPointPos = nDigits;
                                            continue;
                                        }
 
                                        break;
                                }
+
+                               nDigits++;
+
                                if (AllowHexSpecifier) {
-                                       nDigits++;
                                        hexDigit = s [pos++];
                                        if (Char.IsDigit (hexDigit))
                                                digitValue = (int) (hexDigit - '0');
@@ -503,34 +504,18 @@ namespace System {
                                        } else {
                                                number = (int)checked (unumber * 16u + (uint)digitValue);
                                        }
+
+                                       continue;
                                }
-                               else if (decimalPointFound) {
-                                       nDigits++;
-                                       // Allows decimal point as long as it's only 
-                                       // followed by zeroes.
-                                       if (s [pos++] != '0') {
-                                               if (!tryParse)
-                                                       exc = new OverflowException ("Value too large or too " +
-                                                                       "small.");
-                                               return false;
-                                       }
-                               }
-                               else {
-                                       nDigits++;
-
-                                       try {
-                                               // Calculations done as negative
-                                               // (abs (MinValue) > abs (MaxValue))
-                                               number = checked (
-                                                       number * 10 - 
-                                                       (int) (s [pos++] - '0')
-                                                       );
-                                       } catch (OverflowException) {
-                                               if (!tryParse)
-                                                       exc = new OverflowException ("Value too large or too " +
-                                                                       "small.");
-                                               return false;
-                                       }
+
+                               try {
+                                       // Calculations done as negative
+                                       // (abs (MinValue) > abs (MaxValue))
+                                       number = checked (number * 10 - (int) (s [pos++] - '0'));
+                               } catch (OverflowException) {
+                                       if (!tryParse)
+                                               exc = new OverflowException ("Value too large or too small.");
+                                       return false;
                                }
                        } while (pos < s.Length);
 
@@ -541,6 +526,7 @@ namespace System {
                                return false;
                        }
 
+                       int exponent = 0;
                        if (AllowExponent)
                                if (FindExponent (ref pos, s, ref exponent, tryParse, ref exc) && exc != null)
                                        return false;
@@ -599,11 +585,28 @@ namespace System {
                                        number = checked (-number);
                        }
 
-                       // result *= 10^exponent
-                       if (exponent > 0) {
+                       if (decimalPointPos >= 0)
+                               exponent = exponent - nDigits + decimalPointPos;
+                       
+                       if (exponent < 0) {
+                               //
+                               // Any non-zero values after decimal point are not allowed
+                               //
+                               int remainder;
+                               number = Math.DivRem (number, (int) Math.Pow (10, -exponent), out remainder);
+                               if (remainder != 0) {
+                                       if (!tryParse)
+                                               exc = new OverflowException ("Value too large or too small.");
+                                       return false;
+                               }
+                       } else if (exponent > 0) {
+                               //
+                               // result *= 10^exponent
+                               //
                                // Reduce the risk of throwing an overflow exc
+                               //
                                double res = checked (Math.Pow (10, exponent) * number);
-                               if (res < Int32.MinValue || res > Int32.MaxValue) {
+                               if (res < MinValue || res > MaxValue) {
                                        if (!tryParse)
                                                exc = new OverflowException ("Value too large or too small.");
                                        return false;
index b96cfdb7f8a3625db7aaeecacb459e176f08c753..09538f8ea6e59eca30c9301f37bdd7552e96d617 100644 (file)
@@ -293,10 +293,9 @@ namespace System {
                        
                        long number = 0;
                        int nDigits = 0;
-                       bool decimalPointFound = false;
+                       int decimalPointPos = -1;
                        int digitValue;
                        char hexDigit;
-                       int exponent = 0;
                                
                        // Number stuff
                        do {
@@ -306,18 +305,20 @@ namespace System {
                                            (Int32.FindOther (ref pos, s, nfi.NumberGroupSeparator)
                                                || Int32.FindOther (ref pos, s, nfi.CurrencyGroupSeparator)))
                                            continue;
-                                       else
-                                       if (!decimalPointFound && AllowDecimalPoint &&
+
+                                       if (AllowDecimalPoint && decimalPointPos < 0 &&
                                            (Int32.FindOther (ref pos, s, nfi.NumberDecimalSeparator)
                                                || Int32.FindOther (ref pos, s, nfi.CurrencyDecimalSeparator))) {
-                                           decimalPointFound = true;
+                                           decimalPointPos = nDigits;
                                            continue;
                                        }
 
                                        break;
                                }
+
+                               nDigits++;
+
                                if (AllowHexSpecifier) {
-                                       nDigits++;
                                        hexDigit = s [pos++];
                                        if (Char.IsDigit (hexDigit))
                                                digitValue = (int) (hexDigit - '0');
@@ -336,35 +337,19 @@ namespace System {
                                                        exc = e;
                                                return false;
                                        }
-                               }
-                               else if (decimalPointFound) {
-                                       nDigits++;
-                                       // Allows decimal point as long as it's only 
-                                       // followed by zeroes.
-                                       if (s [pos++] != '0') {
-                                               if (!tryParse)
-                                                       exc = new OverflowException ("Value too large or too " +
-                                                                       "small.");
-                                               return false;
-                                       }
-                               }
-                               else {
-                                       nDigits++;
 
-                                       try {
-                                               // Calculations done as negative
-                                               // (abs (MinValue) > abs (MaxValue))
-                                               number = checked (
-                                                       number * 10 - 
-                                                       (long) (s [pos++] - '0')
-                                                       );
-                                       } catch (OverflowException) {
-                                               if (!tryParse)
-                                                       exc = new OverflowException ("Value too large or too " +
-                                                                       "small.");
-                                               return false;
-                                       }
+                                       continue;
                                }
+
+                               try {
+                                       // Calculations done as negative
+                                       // (abs (MinValue) > abs (MaxValue))
+                                       number = checked (number * 10 - (long) (s [pos++] - '0'));
+                               } catch (OverflowException) {
+                                       if (!tryParse)
+                                               exc = new OverflowException ("Value too large or too small.");
+                                       return false;
+                               }                               
                        } while (pos < s.Length);
 
                        // Post number stuff
@@ -374,6 +359,7 @@ namespace System {
                                return false;
                        }
 
+                       int exponent = 0;
                        if (AllowExponent)
                                if (Int32.FindExponent (ref pos, s, ref exponent, tryParse, ref exc) && exc != null)
                                        return false;
@@ -431,17 +417,34 @@ namespace System {
                                }
                        }
 
-                       // result *= 10^exponent
-                       if (exponent > 0) {
+                       if (decimalPointPos >= 0)
+                               exponent = exponent - nDigits + decimalPointPos;
+                       
+                       if (exponent < 0) {
+                               //
+                               // Any non-zero values after decimal point are not allowed
+                               //
+                               long remainder;
+                               number = Math.DivRem (number, (long) Math.Pow (10, -exponent), out remainder);
+                               if (remainder != 0) {
+                                       if (!tryParse)
+                                               exc = new OverflowException ("Value too large or too small.");
+                                       return false;
+                               }
+                       } else if (exponent > 0) {
+                               //
+                               // result *= 10^exponent
+                               //
                                // Reduce the risk of throwing an overflow exc
+                               //
                                double res = checked (Math.Pow (10, exponent) * number);
-                               if (res < Int32.MinValue || res > Int32.MaxValue) {
+                               if (res < MinValue || res > MaxValue) {
                                        if (!tryParse)
                                                exc = new OverflowException ("Value too large or too small.");
                                        return false;
                                }
 
-                               number = (long) res;
+                               number = (long)res;
                        }
 
                        result = number;
index 1b36f47d372556da378adc0b7f3946659d67d0d6..e8ca505de18e06bdaa06e9fad7c63672b0a9d95c 100644 (file)
@@ -224,6 +224,12 @@ namespace System
                {
                        return (IntPtr) (unchecked (((byte *) pointer) - offset));
                }
+#else
+               /* Needed by Marshal.cs */
+               internal static IntPtr Add (IntPtr pointer, int offset)
+               {
+                       return (IntPtr) (unchecked (((byte *) pointer) + offset));
+               }
 #endif
        }
 }
index 819970e7568bd022de145bd34f5a6681938966be..f78ee9dbab20297f91be7f9e9db1cd9425a01742 100644 (file)
@@ -271,10 +271,9 @@ namespace System
 
                        uint number = 0;
                        int nDigits = 0;
-                       bool decimalPointFound = false;
+                       int decimalPointPos = -1;
                        uint digitValue;
                        char hexDigit;
-                       int exponent = 0;
 
                        // Number stuff
                        // Just the same as Int32, but this one adds instead of substract
@@ -285,18 +284,20 @@ namespace System
                                            (Int32.FindOther (ref pos, s, nfi.NumberGroupSeparator)
                                                || Int32.FindOther (ref pos, s, nfi.CurrencyGroupSeparator)))
                                                continue;
-                                       else
-                                               if (!decimalPointFound && AllowDecimalPoint &&
+                                       
+                                       if (AllowDecimalPoint && decimalPointPos < 0 &&
                                            (Int32.FindOther (ref pos, s, nfi.NumberDecimalSeparator)
                                                || Int32.FindOther (ref pos, s, nfi.CurrencyDecimalSeparator))) {
-                                                       decimalPointFound = true;
+                                                       decimalPointPos = nDigits;
                                                        continue;
                                                }
 
                                        break;
                                }
+
+                               nDigits++;
+
                                if (AllowHexSpecifier) {
-                                       nDigits++;
                                        hexDigit = s [pos++];
                                        if (Char.IsDigit (hexDigit))
                                                digitValue = (uint) (hexDigit - '0');
@@ -313,28 +314,16 @@ namespace System
                                                number = (uint) l;
                                        } else
                                                number = checked (number * 16 + digitValue);
+
+                                       continue;
                                }
-                               else if (decimalPointFound) {
-                                       nDigits++;
-                                       // Allows decimal point as long as it's only 
-                                       // followed by zeroes.
-                                       if (s [pos++] != '0') {
-                                               if (!tryParse)
-                                                       exc = new OverflowException (Locale.GetText ("Value too large or too small."));
-                                               return false;
-                                       }
-                               }
-                               else {
-                                       nDigits++;
 
-                                       try {
-                                               number = checked (number * 10 + (uint) (s [pos++] - '0'));
-                                       }
-                                       catch (OverflowException) {
-                                               if (!tryParse)
-                                                       exc = new OverflowException (Locale.GetText ("Value too large or too small."));
-                                               return false;
-                                       }
+                               try {
+                                       number = checked (number * 10 + (uint) (s [pos++] - '0'));
+                               } catch (OverflowException) {
+                                       if (!tryParse)
+                                               exc = new OverflowException (Locale.GetText ("Value too large or too small."));
+                                       return false;
                                }
                        } while (pos < s.Length);
 
@@ -345,6 +334,7 @@ namespace System
                                return false;
                        }
 
+                       int exponent = 0;
                        if (AllowExponent)
                                if (Int32.FindExponent (ref pos, s, ref exponent, tryParse, ref exc) && exc != null)
                                        return false;
@@ -400,21 +390,37 @@ namespace System
                                return false;
                        }
 
-                       // result *= 10^exponent
-                       if (exponent > 0) {
+                       if (decimalPointPos >= 0)
+                               exponent = exponent - nDigits + decimalPointPos;
+                       
+                       if (exponent < 0) {
+                               //
+                               // Any non-zero values after decimal point are not allowed
+                               //
+                               long remainder;
+                               number = (uint) Math.DivRem (number, (int) Math.Pow (10, -exponent), out remainder);
+                               if (remainder != 0) {
+                                       if (!tryParse)
+                                               exc = new OverflowException ("Value too large or too small.");
+                                       return false;
+                               }
+                       } else if (exponent > 0) {
+                               //
+                               // result *= 10^exponent
+                               //
                                // Reduce the risk of throwing an overflow exc
+                               //
                                double res = checked (Math.Pow (10, exponent) * number);
-                               if (res < Int32.MinValue || res > Int32.MaxValue) {
+                               if (res < MinValue || res > MaxValue) {
                                        if (!tryParse)
                                                exc = new OverflowException ("Value too large or too small.");
                                        return false;
                                }
 
-                               number = (uint) res;
+                               number = (uint)res;
                        }
 
                        result = number;
-
                        return true;
                }
 
index 922e763e0a681de5135eaf98269bb3b0af27a12f..1ac283149a609796ad3c88d0bbe9b4eb2ec9c3a4 100644 (file)
@@ -294,10 +294,9 @@ namespace System
 
                        ulong number = 0;
                        int nDigits = 0;
-                       bool decimalPointFound = false;
+                       int decimalPointPos = -1;
                        ulong digitValue;
                        char hexDigit;
-                       int exponent = 0;
 
                        // Number stuff
                        // Just the same as Int32, but this one adds instead of substract
@@ -308,18 +307,20 @@ namespace System
                                            (Int32.FindOther (ref pos, s, nfi.NumberGroupSeparator)
                                                || Int32.FindOther (ref pos, s, nfi.CurrencyGroupSeparator)))
                                                continue;
-                                       else
-                                               if (!decimalPointFound && AllowDecimalPoint && 
+                                       
+                                       if (AllowDecimalPoint && decimalPointPos < 0 &&
                                            (Int32.FindOther (ref pos, s, nfi.NumberDecimalSeparator)
                                                || Int32.FindOther (ref pos, s, nfi.CurrencyDecimalSeparator))) {
-                                                       decimalPointFound = true;
+                                                       decimalPointPos = nDigits;
                                                        continue;
                                                }
 
                                        break;
                                }
+
+                               nDigits++;
+
                                if (AllowHexSpecifier) {
-                                       nDigits++;
                                        hexDigit = s [pos++];
                                        if (Char.IsDigit (hexDigit))
                                                digitValue = (ulong) (hexDigit - '0');
@@ -338,28 +339,16 @@ namespace System
                                                        return false;
                                        } else
                                                number = checked (number * 16 + digitValue);
+
+                                       continue;
                                }
-                               else if (decimalPointFound) {
-                                       nDigits++;
-                                       // Allows decimal point as long as it's only 
-                                       // followed by zeroes.
-                                       if (s [pos++] != '0') {
-                                               if (!tryParse)
-                                                       exc = new OverflowException (Locale.GetText ("Value too large or too small."));
-                                               return false;
-                                       }
-                               }
-                               else {
-                                       nDigits++;
 
-                                       try {
-                                               number = checked (number * 10 + (ulong) (s [pos++] - '0'));
-                                       }
-                                       catch (OverflowException) {
-                                               if (!tryParse)
-                                                       exc = new OverflowException (Locale.GetText ("Value too large or too small."));
-                                               return false;
-                                       }
+                               try {
+                                       number = checked (number * 10 + (ulong) (s [pos++] - '0'));
+                               } catch (OverflowException) {
+                                       if (!tryParse)
+                                               exc = new OverflowException (Locale.GetText ("Value too large or too small."));
+                                       return false;
                                }
                        } while (pos < s.Length);
 
@@ -370,6 +359,7 @@ namespace System
                                return false;
                        }
 
+                       int exponent = 0;
                        if (AllowExponent)
                                if (Int32.FindExponent (ref pos, s, ref exponent, tryParse, ref exc) && exc != null)
                                        return false;
@@ -425,17 +415,34 @@ namespace System
                                return false;
                        }
 
-                       // result *= 10^exponent
-                       if (exponent > 0) {
+                       if (decimalPointPos >= 0)
+                               exponent = exponent - nDigits + decimalPointPos;
+                       
+                       if (exponent < 0) {
+                               //
+                               // Any non-zero values after decimal point are not allowed
+                               //
+                               long remainder;
+                               number = (ulong) Math.DivRem ((long) number, (long) Math.Pow (10, -exponent), out remainder);
+                               if (remainder != 0) {
+                                       if (!tryParse)
+                                               exc = new OverflowException ("Value too large or too small.");
+                                       return false;
+                               }
+                       } else if (exponent > 0) {
+                               //
+                               // result *= 10^exponent
+                               //
                                // Reduce the risk of throwing an overflow exc
+                               //
                                double res = checked (Math.Pow (10, exponent) * number);
-                               if (res < Int32.MinValue || res > Int32.MaxValue) {
+                               if (res < MinValue || res > MaxValue) {
                                        if (!tryParse)
                                                exc = new OverflowException ("Value too large or too small.");
                                        return false;
                                }
 
-                               number = (ulong) res;
+                               number = (ulong)res;
                        }
 
                        result = number;
index d84de5b2a070a1a4bcfe256a81b02e3580ad180b..4a6ac7db8a086cc2b23c5206f3044aabf1d2d212 100644 (file)
@@ -568,6 +568,8 @@ namespace MonoTests.System.Globalization
                {
                        Assert.AreEqual (31748, new CultureInfo ("zh-Hant").LCID);
                        Assert.AreEqual (31748, CultureInfo.GetCultureInfo ("zh-Hant").LCID);
+                       Assert.AreEqual (31748, new CultureInfo ("zh-CHT").LCID);
+                       Assert.AreEqual (31748, new CultureInfo ("zh-CHT").Parent.LCID);
                }
                
                [Test]
index 0c6a8e247cb1b598d9ed6a5cfe279bcfb51ceaed..d3d388f6703af8d8e67d163e1b08b6f5de09c8e3 100644 (file)
@@ -121,6 +121,14 @@ namespace MonoTests.System.Globalization
                {
                        var dfi = new CultureInfo ("cs-CZ").DateTimeFormat;
                        Assert.AreEqual ("ledna", dfi.MonthGenitiveNames[0], "#1");
+                       Assert.AreEqual ("1.", dfi.AbbreviatedMonthGenitiveNames[0], "#2");
+               }
+
+               [Test]
+               public void QuoteInValue ()
+               {
+                       var culture = new CultureInfo("mt-MT");
+                       Assert.AreEqual ("dddd, d' ta\\' 'MMMM yyyy", culture.DateTimeFormat.LongDatePattern);
                }
 
 #if !TARGET_JVM
index bb401e4c6d8095c29cf0de6abedb5d36f0c21c1a..e0fa0691844f3ed6b7753e3be6861ece7893165f 100644 (file)
@@ -258,6 +258,61 @@ namespace MonoTests.System.Runtime.InteropServices
                        Assert.AreEqual (19, s.Length, "#2");
                }
 
+               [Test]
+               public void ReadIntByte ()
+               {
+                       IntPtr ptr = Marshal.AllocHGlobal (4);
+                       try {
+                               Marshal.WriteByte (ptr, 0, 0x1);
+                               Marshal.WriteByte (ptr, 1, 0x2);
+                               Assert.AreEqual (0x1, Marshal.ReadByte (ptr));
+                               Assert.AreEqual (0x1, Marshal.ReadByte (ptr, 0));
+                               Assert.AreEqual (0x2, Marshal.ReadByte (ptr, 1));
+                       } finally {
+                               Marshal.FreeHGlobal (ptr);
+                       }
+               }
+
+               [Test]
+               public void ReadInt16 ()
+               {
+                       IntPtr ptr = Marshal.AllocHGlobal (64);
+                       try {
+                               Marshal.WriteInt16 (ptr, 0, 0x1234);
+                               Marshal.WriteInt16 (ptr, 2, 0x4567);
+                               Marshal.WriteInt16 (ptr, 5, 0x4567);
+                               Assert.AreEqual (0x1234, Marshal.ReadInt16 (ptr));
+                               Assert.AreEqual (0x1234, Marshal.ReadInt16 (ptr, 0));
+                               Assert.AreEqual (0x4567, Marshal.ReadInt16 (ptr, 2));
+#if NET_4_5
+                               Assert.AreEqual (0x4567, Marshal.ReadInt16 ((ptr + 5)));
+#endif
+                               Assert.AreEqual (0x4567, Marshal.ReadInt16 (ptr, 5));
+                       } finally {
+                               Marshal.FreeHGlobal (ptr);
+                       }
+               }
+
+               [Test]
+               public void ReadInt32 ()
+               {
+                       IntPtr ptr = Marshal.AllocHGlobal (64);
+                       try {
+                               Marshal.WriteInt32 (ptr, 0, 0x12345678);
+                               Marshal.WriteInt32 (ptr, 4, 0x77654321);
+                               Marshal.WriteInt32 (ptr, 10, 0x77654321);
+                               Assert.AreEqual (0x12345678, Marshal.ReadInt32 (ptr));
+                               Assert.AreEqual (0x12345678, Marshal.ReadInt32 (ptr, 0));
+                               Assert.AreEqual (0x77654321, Marshal.ReadInt32 (ptr, 4));
+#if NET_4_5
+                               Assert.AreEqual (0x77654321, Marshal.ReadInt32 ((ptr + 10)));
+#endif
+                               Assert.AreEqual (0x77654321, Marshal.ReadInt32 (ptr, 10));
+                       } finally {
+                               Marshal.FreeHGlobal (ptr);
+                       }
+               }
+
                [Test]
                public void ReadInt32_Endian ()
                {
@@ -278,6 +333,21 @@ namespace MonoTests.System.Runtime.InteropServices
                        }
                }
 
+               [Test]
+               public void ReadInt64 ()
+               {
+                       IntPtr ptr = Marshal.AllocHGlobal (16);
+                       try {
+                               Marshal.WriteInt64 (ptr, 0, 0x12345678ABCDEFL);
+                               Marshal.WriteInt64 (ptr, 8, 0x87654321ABCDEFL);
+                               Assert.AreEqual (0x12345678ABCDEFL, Marshal.ReadInt64 (ptr));
+                               Assert.AreEqual (0x12345678ABCDEFL, Marshal.ReadInt64 (ptr, 0));
+                               Assert.AreEqual (0x87654321ABCDEFL, Marshal.ReadInt64 (ptr, 8));
+                       } finally {
+                               Marshal.FreeHGlobal (ptr);
+                       }
+               }
+
                [Test]
                [Category ("MobileNotWorking")]
                public void BSTR_Roundtrip ()
@@ -691,6 +761,18 @@ namespace MonoTests.System.Runtime.InteropServices
                                Marshal.FreeHGlobal (p);
                        }
                }
+
+               [StructLayout (LayoutKind.Sequential)]
+               public struct SimpleStruct2 {
+                       public int a;
+                       public int b;
+               }
+
+               [Test]
+               public void PtrToStructureNull ()
+               {
+                       Assert.IsNull (Marshal.PtrToStructure (IntPtr.Zero, typeof (SimpleStruct2)));
+               }
                
 #if NET_2_0
                [Test]
index 05fd44ea5283dcbb951c7e0367255f842af2f313..72da88876a39560a6346d53f6c8fbd9e59639fec 100644 (file)
@@ -2265,6 +2265,10 @@ namespace MonoTests.System
                        Assert.AreEqual ("2000-01-01T00:00:00.0000000Z", DateTime.SpecifyKind (new DateTime (2000, 1, 1), DateTimeKind.Utc).ToString ("o"), "#2");
                        Assert.AreEqual ("2000-01-01T00:00:00.0000000+09:00".Length, DateTime.SpecifyKind (
                                new DateTime (2000, 1, 1), DateTimeKind.Local).ToString ("o").Length, "#3");
+
+                       var culture = new CultureInfo ("ps-AF");
+                       Assert.AreEqual ("1976-06-19T00:00:00.0000000", new DateTime(1976, 6, 19).ToString ("O", culture), "#4");
+                       Assert.AreEqual ("1976-06-19T00:00:00.0000000", new DateTime(1976, 6, 19).ToString ("o", culture), "#5");
                }
 
                [Test]
index b70be0c4239cca85d68dd33dc72a414aaa592317..4339edce397aa1eefbc4b5ce519e857081382055 100644 (file)
@@ -1129,6 +1129,13 @@ namespace MonoTests.System
                        }
                }
 */
+
+               [Test]
+               public void ParseCultureSeparator ()
+               {
+                       Assert.AreEqual (2.2m, decimal.Parse ("2.2", new CultureInfo("es-MX")));
+               }
+
                [Test]
                [Category ("TargetJvmNotWorking")]
                public void TryParse ()
index edd94252d1266fc950897c7b6ac2fe444746eb7d..5859f1d6f408a85035381c29b6434e42db38e058 100644 (file)
@@ -258,6 +258,15 @@ namespace MonoTests.System
                        }
                }
 
+               [Test]
+               public void Parse_Infinity ()
+               {
+                       double value;
+                       IFormatProvider german = new CultureInfo ("de-DE");
+                       var res = double.Parse ("+unendlich", NumberStyles.Float, german);
+                       Assert.AreEqual (double.PositiveInfinity, res);
+               }
+
                [Test]
                public void TestToString ()
                {
index 60c756a903431d66a9a99774520b7b700833cad2..128cc19790df3809993d52f43a8308e197ea9124 100644 (file)
@@ -274,6 +274,10 @@ public class Int32Test
                Assert.AreEqual (2000000, Int32.Parse ("2E6", NumberStyles.AllowExponent), "A#4");
                Assert.AreEqual (200, Int32.Parse ("2E+2", NumberStyles.AllowExponent), "A#5");
                Assert.AreEqual (2, Int32.Parse ("2", NumberStyles.AllowExponent), "A#6");
+               Assert.AreEqual (21, Int32.Parse ("2.1E1", NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent), "A#7");
+               Assert.AreEqual (520, Int32.Parse (".52E3", NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent), "A#8");
+               Assert.AreEqual (32500000, Int32.Parse ("32.5E6", NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent), "A#9");
+               Assert.AreEqual (890, Int32.Parse ("8.9000E2", NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent), "A#10");
 
                try {
                        Int32.Parse ("2E");
@@ -323,6 +327,12 @@ public class Int32Test
                        Assert.Fail ("B#8");
                } catch (FormatException) {
                }
+
+               try {
+                       Int32.Parse ("2.09E1",  NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent);
+                       Assert.Fail ("B#9");
+               } catch (OverflowException) {
+               }               
        }
 
        [Test]
index b1b6b079b40e13beb8f68e50c98b76e32af8576e..6ad5e36ce4882974205e66d3965a86824265d52f 100644 (file)
@@ -330,6 +330,10 @@ public class Int64Test
                Assert.AreEqual (2000000, long.Parse ("2E6", NumberStyles.AllowExponent), "A#4");
                Assert.AreEqual (200, long.Parse ("2E+2", NumberStyles.AllowExponent), "A#5");
                Assert.AreEqual (2, long.Parse ("2", NumberStyles.AllowExponent), "A#6");
+               Assert.AreEqual (21, long.Parse ("2.1E1", NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent), "A#7");
+               Assert.AreEqual (520, long.Parse (".52E3", NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent), "A#8");
+               Assert.AreEqual (32500000, long.Parse ("32.5E6", NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent), "A#9");
+               Assert.AreEqual (890, long.Parse ("8.9000E2", NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent), "A#10");            
 
                try {
                        long.Parse ("2E");
@@ -379,6 +383,12 @@ public class Int64Test
                        Assert.Fail ("B#8");
                } catch (FormatException) {
                }
+
+               try {
+                       long.Parse ("2.09E1",  NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent);
+                       Assert.Fail ("B#9");
+               } catch (OverflowException) {
+               }
        }
 
        [Test]
index 24396d72484c3aaea7f35c6788e60daa206d71a3..20f5a299e36fdf12f742ee4c953dde0a8f9f90e6 100644 (file)
@@ -214,6 +214,10 @@ public class UInt32Test
                Assert.AreEqual (2000000, uint.Parse ("2E6", NumberStyles.AllowExponent), "A#4");
                Assert.AreEqual (200, uint.Parse ("2E+2", NumberStyles.AllowExponent), "A#5");
                Assert.AreEqual (2, uint.Parse ("2", NumberStyles.AllowExponent), "A#6");
+               Assert.AreEqual (21, uint.Parse ("2.1E1", NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent), "A#7");
+               Assert.AreEqual (520, uint.Parse (".52E3", NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent), "A#8");
+               Assert.AreEqual (32500000, uint.Parse ("32.5E6", NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent), "A#9");
+               Assert.AreEqual (890, uint.Parse ("8.9000E2", NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent), "A#10");            
 
                try {
                        uint.Parse ("2E");
@@ -263,6 +267,12 @@ public class UInt32Test
                        Assert.Fail ("B#8");
                } catch (FormatException) {
                }
+
+               try {
+                       uint.Parse ("2.09E1",  NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent);
+                       Assert.Fail ("B#9");
+               } catch (OverflowException) {
+               }
        }
 
        [Test]
index 335d216a4fc2b0b67666bf14c6188d79b154b352..3fbf591517be0614e35ca171d86b9f9f8a93d612 100644 (file)
@@ -203,6 +203,10 @@ public class UInt64Test
                Assert.AreEqual (2000000, ulong.Parse ("2E6", NumberStyles.AllowExponent), "A#4");
                Assert.AreEqual (200, ulong.Parse ("2E+2", NumberStyles.AllowExponent), "A#5");
                Assert.AreEqual (2, ulong.Parse ("2", NumberStyles.AllowExponent), "A#6");
+               Assert.AreEqual (21, ulong.Parse ("2.1E1", NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent), "A#7");
+               Assert.AreEqual (520, ulong.Parse (".52E3", NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent), "A#8");
+               Assert.AreEqual (32500000, ulong.Parse ("32.5E6", NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent), "A#9");
+               Assert.AreEqual (890, ulong.Parse ("8.9000E2", NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent), "A#10");           
 
                try {
                        ulong.Parse ("2E");
@@ -252,6 +256,12 @@ public class UInt64Test
                        Assert.Fail ("B#8");
                } catch (FormatException) {
                }
+
+               try {
+                       ulong.Parse ("2.09E1",  NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent);
+                       Assert.Fail ("B#9");
+               } catch (OverflowException) {
+               }
        }
 
        [Test]
index c61e7382c092e097bbcf50d1c2f69c623ca4a54e..9436137d758ccd617cbf7d014de5e88adf9e51df 100644 (file)
@@ -116,7 +116,7 @@ LIB_MCS_FLAGS = \
        /r:System.Xml.Linq.dll                                            \
        /r:System.Configuration.dll
 
-TEST_MCS_FLAGS = /r:System.Core.dll /r:System.Xml.dll
+TEST_MCS_FLAGS = /r:System.dll /r:System.Core.dll /r:System.Xml.dll /r:AgilityPack.dll
 
 DOC_SOURCE_DIRS = \
        ../../docs \
@@ -130,7 +130,9 @@ $(the_lib): Makefile $(RESOURCE_FILES)
 
 all-local: $(the_lib).config Monodoc.Ecma/EcmaUrlParser.cs
 
-test-local: setup-doc-sources
+run-test-local: AgilityPack.dll
+
+test-local: setup-doc-sources AgilityPack.dll
 
 dist-local: Monodoc.Ecma/EcmaUrlParser.cs
 
@@ -146,3 +148,6 @@ parser.exe: Monodoc.Ecma/EcmaUrlParser.cs Monodoc.Ecma/EcmaUrlTokenizer.cs Monod
 setup-doc-sources: $(DOC_SOURCES)
        mkdir -p ./Test/monodoc_test/sources/
        cp $(DOC_SOURCES) ./Test/monodoc_test/sources/
+
+AgilityPack.dll:
+       cp $(topdir)/../docs/$(@) .
index 0974b07adf18b93b65692a82bdfef90961c809b0..c16645971de2957b1436d9183333da0206bfd930 100644 (file)
@@ -86,11 +86,26 @@ namespace Monodoc.Ecma
                        set;
                }
 
+               /* This property tells if the above collections only correct value
+                * is the number of item in it to represent generic arguments
+                */
+               public bool GenericTypeArgumentsIsNumeric {
+                       get {
+                               return GenericTypeArguments != null && GenericTypeArguments.FirstOrDefault () == null;
+                       }
+               }
+
                public IList<EcmaDesc> GenericMemberArguments {
                        get;
                        set;
                }
 
+               public bool GenericMemberArgumentsIsNumeric {
+                       get {
+                               return GenericMemberArguments != null && GenericMemberArguments.FirstOrDefault () == null;
+                       }
+               }
+
                public IList<EcmaDesc> MemberArguments {
                        get;
                        set;
@@ -304,27 +319,11 @@ namespace Monodoc.Ecma
                {
                        if (args == null || !args.Any ())
                                return string.Empty;
+                       // If we only have the number of generic arguments, use ` notation
+                       if (args.First () == null)
+                               return "`" + args.Count ();
 
-                       IEnumerable<string> argsList = null;
-
-                       // HACK: If we don't have fully specified EcmaDesc for generic arguments
-                       // we use the most common names for the argument length configuration
-                       if (args.Any (a => a == null)) {
-                               var argCount = args.Count ();
-                               switch (argCount) {
-                               case 1:
-                                       argsList = new string[] { "T" };
-                                       break;
-                               case 2:
-                                       argsList = new string[] { "TKey", "TValue" };
-                                       break;
-                               default:
-                                       argsList = Enumerable.Range (1, argCount).Select (i => "T" + i);
-                                       break;
-                               }
-                       } else {
-                               argsList = args.Select (t => FormatNamespace (t) + t.ToCompleteTypeName ());
-                       }
+                       IEnumerable<string> argsList = args.Select (t => FormatNamespace (t) + t.ToCompleteTypeName ());
 
                        return "<" + string.Join (",", argsList) + ">";
                }
index 151192096b1e686dabb49a3160a8692225ae8365..a4cabd8a7de2f1079d644563833557532a477d19 100644 (file)
@@ -80,8 +80,10 @@ namespace Monodoc.Ecma
                                return Token.COMMA;
                        case '.':
                                return Token.DOT;
+                       case '{':
                        case '<':
                                return Token.OP_GENERICS_LT;
+                       case '}':
                        case '>':
                                return Token.OP_GENERICS_GT;
                        case '`':
index ba1be8a1b6afd6c32b82570a7345dc6e84685520..e3371d141d0e46ab9a591ae2b590cc9532fdf0b9 100644 (file)
@@ -212,7 +212,10 @@ namespace Monodoc.Providers
                        currentNode = result;
                        result = null;
                        searchNode.Caption = desc.ToCompleteTypeName ();
-                       index = currentNode.ChildNodes.BinarySearch (searchNode, EcmaTypeNodeComparer.Instance);
+                       if (!desc.GenericTypeArgumentsIsNumeric)
+                               index = currentNode.ChildNodes.BinarySearch (searchNode, EcmaTypeNodeComparer.Instance);
+                       else
+                               index = GenericTypeBacktickSearch (currentNode.ChildNodes, desc);
                        if (index >= 0)
                                result = currentNode.ChildNodes[index];
                        if ((desc.DescKind == EcmaDesc.Kind.Type && !desc.IsEtc) || index < 0)
@@ -249,6 +252,48 @@ namespace Monodoc.Providers
                        return result;
                }
 
+               static int GenericTypeBacktickSearch (IList<Node> childNodes, EcmaDesc desc)
+               {
+                       /* Our strategy is to search for the non-generic variant of the type
+                        * (which in most case should fail) and then use the closest index
+                        * to linearily search for the generic variant with the right generic arg number
+                        */
+                       var searchNode = new Node () { Caption = desc.TypeName };
+                       int index = childNodes.BinarySearch (searchNode, EcmaTypeNodeComparer.Instance);
+                       // Place the index in the right start position
+                       if (index < 0)
+                               index = ~index;
+
+                       for (int i = index; i < childNodes.Count; i++) {
+                               var currentNode = childNodes[i];
+                               // Find the index of the generic argument list
+                               int genericIndex = currentNode.Caption.IndexOf ('<');
+                               // If we are not on the same base type name anymore, there is no point
+                               int captionSlice = genericIndex != -1 ? genericIndex : currentNode.Caption.LastIndexOf (' ');
+                               if (string.Compare (searchNode.Caption, 0,
+                                                   currentNode.Caption, 0,
+                                                   Math.Max (captionSlice, searchNode.Caption.Length),
+                                                   StringComparison.Ordinal) != 0)
+                                       break;
+
+                               var numGenerics = CountTypeGenericArguments (currentNode.Caption, genericIndex);
+                               if (numGenerics == desc.GenericTypeArguments.Count) {
+                                       // Simple comparison if we are not looking for an inner type
+                                       if (desc.NestedType == null)
+                                               return i;
+                                       // If more complicated, we fallback to using EcmaUrlParser
+                                       var caption = currentNode.Caption;
+                                       caption = "T:" + caption.Substring (0, caption.LastIndexOf (' ')).Replace ('.', '+');
+                                       EcmaDesc otherDesc;
+                                       var parser = new EcmaUrlParser ();
+                                       if (parser.TryParse (caption, out otherDesc) && desc.NestedType.Equals (otherDesc.NestedType))
+                                               return i;
+                               }
+                       }
+
+                       return -1;
+               }
+
                // This comparer returns the answer straight from caption comparison
                class EcmaGenericNodeComparer : IComparer<Node>
                {
@@ -436,6 +481,33 @@ namespace Monodoc.Providers
                        return null;
                }
 
+               public static int CountTypeGenericArguments (string typeDefinition, int startIndex = 0)
+               {
+                       int nestedLevel = 0;
+                       int count = 0;
+                       bool started = false;
+
+                       foreach (char c in typeDefinition.Skip (startIndex)) {
+                               switch (c) {
+                               case '<':
+                                       if (!started)
+                                               count = 1;
+                                       started = true;
+                                       nestedLevel++;
+                                       break;
+                               case ',':
+                                       if (started && nestedLevel == 1)
+                                               count++;
+                                       break;
+                               case '>':
+                                       nestedLevel--;
+                                       break;
+                               }
+                       }
+
+                       return count;
+               }
+
                internal static string MakeOperatorSignature (XElement member, out string memberSignature)
                {
                        string name = (string)member.Attribute ("MemberName");
index bcfeac518475167998e6aeded3b4e3e8a49bec61..e6872f2ca5d902b74b5532e6e869126bf0069c2a 100644 (file)
@@ -111,6 +111,7 @@ namespace MonoTests.Monodoc.Ecma
                        AssertValidUrl ("C:Gendarme.Rules.Concurrency.DecorateThreadsRule.DecorateThreadsRule(System.String)");
                        AssertValidUrl ("C:Gendarme.Framework.Helpers.MethodSignature.MethodSignature(string,string,string[],System.Func<Mono.Cecil.MethodReference,System.Boolean>)");
                        AssertValidUrl ("C:System.Collections.Generic.Dictionary<TKey,TValue>+KeyCollection.KeyCollection(System.Collections.Generic.Dictionary<TKey,TValue>)");
+                       AssertValidUrl ("C:Microsoft.Build.Utilities.TaskItem(System.String,System.Collections.IDictionary)");
                }
 
                [Test]
@@ -175,6 +176,22 @@ namespace MonoTests.Monodoc.Ecma
                        AssertValidUrl ("M:Microsoft.Win32.RegistryKey$System.IDisposable.Dispose");
                }
 
+               [Test]
+               public void AspNetSafeUrlValidTest ()
+               {
+                       AssertValidUrl ("M:MonoTouch.UIKit.UICollectionViewLayoutAttributes.CreateForCell{T}");
+               }
+
+               [Test]
+               public void GenericTypeArgsIsNumericTest ()
+               {
+                       var desc = parser.Parse ("T:System.Collections.Generic.Dictionary`2");
+                       Assert.IsTrue (desc.GenericTypeArgumentsIsNumeric);
+                       Assert.AreEqual (2, desc.GenericTypeArguments.Count);
+                       desc = parser.Parse ("T:System.Collections.Generic.Dictionary<TKey,TValue>");
+                       Assert.IsFalse (desc.GenericTypeArgumentsIsNumeric);
+               }
+
                [Test]
                public void MetaEtcNodeTest ()
                {
@@ -224,6 +241,25 @@ namespace MonoTests.Monodoc.Ecma
                        AssertUrlDesc (ast, "T:System.String<T>");
                }
 
+               [Test]
+               public void TypeWithOneGenericUrlParseTestUsingAspNetStyleUrl ()
+               {
+                       var generics = new[] {
+                               new EcmaDesc {
+                                       DescKind = EcmaDesc.Kind.Type,
+                                       Namespace = string.Empty,
+                                       TypeName = "T"
+                               }
+                       };
+                       var ast = new EcmaDesc () { DescKind = EcmaDesc.Kind.Type,
+                                                   TypeName = "String",
+                                                   Namespace = "System",
+                                                   GenericTypeArguments = generics,
+                       };
+
+                       AssertUrlDesc (ast, "T:System.String{T}");
+               }
+
                [Test]
                public void TypeWithNestedGenericUrlParseTest ()
                {
diff --git a/mcs/class/monodoc/Test/Monodoc/EcmaDocTests.cs b/mcs/class/monodoc/Test/Monodoc/EcmaDocTests.cs
new file mode 100644 (file)
index 0000000..9886846
--- /dev/null
@@ -0,0 +1,66 @@
+using System;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using Monodoc;
+using Monodoc.Generators;
+
+namespace MonoTests.Monodoc
+{
+       [TestFixture]
+       public class EcmaDocTest
+       {
+               // Because EcmaDoc is internal and we can't use InternalsVisibleTo since test assemblies aren't
+               // signed/strong-named by the build, we have to resort to reflection
+               TDelegate GetTestedMethod<TDelegate> (string methodName)
+               {
+                       var ecmaDoc = Type.GetType ("Monodoc.Providers.EcmaDoc, monodoc, PublicKey=0738eb9f132ed756");
+                       return (TDelegate)(object)Delegate.CreateDelegate (typeof (TDelegate), ecmaDoc.GetMethod (methodName));
+               }
+
+               [Test]
+               public void CountTypeGenericArgumentsTest ()
+               {
+                       var realCountTypeGenericArguments = GetTestedMethod<Func<string, int, int>> ("CountTypeGenericArguments");
+                       // Since we don't use the optional start index parameters, bypass it by wrapping the func
+                       Func<string, int> countTypeGenericArguments = s => realCountTypeGenericArguments (s, 0);
+
+                       Assert.AreEqual (0, countTypeGenericArguments ("T:System.String"), "#0a");
+                       Assert.AreEqual (0, countTypeGenericArguments ("T:String"), "#0b");
+                       Assert.AreEqual (0, countTypeGenericArguments ("String"), "#0c");
+
+                       Assert.AreEqual (1, countTypeGenericArguments ("T:System.Collections.Foo<T>"), "#1a");
+                       Assert.AreEqual (1, countTypeGenericArguments ("T:System.Foo<T>"), "#1b");
+                       Assert.AreEqual (1, countTypeGenericArguments ("T:Foo<T>"), "#1c");
+                       Assert.AreEqual (1, countTypeGenericArguments ("Foo<T>"), "#1d");
+
+                       Assert.AreEqual (2, countTypeGenericArguments ("T:System.Collections.Foo<T, U>"), "#2a");
+                       Assert.AreEqual (2, countTypeGenericArguments ("T:System.Foo<TKey, TValue>"), "#2b");
+                       Assert.AreEqual (2, countTypeGenericArguments ("T:Foo<Something,Else>"), "#2c");
+                       Assert.AreEqual (2, countTypeGenericArguments ("Foo<TDelegate,TArray>"), "#2d");
+
+                       Assert.AreEqual (3, countTypeGenericArguments ("T:System.Collections.Foo<T, U, V>"), "#3a");
+                       Assert.AreEqual (3, countTypeGenericArguments ("T:System.Foo<TKey, TValue, THash>"), "#3b");
+                       Assert.AreEqual (3, countTypeGenericArguments ("T:Foo<Something,Else,Really>"), "#3c");
+                       Assert.AreEqual (3, countTypeGenericArguments ("Foo<TDelegate,TArray,TEvent>"), "#3d");
+               }
+
+               [Test]
+               public void CountTypeGenericArgumentsTest_Nested ()
+               {
+                       var realCountTypeGenericArguments = GetTestedMethod<Func<string, int, int>> ("CountTypeGenericArguments");
+                       // Since we don't use the optional start index parameters, bypass it by wrapping the func
+                       Func<string, int> countTypeGenericArguments = s => realCountTypeGenericArguments (s, 0);
+
+                       Assert.AreEqual (1, countTypeGenericArguments ("T:System.Collections.Foo<T[]>"), "#1a");
+                       Assert.AreEqual (1, countTypeGenericArguments ("T:System.Collections.Foo<IList<T>>"), "#1b");
+                       Assert.AreEqual (2, countTypeGenericArguments ("T:System.Collections.Foo<T, KeyValuePair<T, U>>"), "#2a");
+                       Assert.AreEqual (2, countTypeGenericArguments ("T:System.Collections.Foo<T, KeyValuePair<IProducerConsumerCollection<U>, IEquatable<V>>>"), "#2b");
+                       Assert.AreEqual (3, countTypeGenericArguments ("T:System.Collections.Foo<T, IProducerConsumerCollection<U>, IEquatable<V>>"), "#3a");
+               }
+       }
+}
index 0dd7b2ccc1f6ae680f9a5860f2cc0911b53d9cc1..0e36598fb5be2a1a14d0690ced0ae9d39665df10 100644 (file)
@@ -6,6 +6,9 @@ using System.Collections.Generic;
 using NUnit.Framework;
 
 using Monodoc;
+using Monodoc.Generators;
+
+using HtmlAgilityPack;
 
 namespace MonoTests.Monodoc
 {
@@ -110,6 +113,95 @@ namespace MonoTests.Monodoc
                        Assert.IsTrue (rootTree.RenderUrl ("T:System.Collections.Concurrent.IProducerConsumerCollection`1", generator, out result), "#1");
                        Assert.IsTrue (rootTree.RenderUrl ("T:System.Collections.Generic.Dictionary`2", generator, out result), "#2");
                        Assert.IsTrue (rootTree.RenderUrl ("T:System.Action`4", generator, out result), "#3");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.EventHandler`1", generator, out result), "#4");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Func`5", generator, out result), "#5a");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Func`4", generator, out result), "#5b");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Func`6", generator, out result), "#5c");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Func`7", generator, out result), "#5d");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Func`3", generator, out result), "#5e");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Func`2", generator, out result), "#5f");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Func`1", generator, out result), "#5g");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Func`8", generator, out result), "#5h");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Func`9", generator, out result), "#5i");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Action`3", generator, out result), "#6a");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Action`2", generator, out result), "#6b");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Action`4", generator, out result), "#6c");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.IComparable`1", generator, out result), "#7");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Lazy`1", generator, out result), "#8");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Tuple`1", generator, out result), "#9a");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Tuple`2", generator, out result), "#9b");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Tuple`3", generator, out result), "#9c");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Tuple`4", generator, out result), "#9d");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Collections.Generic.Dictionary`2+ValueCollection", generator, out result), "#10");
+                       Assert.IsFalse (rootTree.RenderUrl ("T:System.EventHandler`2", generator, out result), "#11");
+                       Assert.IsFalse (rootTree.RenderUrl ("T:System.Lazy`2", generator, out result), "#12");
+               }
+
+               [Test]
+               public void AspNetStyleUrlReachabilityTest ()
+               {
+                       var rootTree = RootTree.LoadTree (Path.GetFullPath (BaseDir), false);
+                       Node result;
+                       var generator = new CheckGenerator ();
+
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Collections.Generic.Dictionary{TKey,TValue}", generator, out result), "#1");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Action{T1,T2}", generator, out result), "#2");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.EventHandler{TEventArgs}", generator, out result), "#3");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Func{T1,T2,T3,TResult}", generator, out result), "#4");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.Collections.Generic.Dictionary{TKey,TValue}+ValueCollection", generator, out result), "#5");
+                       Assert.IsTrue (rootTree.RenderUrl ("T:System.IComparable{T}", generator, out result), "#6");
+               }
+
+               [Test, Ignore ("Mono documentation is full of syntax errors so we can't use it reliably for this test")]
+               public void ReachabilityWithCrefsTest ()
+               {
+                       var rootTree = RootTree.LoadTree (Path.GetFullPath (BaseDir), false);
+                       Node result;
+                       var htmlGenerator = new HtmlGenerator (null);
+                       var crefs = new HashSet<string> ();
+                       var generator = new CheckGenerator ();
+                       int errorCount = 0;
+
+                       foreach (var leaf in GetLeaves (rootTree.RootNode)) {
+                               Dictionary<string, string> context;
+                               string internalId = leaf.Tree.HelpSource.GetInternalIdForUrl (leaf.PublicUrl, out result, out context);
+                               if (leaf.Tree.HelpSource.GetDocumentTypeForId (internalId) != DocumentType.EcmaXml)
+                                       continue;
+
+                               string content = null;
+                               if (string.IsNullOrEmpty (content = rootTree.RenderUrl (leaf.PublicUrl, htmlGenerator, out result)) || leaf != result) {
+                                       Console.WriteLine ("Error: {0} with HelpSource {1} ", leaf.PublicUrl, leaf.Tree.HelpSource.Name);
+                                       continue;
+                               }
+
+                               HtmlDocument doc = new HtmlDocument();
+                               try {
+                                       doc.LoadHtml (content);
+                               } catch {
+                                       Console.WriteLine ("Couldn't load a HTML document for URL {0}", leaf.PublicUrl);
+                                       continue;
+                               }
+
+                               foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]")) {
+                                       var newUrl = link.Attributes["href"].Value;
+                                       var hashIndex = newUrl.IndexOf ('#');
+                                       if (hashIndex != -1)
+                                               newUrl = newUrl.Substring (0, hashIndex);
+                                       if (newUrl.Length > 1 && newUrl[1] == ':' && char.IsLetter (newUrl, 0) && char.ToLowerInvariant (newUrl[0]) != 'c')
+                                               crefs.Add (newUrl);
+                               }
+
+                               foreach (var cref in crefs) {
+                                       if (!rootTree.RenderUrl (cref, generator, out result) || result == null) {
+                                               Console.WriteLine ("Error with cref: `{0}'", cref);
+                                               errorCount++;
+                                       }
+                               }
+
+                               crefs.Clear ();
+                       }
+
+                       Assert.AreEqual (0, errorCount, errorCount + " / " + crefs.Count);
                }
        }
 }
index e99ffeae1a4ff2d3a472b4efe04795fd78746013..b806b8fb6e970302dd755c331a070e831781639a 100644 (file)
@@ -1,4 +1,5 @@
 Monodoc/HelpSourceTests.cs
+Monodoc/EcmaDocTests.cs
 Monodoc/TreeTest.cs
 Monodoc.Ecma/EcmaUrlTests.cs
 Monodoc/SettingsTest.cs
diff --git a/mcs/errors/cs0012-19.cs b/mcs/errors/cs0012-19.cs
new file mode 100644 (file)
index 0000000..304229b
--- /dev/null
@@ -0,0 +1,13 @@
+// CS0012: The type `A1' is defined in an assembly that is not referenced. Consider adding a reference to assembly `CS0012-lib-missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
+// Line: 10
+// Compiler options: -r:CS0012-lib.dll
+
+class Test
+{
+       public static void Main ()
+       {
+               var b = new B ();
+               b.Test ();
+               b.Test ();
+       }
+}
\ No newline at end of file
diff --git a/mcs/errors/cs0012-20.cs b/mcs/errors/cs0012-20.cs
new file mode 100644 (file)
index 0000000..2747508
--- /dev/null
@@ -0,0 +1,19 @@
+// CS0012: The type `A1' is defined in an assembly that is not referenced. Consider adding a reference to assembly `CS0012-lib-missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
+// Line: 13
+// Compiler options: -r:CS0012-lib.dll
+
+using System.Threading.Tasks;
+
+class Test
+{
+       public static void Main ()
+       {
+               var b = new B ();
+               var t = Task.Factory.StartNew (() => {
+                       b.Test ();
+                       b.Test ();
+               });
+
+               b.Test ();
+       }
+}
\ No newline at end of file
diff --git a/mcs/errors/cs0154-5.cs b/mcs/errors/cs0154-5.cs
new file mode 100644 (file)
index 0000000..21f55ce
--- /dev/null
@@ -0,0 +1,19 @@
+// CS0154: The property or indexer `BugReport.MyProperty' cannot be used in this context because it lacks the `get' accessor
+// Line: 16
+
+static class BugReport
+{
+       static float MyProperty {
+               set { }
+       }
+
+       static void MyExtension (this float val)
+       {
+       }
+
+       public static void Main ()
+       {
+               MyProperty.MyExtension ();
+       }
+}
+
diff --git a/mcs/errors/cs0162-17.cs b/mcs/errors/cs0162-17.cs
new file mode 100644 (file)
index 0000000..821c741
--- /dev/null
@@ -0,0 +1,12 @@
+// CS0162: Unreachable code detected
+// Line: 10
+// Compiler options: -warnaserror
+
+public class X
+{
+       public static void Main ()
+       {
+               return;
+               1+1;
+       }
+}
\ No newline at end of file
diff --git a/mcs/errors/cs0185-2.cs b/mcs/errors/cs0185-2.cs
new file mode 100644 (file)
index 0000000..3fa0fff
--- /dev/null
@@ -0,0 +1,18 @@
+// CS0185: `method group' is not a reference type as required by the lock statement
+// Line: 15
+
+class MainClass
+{
+       public static void Main ()
+       {
+               lock (Bar.Buzz) {
+               }
+       }
+}
+
+class Bar
+{
+       internal void Buzz ()
+       {
+       }
+}
\ No newline at end of file
index e678aefccf1c5db62991309b79ad7ae2c940574c..83dfe5e7609225d76ab7baffa370ee82c047f029 100644 (file)
@@ -1,5 +1,5 @@
 // CS0185: `int' is not a reference type as required by the lock statement
-// Line:
+// Line: 7
 
 class X {
        static void Main ()
diff --git a/mcs/errors/cs0761-2.cs b/mcs/errors/cs0761-2.cs
new file mode 100644 (file)
index 0000000..09964af
--- /dev/null
@@ -0,0 +1,11 @@
+// CS0761: Partial method declarations of `C.Foo<U>()' have inconsistent constraints for type parameter `U'
+// Line: 8
+
+partial class C
+{
+       partial void Foo<T> () where T : new ();
+       
+       partial void Foo<U> ()
+       {
+       }
+}
diff --git a/mcs/errors/cs0761.cs b/mcs/errors/cs0761.cs
new file mode 100644 (file)
index 0000000..72b2744
--- /dev/null
@@ -0,0 +1,11 @@
+// CS0761: Partial method declarations of `C.Foo<T>()' have inconsistent constraints for type parameter `T'
+// Line: 8
+
+partial class C
+{
+       partial void Foo<U> ();
+       
+       partial void Foo<T> () where T : class
+       {
+       }
+}
diff --git a/mcs/errors/cs1001-8.cs b/mcs/errors/cs1001-8.cs
new file mode 100644 (file)
index 0000000..2462ee4
--- /dev/null
@@ -0,0 +1,10 @@
+// CS1001: Unexpected symbol `,', expecting identifier
+// Line: 8
+
+static class Converter
+{
+       static Dictionary<Options, string> options = new Dictionary<Options, string> () 
+       {
+               { Options., "I am completed!" },
+       };
+}
\ No newline at end of file
diff --git a/mcs/errors/cs1502-17.cs b/mcs/errors/cs1502-17.cs
new file mode 100644 (file)
index 0000000..e023551
--- /dev/null
@@ -0,0 +1,16 @@
+// CS1502: The best overloaded method match for `Foo.Test(int, string)' has some invalid arguments
+// Line: 14
+
+using System.Runtime.CompilerServices;
+
+public class Foo
+{
+       public void Test (int arg, [CallerMemberName] string s = null)
+       {
+       }
+
+       void X ()
+       {
+               Test ("");
+       }
+}
\ No newline at end of file
diff --git a/mcs/errors/cs1502-18.cs b/mcs/errors/cs1502-18.cs
new file mode 100644 (file)
index 0000000..4e1a0da
--- /dev/null
@@ -0,0 +1,18 @@
+// CS1502: The best overloaded method match for `X.Add(params object[])' has some invalid arguments
+// Line: 8
+
+class X
+{
+       public static void Main ()
+       {
+               Add (Foo (), Foo ());
+       }
+
+       public static void Add (params object[] args)
+       {
+       }
+
+       static void Foo ()
+       {
+       }
+}
\ No newline at end of file
diff --git a/mcs/errors/cs1519-5.cs b/mcs/errors/cs1519-5.cs
new file mode 100644 (file)
index 0000000..0ebf406
--- /dev/null
@@ -0,0 +1,7 @@
+// CS1519: Unexpected symbol `}' in class, struct, or interface member declaration
+// Line: 7
+
+public class Foo
+{
+       public f 
+}
\ No newline at end of file
diff --git a/mcs/errors/cs1525-52.cs b/mcs/errors/cs1525-52.cs
new file mode 100644 (file)
index 0000000..d10e856
--- /dev/null
@@ -0,0 +1,12 @@
+// CS1525: Unexpected symbol `}', expecting `by'
+// Line: 10
+
+class C
+{
+       public static void Main ()
+       {
+               var somelist = new List<object>();
+               var query = from item in somelist
+                       group a
+       }
+}
\ No newline at end of file
diff --git a/mcs/errors/cs1525-53.cs b/mcs/errors/cs1525-53.cs
new file mode 100644 (file)
index 0000000..0c248da
--- /dev/null
@@ -0,0 +1,7 @@
+// CS1525: Unexpected symbol `}', expecting `(', `,', `.', `:', `::', `]', or `<'
+// Line: 6
+
+class Foo
+{
+       [DllImport
+}
\ No newline at end of file
diff --git a/mcs/errors/cs1525-54.cs b/mcs/errors/cs1525-54.cs
new file mode 100644 (file)
index 0000000..faf331e
--- /dev/null
@@ -0,0 +1,10 @@
+// CS1525: Unexpected symbol `}'
+// Line: 8
+
+class MainClass
+{
+       public string Test ()
+       {
+               return true ? "Hello" :
+       }
+}
diff --git a/mcs/errors/cs1997-2.cs b/mcs/errors/cs1997-2.cs
new file mode 100644 (file)
index 0000000..9f8c533
--- /dev/null
@@ -0,0 +1,17 @@
+// CS1997: `System.Func<System.Threading.Tasks.Task>': A return keyword must not be followed by an expression when async delegate returns `Task'. Consider using `Task<T>' return type
+// Line: 12
+
+using System;
+using System.Threading.Tasks;
+
+class Test
+{
+       public static void Main()
+       {
+               Func<Task> t = async delegate {
+                       return null;
+               };
+
+               return;
+       }
+}
index fe16344ae0dccfeac67792434e9433441d1ded99..85fa42058ca1994702bcf568b21ae44e09f196ea 100644 (file)
@@ -569,6 +569,9 @@ namespace Mono.CSharp {
                protected virtual void EmitHoistedParameters (EmitContext ec, List<HoistedParameter> hoisted)
                {
                        foreach (HoistedParameter hp in hoisted) {
+                               if (hp == null)
+                                       continue;
+
                                //
                                // Parameters could be proxied via local fields for value type storey
                                //
@@ -851,6 +854,8 @@ namespace Mono.CSharp {
                        }
                }
 
+               public bool IsAssigned { get; set; }
+
                public ParameterReference Parameter {
                        get {
                                return parameter;
@@ -996,12 +1001,12 @@ namespace Mono.CSharp {
                                        return delegate_type;
 
                                ec.Report.Error (835, loc, "Cannot convert `{0}' to an expression tree of non-delegate type `{1}'",
-                                       GetSignatureForError (), TypeManager.CSharpName (delegate_type));
+                                       GetSignatureForError (), delegate_type.GetSignatureForError ());
                                return null;
                        }
 
                        ec.Report.Error (1660, loc, "Cannot convert `{0}' to non-delegate type `{1}'",
-                                     GetSignatureForError (), TypeManager.CSharpName (delegate_type));
+                                     GetSignatureForError (), delegate_type.GetSignatureForError ());
                        return null;
                }
 
@@ -1013,7 +1018,7 @@ namespace Mono.CSharp {
                        if (!ec.IsInProbingMode)
                                ec.Report.Error (1661, loc,
                                        "Cannot convert `{0}' to delegate type `{1}' since there is a parameter mismatch",
-                                       GetSignatureForError (), TypeManager.CSharpName (delegate_type));
+                                       GetSignatureForError (), delegate_type.GetSignatureForError ());
 
                        return false;
                }
@@ -1025,7 +1030,7 @@ namespace Mono.CSharp {
                                        return false;
                                
                                ec.Report.Error (1593, loc, "Delegate `{0}' does not take `{1}' arguments",
-                                             TypeManager.CSharpName (delegate_type), Parameters.Count.ToString ());
+                                             delegate_type.GetSignatureForError (), Parameters.Count.ToString ());
                                return false;
                        }
 
@@ -1065,8 +1070,8 @@ namespace Mono.CSharp {
                                        
                                        ec.Report.Error (1678, loc, "Parameter `{0}' is declared as type `{1}' but should be `{2}'",
                                                      (i+1).ToString (),
-                                                     TypeManager.CSharpName (Parameters.Types [i]),
-                                                     TypeManager.CSharpName (invoke_pd.Types [i]));
+                                                     Parameters.Types [i].GetSignatureForError (),
+                                                     invoke_pd.Types [i].GetSignatureForError ());
                                        error = true;
                                }
                        }
@@ -1370,7 +1375,7 @@ namespace Mono.CSharp {
                                        return null;
                                }
 
-                               b = b.ConvertToAsyncTask (ec, ec.CurrentMemberDefinition.Parent.PartialContainer, p, return_type, loc);
+                               b = b.ConvertToAsyncTask (ec, ec.CurrentMemberDefinition.Parent.PartialContainer, p, return_type, delegate_type, loc);
                        }
 
                        return CompatibleMethodFactory (return_type ?? InternalType.ErrorType, delegate_type, p, b);
@@ -1733,6 +1738,7 @@ namespace Mono.CSharp {
                                //
                                method = DoCreateMethodHost (ec);
                                method.Define ();
+                               method.PrepareEmit ();
                        }
 
                        bool is_static = (method.ModFlags & Modifiers.STATIC) != 0;
@@ -1859,7 +1865,7 @@ namespace Mono.CSharp {
 
                public override string GetSignatureForError ()
                {
-                       return TypeManager.CSharpName (type);
+                       return type.GetSignatureForError ();
                }
        }
 
@@ -2081,6 +2087,7 @@ namespace Mono.CSharp {
 
                        equals.Block = equals_block;
                        equals.Define ();
+                       equals.PrepareEmit ();
                        Members.Add (equals);
 
                        //
@@ -2135,6 +2142,7 @@ namespace Mono.CSharp {
                        hashcode_block.AddStatement (new Return (hash_variable, loc));
                        hashcode.Block = hashcode_top;
                        hashcode.Define ();
+                       hashcode.PrepareEmit ();
                        Members.Add (hashcode);
 
                        //
@@ -2145,6 +2153,7 @@ namespace Mono.CSharp {
                        tostring_block.AddStatement (new Return (string_concat, loc));
                        tostring.Block = tostring_block;
                        tostring.Define ();
+                       tostring.PrepareEmit ();
                        Members.Add (tostring);
 
                        return true;
index 22e28eaf7290267fa3754ecd6666cbd1e2f15cad..facb0eb28c092e4d3f0ecdab9071bd8524306aeb 100644 (file)
@@ -47,9 +47,6 @@ namespace Mono.CSharp
 
                public Argument (Expression expr)
                {
-                       if (expr == null)
-                               throw new ArgumentNullException ();
-
                        this.Expr = expr;
                }
 
@@ -135,7 +132,7 @@ namespace Mono.CSharp
                        if (Expr.eclass == ExprClass.MethodGroup)
                                return Expr.ExprClassName;
 
-                       return TypeManager.CSharpName (Expr.Type);
+                       return Expr.Type.GetSignatureForError ();
                }
 
                public bool ResolveMethodGroup (ResolveContext ec)
@@ -350,7 +347,7 @@ namespace Mono.CSharp
                                        } else if (arg_type.Kind == MemberKind.Void || arg_type == InternalType.Arglist || arg_type.IsPointer) {
                                                rc.Report.Error (1978, a.Expr.Location,
                                                        "An expression of type `{0}' cannot be used as an argument of dynamic operation",
-                                                       TypeManager.CSharpName (arg_type));
+                                                       arg_type.GetSignatureForError ());
                                        }
 
                                        info_flags = new Binary (Binary.Operator.BitwiseOr, info_flags,
index fa0a61b1750a0f24b4fe91c9926baaf8d8e80b60..6a62af9e22c4e21f7cdc2fb74ed264de78441583 100644 (file)
@@ -288,7 +288,7 @@ namespace Mono.CSharp
                                } else if (emitted_forwarders.ContainsKey (t.MemberDefinition)) {
                                        Report.SymbolRelatedToPreviousError (emitted_forwarders[t.MemberDefinition].Location, null);
                                        Report.Error (739, a.Location, "A duplicate type forward of type `{0}'",
-                                               TypeManager.CSharpName (t));
+                                               t.GetSignatureForError ());
                                        return;
                                }
 
@@ -297,13 +297,13 @@ namespace Mono.CSharp
                                if (t.MemberDefinition.DeclaringAssembly == this) {
                                        Report.SymbolRelatedToPreviousError (t);
                                        Report.Error (729, a.Location, "Cannot forward type `{0}' because it is defined in this assembly",
-                                               TypeManager.CSharpName (t));
+                                               t.GetSignatureForError ());
                                        return;
                                }
 
                                if (t.IsNested) {
                                        Report.Error (730, a.Location, "Cannot forward type `{0}' because it is a nested type",
-                                               TypeManager.CSharpName (t));
+                                               t.GetSignatureForError ());
                                        return;
                                }
 
index 7742126beda0353d680e283e1c258d2b7f58a024..6997d7ca85042729b61b8a0204ee01dc54ae584a 100644 (file)
@@ -378,6 +378,10 @@ namespace Mono.CSharp
                        }
                }
 
+               public TypeSpec DelegateType {
+                       get; set;
+               }
+
                public override bool IsIterator {
                        get {
                                return false;
index eb998caca39da239e5144a39f5e9bc9a02a34270..6bbdb09b174f134d5a5cdf8f9af6df50e95a9d79 100644 (file)
@@ -265,7 +265,7 @@ namespace Mono.CSharp {
                public void Error_AttributeEmitError (string inner)
                {
                        Report.Error (647, Location, "Error during emitting `{0}' attribute. The reason is `{1}'",
-                                     TypeManager.CSharpName (Type), inner);
+                                     Type.GetSignatureForError (), inner);
                }
 
                public void Error_InvalidSecurityParent ()
@@ -368,7 +368,7 @@ namespace Mono.CSharp {
                public string GetSignatureForError ()
                {
                        if (Type != null)
-                               return TypeManager.CSharpName (Type);
+                               return Type.GetSignatureForError ();
 
                        return expression.GetSignatureForError ();
                }
@@ -449,7 +449,7 @@ namespace Mono.CSharp {
 
                        ObsoleteAttribute obsolete_attr = Type.GetAttributeObsolete ();
                        if (obsolete_attr != null) {
-                               AttributeTester.Report_ObsoleteMessage (obsolete_attr, TypeManager.CSharpName (Type), Location, Report);
+                               AttributeTester.Report_ObsoleteMessage (obsolete_attr, Type.GetSignatureForError (), Location, Report);
                        }
 
                        ResolveContext rc = null;
index 24a6bf223eb027179039c4739a187b48d87cb54a..f33ddc37920805c9a4aa00b5b2e2d84882c180f3 100644 (file)
@@ -17,7 +17,6 @@ using System.Collections.Generic;
 using System.Runtime.InteropServices;
 using System.Security;
 using System.Security.Permissions;
-using System.Linq;
 using System.Text;
 using System.Diagnostics;
 using Mono.CompilerServices.SymbolWriter;
@@ -1260,8 +1259,10 @@ namespace Mono.CSharp
 
                                all_tp_builders = TypeBuilder.DefineGenericParameters (tparam_names);
 
-                               if (CurrentTypeParameters != null)
-                                       CurrentTypeParameters.Define (all_tp_builders, spec, CurrentTypeParametersStartIndex, this);
+                               if (CurrentTypeParameters != null) {
+                                       CurrentTypeParameters.Create (spec, CurrentTypeParametersStartIndex, this);
+                                       CurrentTypeParameters.Define (all_tp_builders);
+                               }
                        }
 
                        return true;
@@ -1422,6 +1423,7 @@ namespace Mono.CSharp
 
                                members.Add (proxy_method);
                                proxy_method.Define ();
+                               proxy_method.PrepareEmit ();
 
                                hoisted_base_call_proxies.Add (method, proxy_method);
                        }
@@ -1604,6 +1606,10 @@ namespace Mono.CSharp
                        foreach (var member in members) {
                                var pm = member as IParametersMember;
                                if (pm != null) {
+                                       var mc = member as MethodOrOperator;
+                                       if (mc != null) {
+                                               mc.PrepareEmit ();
+                                       }
 
                                        var p = pm.Parameters;
                                        if (p.IsEmpty)
@@ -1675,19 +1681,6 @@ namespace Mono.CSharp
                        current_type = null;
                }
 
-               void UpdateTypeParameterConstraints (TypeDefinition part)
-               {
-                       for (int i = 0; i < CurrentTypeParameters.Count; i++) {
-                               if (CurrentTypeParameters[i].AddPartialConstraints (part, part.MemberName.TypeParameters[i]))
-                                       continue;
-
-                               Report.SymbolRelatedToPreviousError (Location, "");
-                               Report.Error (265, part.Location,
-                                       "Partial declarations of `{0}' have inconsistent constraints for type parameter `{1}'",
-                                       GetSignatureForError (), CurrentTypeParameters[i].GetSignatureForError ());
-                       }
-               }
-
                public override void RemoveContainer (TypeContainer cont)
                {
                        base.RemoveContainer (cont);
@@ -1712,7 +1705,7 @@ namespace Mono.CSharp
                        }
 
                        if (IsPartialPart) {
-                               PartialContainer.UpdateTypeParameterConstraints (this);
+                               PartialContainer.CurrentTypeParameters.UpdateConstraints (this);
                        }
 
                        return true;
@@ -2273,7 +2266,7 @@ namespace Mono.CSharp
                        
                        Report.SymbolRelatedToPreviousError (mb.InterfaceType);
                        Report.Error (540, mb.Location, "`{0}': containing type does not implement interface `{1}'",
-                               mb.GetSignatureForError (), TypeManager.CSharpName (mb.InterfaceType));
+                               mb.GetSignatureForError (), mb.InterfaceType.GetSignatureForError ());
                        return false;
                }
 
@@ -2503,7 +2496,7 @@ namespace Mono.CSharp
                /// <summary>
                /// Defines the default constructors 
                /// </summary>
-               protected Constructor DefineDefaultConstructor (bool is_static)
+               protected virtual Constructor DefineDefaultConstructor (bool is_static)
                {
                        // The default instance constructor is public
                        // If the class is abstract, the default constructor is protected
@@ -3024,7 +3017,7 @@ namespace Mono.CSharp
 
                                        Report.SymbolRelatedToPreviousError (iface);
                                        Report.Warning (3027, 1, Location, "`{0}' is not CLS-compliant because base interface `{1}' is not CLS-compliant",
-                                               GetSignatureForError (), TypeManager.CSharpName (iface));
+                                               GetSignatureForError (), iface.GetSignatureForError ());
                                }
                        }
 
@@ -3259,10 +3252,10 @@ namespace Mono.CSharp
                                Report.SymbolRelatedToPreviousError (base_member);
                                if (this is PropertyBasedMember) {
                                        Report.Error (1715, Location, "`{0}': type must be `{1}' to match overridden member `{2}'",
-                                               GetSignatureForError (), TypeManager.CSharpName (base_member_type), TypeManager.CSharpSignature (base_member));
+                                               GetSignatureForError (), base_member_type.GetSignatureForError (), base_member.GetSignatureForError ());
                                } else {
                                        Report.Error (508, Location, "`{0}': return type must be `{1}' to match overridden member `{2}'",
-                                               GetSignatureForError (), TypeManager.CSharpName (base_member_type), TypeManager.CSharpSignature (base_member));
+                                               GetSignatureForError (), base_member_type.GetSignatureForError (), base_member.GetSignatureForError ());
                                }
                                ok = false;
                        }
@@ -3336,7 +3329,7 @@ namespace Mono.CSharp
                                if (!InterfaceType.IsInterface) {
                                        Report.SymbolRelatedToPreviousError (InterfaceType);
                                        Report.Error (538, Location, "The type `{0}' in explicit interface declaration is not an interface",
-                                               TypeManager.CSharpName (InterfaceType));
+                                               InterfaceType.GetSignatureForError ());
                                } else {
                                        Parent.PartialContainer.VerifyImplements (this);
                                }
@@ -3367,15 +3360,15 @@ namespace Mono.CSharp
                                if (this is Indexer)
                                        Report.Error (55, Location,
                                                      "Inconsistent accessibility: parameter type `{0}' is less accessible than indexer `{1}'",
-                                                     TypeManager.CSharpName (t), GetSignatureForError ());
+                                                     t.GetSignatureForError (), GetSignatureForError ());
                                else if (this is Operator)
                                        Report.Error (57, Location,
                                                      "Inconsistent accessibility: parameter type `{0}' is less accessible than operator `{1}'",
-                                                     TypeManager.CSharpName (t), GetSignatureForError ());
+                                                     t.GetSignatureForError (), GetSignatureForError ());
                                else
                                        Report.Error (51, Location,
                                                "Inconsistent accessibility: parameter type `{0}' is less accessible than method `{1}'",
-                                               TypeManager.CSharpName (t), GetSignatureForError ());
+                                               t.GetSignatureForError (), GetSignatureForError ());
                                error = true;
                        }
                        return !error;
@@ -3484,7 +3477,7 @@ namespace Mono.CSharp
                        // replacing predefined names which saves some space and name
                        // is still unique
                        //
-                       return TypeManager.CSharpName (InterfaceType) + "." + name;
+                       return InterfaceType.GetSignatureForError () + "." + name;
                }
 
                public override string GetSignatureForDocumentation ()
@@ -3523,7 +3516,9 @@ namespace Mono.CSharp
                {
                        this.Parent = parent;
                        this.type_expr = type;
-                       ModFlags = ModifiersExtensions.Check (allowed_mod, mod, def_mod, Location, Report);
+
+                       if (name != MemberName.Null)
+                               ModFlags = ModifiersExtensions.Check (allowed_mod, mod, def_mod, Location, Report);
                }
 
                #region Properties
@@ -3582,28 +3577,28 @@ namespace Mono.CSharp
                                if (this is Property)
                                        Report.Error (53, Location,
                                                      "Inconsistent accessibility: property type `" +
-                                                     TypeManager.CSharpName (MemberType) + "' is less " +
+                                                     MemberType.GetSignatureForError () + "' is less " +
                                                      "accessible than property `" + GetSignatureForError () + "'");
                                else if (this is Indexer)
                                        Report.Error (54, Location,
                                                      "Inconsistent accessibility: indexer return type `" +
-                                                     TypeManager.CSharpName (MemberType) + "' is less " +
+                                                     MemberType.GetSignatureForError () + "' is less " +
                                                      "accessible than indexer `" + GetSignatureForError () + "'");
                                else if (this is MethodCore) {
                                        if (this is Operator)
                                                Report.Error (56, Location,
                                                              "Inconsistent accessibility: return type `" +
-                                                             TypeManager.CSharpName (MemberType) + "' is less " +
+                                                             MemberType.GetSignatureForError () + "' is less " +
                                                              "accessible than operator `" + GetSignatureForError () + "'");
                                        else
                                                Report.Error (50, Location,
                                                              "Inconsistent accessibility: return type `" +
-                                                             TypeManager.CSharpName (MemberType) + "' is less " +
+                                                             MemberType.GetSignatureForError () + "' is less " +
                                                              "accessible than method `" + GetSignatureForError () + "'");
                                } else {
                                        Report.Error (52, Location,
                                                      "Inconsistent accessibility: field type `" +
-                                                     TypeManager.CSharpName (MemberType) + "' is less " +
+                                                     MemberType.GetSignatureForError () + "' is less " +
                                                      "accessible than field `" + GetSignatureForError () + "'");
                                }
                        }
index 7d149aae26ce24758c2c19e1f58d12f6e46468d8..da41e1ebad5eac2ad2df972d889cca45b8ecbdf6 100644 (file)
@@ -100,10 +100,10 @@ namespace Mono.CSharp {
                {
                        if (t.IsGenericParameter) {
                                Report.Error (1959, loc,
-                                       "Type parameter `{0}' cannot be declared const", TypeManager.CSharpName (t));
+                                       "Type parameter `{0}' cannot be declared const", t.GetSignatureForError ());
                        } else {
                                Report.Error (283, loc,
-                                       "The type `{0}' cannot be declared const", TypeManager.CSharpName (t));
+                                       "The type `{0}' cannot be declared const", t.GetSignatureForError ());
                        }
                }
        }
index acfb6a751f8e2937b7d6296c8e7cea30b848cd80..aceaedf7e7bf9471059428823a1a10b0f233723b 100644 (file)
@@ -64,7 +64,7 @@ namespace Mono.CSharp {
                                BuiltinTypeSpec.IsPrimitiveTypeOrDecimal (target) &&
                                BuiltinTypeSpec.IsPrimitiveTypeOrDecimal (type)) {
                                ec.Report.Error (31, loc, "Constant value `{0}' cannot be converted to a `{1}'",
-                                       GetValueAsLiteral (), TypeManager.CSharpName (target));
+                                       GetValueAsLiteral (), target.GetSignatureForError ());
                        } else {
                                base.Error_ValueCannotBeConverted (ec, target, expl);
                        }
@@ -100,7 +100,7 @@ namespace Mono.CSharp {
                                // reached, by calling Convert.ImplicitStandardConversionExists
                                //
                                throw new InternalErrorException ("Missing constant conversion between `{0}' and `{1}'",
-                                 TypeManager.CSharpName (Type), TypeManager.CSharpName (type));
+                                Type.GetSignatureForError (), type.GetSignatureForError ());
                        }
 
                        return CreateConstantFromValue (type, constant_value, loc);
@@ -396,7 +396,7 @@ namespace Mono.CSharp {
                        catch
                        {
                                ec.Report.Error (31, loc, "Constant value `{0}' cannot be converted to a `{1}'",
-                                       GetValue ().ToString (), TypeManager.CSharpName (target));
+                                       GetValue ().ToString (), target.GetSignatureForError ());
                        }
                }
 
index 94af264c7166b639ed5a912126fb03c2fa0d78c2..9d2d8db7fe06d0a66b29e5b73d28a610f182ef69 100644 (file)
@@ -139,6 +139,7 @@ namespace Mono.CSharp
                //
                LocationsBag lbag;
                List<Tuple<Modifiers, Location>> mod_locations;
+               Stack<Location> location_stack;
 %}
 
 %token EOF
@@ -675,6 +676,7 @@ attribute_sections
 attribute_section
        : OPEN_BRACKET
          {
+               PushLocation (GetLocation ($1));
                lexer.parsing_attribute_section = true;
          }
          attribute_section_cont
@@ -699,13 +701,43 @@ attribute_section_cont
                        $$ = new List<Attribute> (0);
                else
                        $$ = $4;
-         
+
+               lbag.InsertLocation ($$, 0, PopLocation ());
+               if ($5 != null) {
+                       lbag.AddLocation ($$, GetLocation ($2), GetLocation ($5), GetLocation ($6));
+               } else {
+                       lbag.AddLocation ($$, GetLocation ($2), GetLocation ($6));
+               }
+
                current_attr_target = null;
                lexer.parsing_attribute_section = false;
          }
        | attribute_list opt_comma CLOSE_BRACKET
          {
                $$ = $1;
+
+               lbag.InsertLocation ($$, 0, PopLocation ());
+               if ($2 != null) {
+                       lbag.AddLocation ($$, GetLocation($2), GetLocation ($3));
+               } else {
+                       lbag.AddLocation ($$, GetLocation($3));
+               }
+         }
+       | IDENTIFIER error
+         {
+               Error_SyntaxError (yyToken);
+
+               var lt = (Tokenizer.LocatedToken) $1;
+               var tne = new SimpleName (lt.Value, null, lt.Location);
+
+               $$ = new List<Attribute> () {
+                       new Attribute (null, tne, null, GetLocation ($1), false)
+               };
+         }
+       | error
+         {
+               $$ = CheckAttributeTarget (GetTokenName (yyToken), GetLocation ($1)); 
+               $$ = null;
          }
        ;       
 
@@ -717,16 +749,6 @@ attribute_target
          }
        | EVENT  { $$ = "event"; }
        | RETURN { $$ = "return"; }
-       | error
-         {
-               if (yyToken == Token.IDENTIFIER) {
-                       Error_SyntaxError (yyToken);
-                       $$ = null;
-               } else {
-                       string name = GetTokenName (yyToken);
-                       $$ = CheckAttributeTarget (name, GetLocation ($1));
-               }
-         }
        ;
 
 attribute_list
@@ -737,7 +759,10 @@ attribute_list
        | attribute_list COMMA attribute
          {
                var attrs = (List<Attribute>) $1;
-               attrs.Add ((Attribute) $3);
+               if (attrs != null) {
+                       attrs.Add ((Attribute) $3);
+                       lbag.AppendTo (attrs, GetLocation ($2));
+               }
 
                $$ = attrs;
          }
@@ -819,6 +844,11 @@ positional_or_named_argument
                $$ = new Argument ((Expression) $1);
          }
        | named_argument
+       | error
+         {
+               Error_SyntaxError (yyToken);
+               $$ = null;
+         }
        ;
 
 named_attribute_argument
@@ -890,13 +920,14 @@ class_member_declaration
        | destructor_declaration
        | type_declaration
        | attributes_without_members
+       | incomplete_member
        | error
          {
                report.Error (1519, lexer.Location, "Unexpected symbol `{0}' in class, struct, or interface member declaration",
                        GetSymbolName (yyToken));
                $$ = null;
                lexer.parsing_generic_declaration = false;
-         }
+         }     
        ;
 
 struct_declaration
@@ -1311,8 +1342,10 @@ method_header
 
                current_type.AddMember (method);
 
-               if ($11 != null)
-                       method.SetConstraints ((List<Constraints>) $11);
+               async_block = (method.ModFlags & Modifiers.ASYNC) != 0;
+
+               if ($12 != null)
+                       method.SetConstraints ((List<Constraints>) $12);
 
                if (doc_support)
                        method.DocComment = Lexer.consume_doc_comment ();
@@ -2515,6 +2548,23 @@ attributes_without_members
                lexer.putback ('}');
          }
        ;
+
+// For full ast try to recover incomplete ambiguous member
+// declaration in form on class X { public int }
+incomplete_member
+       : opt_attributes opt_modifiers member_type CLOSE_BRACE
+         {
+               report.Error (1519, lexer.Location, "Unexpected symbol `}' in class, struct, or interface member declaration");
+               lexer.putback ('}');
+
+               lexer.parsing_generic_declaration = false;
+               FullNamedExpression type = (FullNamedExpression) $3;
+               current_field = new Field (current_type, type, (Modifiers) $2, MemberName.Null, (Attributes) $1);
+               current_type.AddField (current_field);
+               $$ = current_field;
+         }
+       ;
          
 enum_declaration
        : opt_attributes
@@ -3258,7 +3308,7 @@ member_initializer
          {
                report.Error (1920, GetLocation ($1), "An element initializer cannot be empty");
                $$ = null;
-         }       
+         }
        ;
 
 initializer_value
@@ -3374,22 +3424,18 @@ element_access
        ;
 
 expression_list
-       : expression
+       : expression_or_error
          {
                var list = new List<Expression> (4);
                list.Add ((Expression) $1);
                $$ = list;
          }
-       | expression_list COMMA expression
+       | expression_list COMMA expression_or_error
          {
                var list = (List<Expression>) $1;
                list.Add ((Expression) $3);
                $$ = list;
          }
-       | expression_list error {
-               Error_SyntaxError (yyToken);
-               $$ = $1;
-         }
        ;
        
 expression_list_arguments
@@ -4293,6 +4339,14 @@ conditional_expression
                $$ = new Conditional (new BooleanExpression ((Expression) $1), (Expression) $3, null, GetLocation ($2));
                lbag.AddLocation ($$, GetLocation ($4));
          }
+       | null_coalescing_expression INTERR expression COLON CLOSE_BRACE
+         {
+               Error_SyntaxError (Token.CLOSE_BRACE);
+
+               $$ = new Conditional (new BooleanExpression ((Expression) $1), (Expression) $3, null, GetLocation ($2));
+               lbag.AddLocation ($$, GetLocation ($4));
+               lexer.putback ('}');
+         }
        ;
 
 assignment_expression
@@ -5154,7 +5208,10 @@ block_variable_declaration
          {
                $$ = current_variable;
                current_variable = null;
-               lbag.AddLocation ($$, GetLocation ($6));
+               if ($4 != null)
+                       lbag.AddLocation ($$, PopLocation (), GetLocation ($6));
+               else
+                       lbag.AddLocation ($$, GetLocation ($6));
          }
        | CONST variable_type identifier_inside_body
          {
@@ -5176,7 +5233,8 @@ opt_local_variable_initializer
        | ASSIGN block_variable_initializer
          {
                current_variable.Initializer = (Expression) $2;
-               // TODO: lbag
+               PushLocation (GetLocation ($1));
+               $$ = current_variable;
          }
        | error
          {
@@ -5308,7 +5366,6 @@ statement_expression
                ExpressionStatement s = $1 as ExpressionStatement;
                if (s == null) {
                        var expr = $1 as Expression;
-                       expr.Error_InvalidExpressionStatement (report);
                        $$ = new StatementErrorExpression (expr);
                } else {
                        $$ = new StatementExpression (s);
@@ -5583,6 +5640,9 @@ for_initializer
          opt_local_variable_initializer opt_variable_declarators
          {
                $$ = current_variable;
+               if ($4 != null)
+                       lbag.AddLocation (current_variable, PopLocation ());
+
                current_variable = null;
          }
        | statement_expression_list
@@ -5798,7 +5858,7 @@ yield_statement
                        FeatureIsNotAvailable (lt.Location, "iterators");
                }
                
-               current_block.Explicit.RegisterIteratorYield ();
+               current_block.ParametersBlock.TopBlock.IsIterator = true;
                $$ = new YieldBreak (lt.Location);
                lbag.AddStatement ($$, GetLocation ($2), GetLocation ($3));
          }
@@ -6237,15 +6297,29 @@ select_or_group_clause
          
                current_block = new Linq.QueryBlock (current_block, lexer.Location);
          }
-         BY expression_or_error
+         by_expression
          {
-               $$ = new Linq.GroupBy ((Linq.QueryBlock)current_block, (Expression)$3, linq_clause_blocks.Pop (), (Expression)$6, GetLocation ($1));
-               lbag.AddLocation ($$, GetLocation ($5));
+               var obj = (object[]) $5;
+
+               $$ = new Linq.GroupBy ((Linq.QueryBlock)current_block, (Expression)$3, linq_clause_blocks.Pop (), (Expression)obj[0], GetLocation ($1));
+               lbag.AddLocation ($$, (Location) obj[1]);
                
                current_block.SetEndLocation (lexer.Location);
                current_block = current_block.Parent;
          }
        ;
+
+by_expression
+       : BY expression_or_error
+         {
+               $$ = new object[] { $2, GetLocation ($1) };
+         }
+       | error
+         {
+               Error_SyntaxError (yyToken);
+               $$ = new object[2] { null, Location.Null };
+         }
+       ;
        
 query_body_clauses
        : query_body_clause
@@ -6851,6 +6925,23 @@ void StoreModifierLocation (object token, Location loc)
        mod_locations.Add (Tuple.Create ((Modifiers) token, loc));
 }
 
+[System.Diagnostics.Conditional ("FULL_AST")]
+void PushLocation (Location loc)
+{
+       if (location_stack == null)
+               location_stack = new Stack<Location> ();
+
+       location_stack.Push (loc);
+}
+
+Location PopLocation ()
+{
+       if (location_stack == null)
+               return Location.Null;
+
+       return location_stack.Pop ();
+}
+
 string CheckAttributeTarget (string a, Location l)
 {
        switch (a) {
index fffe767c63317cb3971823ce2f6ed7a970dbfdaa..0dfc0226f295caa9ad1c418cba1271bce01b2367 100644 (file)
@@ -2819,7 +2819,8 @@ namespace Mono.CSharp
                                }
                        case PreprocessorDirective.Define:
                                if (any_token_seen){
-                                       Error_TokensSeen ();
+                                       if (caller_is_taking)
+                                               Error_TokensSeen ();
                                        return caller_is_taking;
                                }
                                PreProcessDefinition (true, arg, caller_is_taking);
@@ -2827,7 +2828,8 @@ namespace Mono.CSharp
 
                        case PreprocessorDirective.Undef:
                                if (any_token_seen){
-                                       Error_TokensSeen ();
+                                       if (caller_is_taking)
+                                               Error_TokensSeen ();
                                        return caller_is_taking;
                                }
                                PreProcessDefinition (false, arg, caller_is_taking);
@@ -2940,6 +2942,7 @@ namespace Mono.CSharp
 
                                        advance_line ();
                                } else if (c == '\\' && !quoted) {
+                                       ++col;
                                        int surrogate;
                                        c = escape (c, out surrogate);
                                        if (c == -1)
index a9a67b2d0d39635d4ee1b68520fd337e99ec940c..e7f27aa7d626a32151675707335df0dc6312ff5f 100644 (file)
@@ -937,7 +937,8 @@ namespace Mono.CSharp {
                        InflatedExpressionType = 1 << 19,
                        InflatedNullableType = 1 << 20,
                        GenericIterateInterface = 1 << 21,
-                       GenericTask = 1 << 22
+                       GenericTask = 1 << 22,
+                       InterfacesImported = 1 << 23,
                }
 
                //
@@ -1274,6 +1275,11 @@ namespace Mono.CSharp {
                void SetIsUsed ();
        }
 
+       public interface IMethodDefinition : IMemberDefinition
+       {
+               MethodBase Metadata { get; }
+       }
+
        public interface IParametersMember : IInterfaceMemberSpec
        {
                AParametersCollection Parameters { get; }
index a73c9f68c75cb81a94973da5046804f9d6c7163e..13a2a4c7bcf971abd38c1b322d7cf01d890b441c 100644 (file)
@@ -153,7 +153,7 @@ namespace Mono.CSharp {
                                        Report.SymbolRelatedToPreviousError (partype);
                                        Report.Error (59, Location,
                                                "Inconsistent accessibility: parameter type `{0}' is less accessible than delegate `{1}'",
-                                               TypeManager.CSharpName (partype), GetSignatureForError ());
+                                               partype.GetSignatureForError (), GetSignatureForError ());
                                }
                        }
 
@@ -169,7 +169,7 @@ namespace Mono.CSharp {
                                Report.SymbolRelatedToPreviousError (ret_type);
                                Report.Error (58, Location,
                                                  "Inconsistent accessibility: return type `" +
-                                                 TypeManager.CSharpName (ret_type) + "' is less " +
+                                                 ret_type.GetSignatureForError () + "' is less " +
                                                  "accessible than delegate `" + GetSignatureForError () + "'");
                                return false;
                        }
@@ -297,6 +297,12 @@ namespace Mono.CSharp {
                        if (!Parameters.IsEmpty) {
                                parameters.ResolveDefaultValues (this);
                        }
+
+                       InvokeBuilder.PrepareEmit ();
+                       if (BeginInvokeBuilder != null) {
+                               BeginInvokeBuilder.PrepareEmit ();
+                               EndInvokeBuilder.PrepareEmit ();
+                       }
                }
 
                public override void Emit ()
@@ -522,7 +528,7 @@ namespace Mono.CSharp {
                                TypeSpec e_type = emg.ExtensionExpression.Type;
                                if (TypeSpec.IsValueType (e_type)) {
                                        ec.Report.Error (1113, loc, "Extension method `{0}' of value type `{1}' cannot be used to create delegates",
-                                               delegate_method.GetSignatureForError (), TypeManager.CSharpName (e_type));
+                                               delegate_method.GetSignatureForError (), e_type.GetSignatureForError ());
                                }
                        }
 
@@ -586,8 +592,8 @@ namespace Mono.CSharp {
                        ec.Report.SymbolRelatedToPreviousError (method);
                        if (ec.Module.Compiler.Settings.Version == LanguageVersion.ISO_1) {
                                ec.Report.Error (410, loc, "A method or delegate `{0} {1}' parameters and return type must be same as delegate `{2} {3}' parameters and return type",
-                                       TypeManager.CSharpName (method.ReturnType), member_name,
-                                       TypeManager.CSharpName (invoke_method.ReturnType), Delegate.FullDelegateDesc (invoke_method));
+                                       method.ReturnType.GetSignatureForError (), member_name,
+                                       invoke_method.ReturnType.GetSignatureForError (), Delegate.FullDelegateDesc (invoke_method));
                                return;
                        }
 
@@ -599,7 +605,7 @@ namespace Mono.CSharp {
 
                        ec.Report.Error (407, loc, "A method or delegate `{0} {1}' return type does not match delegate `{2} {3}' return type",
                                return_type.GetSignatureForError (), member_name,
-                               TypeManager.CSharpName (invoke_method.ReturnType), Delegate.FullDelegateDesc (invoke_method));
+                               invoke_method.ReturnType.GetSignatureForError (), Delegate.FullDelegateDesc (invoke_method));
                }
 
                public static bool ImplicitStandardConversionExists (ResolveContext ec, MethodGroupExpr mg, TypeSpec target_type)
index b9d6967dccf4094664ac99cf755867e05638ee41..0246c43a1b67fa9cba25972b19e283fd7558a5b2 100644 (file)
@@ -447,6 +447,7 @@ namespace Mono.CSharp
                                d.CreateContainer ();
                                d.DefineContainer ();
                                d.Define ();
+                               d.PrepareEmit ();
 
                                site.AddTypeContainer (d);
                                del_type = new TypeExpression (d.CurrentType, loc);
index ee025092c4411518faece3de3eb6a921000ffa94..185c2e833e166c99ef835a543a549ffa77ea7799 100644 (file)
@@ -251,7 +251,7 @@ namespace Mono.CSharp {
                public void Error_ConstantCanBeInitializedWithNullOnly (ResolveContext rc, TypeSpec type, Location loc, string name)
                {
                        rc.Report.Error (134, loc, "A constant `{0}' of reference type `{1}' can only be initialized with null",
-                               name, TypeManager.CSharpName (type));
+                               name, type.GetSignatureForError ());
                }
 
                protected virtual void Error_InvalidExpressionStatement (Report report, Location loc)
@@ -282,7 +282,10 @@ namespace Mono.CSharp {
                protected void Error_ValueCannotBeConvertedCore (ResolveContext ec, Location loc, TypeSpec target, bool expl)
                {
                        // The error was already reported as CS1660
-                       if (type == InternalType.AnonymousMethod || type == InternalType.ErrorType)
+                       if (type == InternalType.AnonymousMethod)
+                               return;
+
+                       if (type == InternalType.ErrorType || target == InternalType.ErrorType)
                                return;
 
                        string from_type = type.GetSignatureForError ();
@@ -351,7 +354,7 @@ namespace Mono.CSharp {
                {
                        ec.Report.SymbolRelatedToPreviousError (type);
                        ec.Report.Error (117, loc, "`{0}' does not contain a definition for `{1}'",
-                               TypeManager.CSharpName (type), name);
+                               type.GetSignatureForError (), name);
                }
 
                public virtual void Error_ValueAssignment (ResolveContext rc, Expression rhs)
@@ -1475,7 +1478,7 @@ namespace Mono.CSharp {
 
                public override string GetSignatureForError()
                {
-                       return TypeManager.CSharpName (Type);
+                       return Type.GetSignatureForError ();
                }
 
                public override object GetValue ()
@@ -3244,7 +3247,7 @@ namespace Mono.CSharp {
        class ExtensionMethodGroupExpr : MethodGroupExpr, OverloadResolver.IErrorHandler
        {
                ExtensionMethodCandidates candidates;
-               public readonly Expression ExtensionExpression;
+               public Expression ExtensionExpression;
 
                public ExtensionMethodGroupExpr (ExtensionMethodCandidates candidates, Expression extensionExpr, Location loc)
                        : base (candidates.Methods.Cast<MemberSpec>().ToList (), extensionExpr.Type, loc)
@@ -3288,6 +3291,10 @@ namespace Mono.CSharp {
                        if (arguments == null)
                                arguments = new Arguments (1);
 
+                       ExtensionExpression = ExtensionExpression.Resolve (ec);
+                       if (ExtensionExpression == null)
+                               return null;
+
                        arguments.Insert (0, new Argument (ExtensionExpression, Argument.AType.ExtensionType));
                        var res = base.OverloadResolve (ec, ref arguments, ehandler ?? this, restr);
 
@@ -3499,7 +3506,7 @@ namespace Mono.CSharp {
                public override void Error_ValueCannotBeConverted (ResolveContext ec, TypeSpec target, bool expl)
                {
                        ec.Report.Error (428, loc, "Cannot convert method group `{0}' to non-delegate type `{1}'. Consider using parentheses to invoke the method",
-                               Name, TypeManager.CSharpName (target));
+                               Name, target.GetSignatureForError ());
                }
 
                public static bool IsExtensionMethodArgument (Expression expr)
@@ -4551,17 +4558,18 @@ namespace Mono.CSharp {
                                // It can be applicable in expanded form (when not doing exact match like for delegates)
                                //
                                if (score != 0 && (p_mod & Parameter.Modifier.PARAMS) != 0 && (restrictions & Restrictions.CovariantDelegate) == 0) {
-                                       if (!params_expanded_form)
+                                       if (!params_expanded_form) {
                                                pt = ((ElementTypeSpec) pt).Element;
+                                       }
 
                                        if (score > 0)
                                                score = IsArgumentCompatible (ec, a, Parameter.Modifier.NONE, pt);
 
-                                       if (score == 0) {
-                                               params_expanded_form = true;
-                                       } else if (score < 0) {
+                                       if (score < 0) {
                                                params_expanded_form = true;
                                                dynamicArgument = true;
+                                       } else if (score == 0 || arg_count > pd.Count) {
+                                               params_expanded_form = true;
                                        }
                                }
 
@@ -5040,14 +5048,14 @@ namespace Mono.CSharp {
                        string index = (idx + 1).ToString ();
                        if (((mod & Parameter.Modifier.RefOutMask) ^ (a.Modifier & Parameter.Modifier.RefOutMask)) != 0) {
                                if ((mod & Parameter.Modifier.RefOutMask) == 0)
-                                       ec.Report.Error (1615, loc, "Argument `#{0}' does not require `{1}' modifier. Consider removing `{1}' modifier",
+                                       ec.Report.Error (1615, a.Expr.Location, "Argument `#{0}' does not require `{1}' modifier. Consider removing `{1}' modifier",
                                                index, Parameter.GetModifierSignature (a.Modifier));
                                else
-                                       ec.Report.Error (1620, loc, "Argument `#{0}' is missing `{1}' modifier",
+                                       ec.Report.Error (1620, a.Expr.Location, "Argument `#{0}' is missing `{1}' modifier",
                                                index, Parameter.GetModifierSignature (mod));
                        } else {
                                string p1 = a.GetSignatureForError ();
-                               string p2 = TypeManager.CSharpName (paramType);
+                               string p2 = paramType.GetSignatureForError ();
 
                                if (p1 == p2) {
                                        p1 = a.Type.GetSignatureForErrorIncludingAssemblyName ();
index 7a025bb6c347e4a2574a788aa94744c8650aa9ec..1081e0e551e55849bf18118da5bab9b941b87d3d 100644 (file)
@@ -269,7 +269,7 @@ namespace Mono.CSharp {
                        case BuiltinTypeSpec.Type.ULong:
                        case BuiltinTypeSpec.Type.UShort:
                                Report.Warning (3009, 1, Location, "`{0}': base type `{1}' is not CLS-compliant",
-                                       GetSignatureForError (), TypeManager.CSharpName (UnderlyingType));
+                                       GetSignatureForError (), UnderlyingType.GetSignatureForError ());
                                break;
                        }
 
index a43e4ab7dc84ee792573907ed88c4e4add0954b9..5eee6be0fc2b6add2634e1ec700db9fca13e0452 100644 (file)
@@ -1437,10 +1437,10 @@ namespace Mono.CSharp
                {
                        if (result)
                                ec.Report.Warning (183, 1, loc, "The given expression is always of the provided (`{0}') type",
-                                       TypeManager.CSharpName (probe_type_expr));
+                                       probe_type_expr.GetSignatureForError ());
                        else
                                ec.Report.Warning (184, 1, loc, "The given expression is never of the provided (`{0}') type",
-                                       TypeManager.CSharpName (probe_type_expr));
+                                       probe_type_expr.GetSignatureForError ());
 
                        return ReducedExpression.Create (new BoolConstant (ec.BuiltinTypes, result, loc), this);
                }
@@ -1630,7 +1630,7 @@ namespace Mono.CSharp
                                } else {
                                        ec.Report.Error (77, loc,
                                                "The `as' operator cannot be used with a non-nullable value type `{0}'",
-                                               TypeManager.CSharpName (type));
+                                               type.GetSignatureForError ());
                                }
                                return null;
                        }
@@ -1663,7 +1663,7 @@ namespace Mono.CSharp
                        }
 
                        ec.Report.Error (39, loc, "Cannot convert type `{0}' to `{1}' via a built-in conversion",
-                               TypeManager.CSharpName (etype), TypeManager.CSharpName (type));
+                               etype.GetSignatureForError (), type.GetSignatureForError ());
 
                        return null;
                }
@@ -1702,7 +1702,7 @@ namespace Mono.CSharp
                                return null;
 
                        if (type.IsStatic) {
-                               ec.Report.Error (716, loc, "Cannot convert to static type `{0}'", TypeManager.CSharpName (type));
+                               ec.Report.Error (716, loc, "Cannot convert to static type `{0}'", type.GetSignatureForError ());
                                return null;
                        }
 
@@ -2255,6 +2255,12 @@ namespace Mono.CSharp
                        }
                }
 
+               public override Location StartLocation {
+                       get {
+                               return left.StartLocation;
+                       }
+               }
+
                #endregion
 
                /// <summary>
@@ -2340,8 +2346,8 @@ namespace Mono.CSharp
                                return;
 
                        string l, r;
-                       l = TypeManager.CSharpName (left.Type);
-                       r = TypeManager.CSharpName (right.Type);
+                       l = left.Type.GetSignatureForError ();
+                       r = right.Type.GetSignatureForError ();
 
                        ec.Report.Error (19, loc, "Operator `{0}' cannot be applied to operands of type `{1}' and `{2}'",
                                oper, l, r);
@@ -2716,9 +2722,10 @@ namespace Mono.CSharp
 
                        // FIXME: consider constants
 
+                       var ltype = lcast != null ? lcast.UnderlyingType : rcast.UnderlyingType;
                        ec.Report.Warning (675, 3, loc,
                                "The operator `|' used on the sign-extended type `{0}'. Consider casting to a smaller unsigned type first",
-                               TypeManager.CSharpName (lcast != null ? lcast.UnderlyingType : rcast.UnderlyingType));
+                               ltype.GetSignatureForError ());
                }
 
                public static PredefinedOperator[] CreatePointerOperatorsTable (BuiltinTypes types)
@@ -2931,7 +2938,7 @@ namespace Mono.CSharp
                                // FIXME: resolve right expression as unreachable
                                // right.Resolve (ec);
 
-                               ec.Report.Warning (429, 4, loc, "Unreachable expression code detected");
+                               ec.Report.Warning (429, 4, right.StartLocation, "Unreachable expression code detected");
                                return left;
                        }
 
@@ -3557,7 +3564,7 @@ namespace Mono.CSharp
 
                                if (best_operator == null) {
                                        ec.Report.Error (34, loc, "Operator `{0}' is ambiguous on operands of type `{1}' and `{2}'",
-                                               OperName (oper), TypeManager.CSharpName (l), TypeManager.CSharpName (r));
+                                               OperName (oper), l.GetSignatureForError (), r.GetSignatureForError ());
 
                                        best_operator = po;
                                        break;
@@ -3713,7 +3720,7 @@ namespace Mono.CSharp
                                } catch (OverflowException) {
                                        ec.Report.Warning (652, 2, loc,
                                                "A comparison between a constant and a variable is useless. The constant is out of the range of the variable type `{0}'",
-                                               TypeManager.CSharpName (type));
+                                               type.GetSignatureForError ());
                                }
                        }
                }
@@ -4273,7 +4280,7 @@ namespace Mono.CSharp
                        if (op_true == null || op_false == null) {
                                ec.Report.Error (218, loc,
                                        "The type `{0}' must have operator `true' and operator `false' defined when `{1}' is used as a short circuit operator",
-                                       TypeManager.CSharpName (type), oper.GetSignatureForError ());
+                                       type.GetSignatureForError (), oper.GetSignatureForError ());
                                return null;
                        }
 
@@ -4684,7 +4691,7 @@ namespace Mono.CSharp
                                } else {
                                        ec.Report.Error (173, true_expr.Location,
                                                "Type of conditional expression cannot be determined because there is no implicit conversion between `{0}' and `{1}'",
-                                               TypeManager.CSharpName (true_type), TypeManager.CSharpName (false_type));
+                                               true_type.GetSignatureForError (), false_type.GetSignatureForError ());
                                        return null;
                                }
                        }                       
@@ -5184,6 +5191,9 @@ namespace Mono.CSharp
 
                void SetAssigned (ResolveContext ec)
                {
+                       if (Parameter.HoistedVariant != null)
+                               Parameter.HoistedVariant.IsAssigned = true;
+
                        if (HasOutModifier && ec.DoFlowAnalysis)
                                ec.CurrentBranching.SetAssigned (VariableInfo);
                }
@@ -5757,7 +5767,7 @@ namespace Mono.CSharp
 
                        if (type.IsPointer) {
                                ec.Report.Error (1919, loc, "Unsafe type `{0}' cannot be used in an object creation expression",
-                                       TypeManager.CSharpName (type));
+                                       type.GetSignatureForError ());
                                return null;
                        }
 
@@ -5780,13 +5790,13 @@ namespace Mono.CSharp
                                if ((tparam.SpecialConstraint & (SpecialConstraint.Struct | SpecialConstraint.Constructor)) == 0 && !TypeSpec.IsValueType (tparam)) {
                                        ec.Report.Error (304, loc,
                                                "Cannot create an instance of the variable type `{0}' because it does not have the new() constraint",
-                                               TypeManager.CSharpName (type));
+                                               type.GetSignatureForError ());
                                }
 
                                if ((arguments != null) && (arguments.Count != 0)) {
                                        ec.Report.Error (417, loc,
                                                "`{0}': cannot provide arguments when creating an instance of a variable type",
-                                               TypeManager.CSharpName (type));
+                                               type.GetSignatureForError ());
                                }
 
                                return this;
@@ -5794,7 +5804,7 @@ namespace Mono.CSharp
 
                        if (type.IsStatic) {
                                ec.Report.SymbolRelatedToPreviousError (type);
-                               ec.Report.Error (712, loc, "Cannot create an instance of the static class `{0}'", TypeManager.CSharpName (type));
+                               ec.Report.Error (712, loc, "Cannot create an instance of the static class `{0}'", type.GetSignatureForError ());
                                return null;
                        }
 
@@ -5806,7 +5816,7 @@ namespace Mono.CSharp
                                }
                                
                                ec.Report.SymbolRelatedToPreviousError (type);
-                               ec.Report.Error (144, loc, "Cannot create an instance of the abstract class or interface `{0}'", TypeManager.CSharpName (type));
+                               ec.Report.Error (144, loc, "Cannot create an instance of the abstract class or interface `{0}'", type.GetSignatureForError ());
                                return null;
                        }
 
@@ -7794,7 +7804,7 @@ namespace Mono.CSharp
                        if (!ec.IsUnsafe) {
                                ec.Report.Error (233, loc,
                                        "`{0}' does not have a predefined size, therefore sizeof can only be used in an unsafe context (consider using System.Runtime.InteropServices.Marshal.SizeOf)",
-                                       TypeManager.CSharpName (type_queried));
+                                       type_queried.GetSignatureForError ());
                        }
                        
                        type = ec.BuiltinTypes.Int;
@@ -10073,8 +10083,8 @@ namespace Mono.CSharp
                                                        ec.Report.Error (1922, loc, "A field or property `{0}' cannot be initialized with a collection " +
                                                                "object initializer because type `{1}' does not implement `{2}' interface",
                                                                ec.CurrentInitializerVariable.GetSignatureForError (),
-                                                               TypeManager.CSharpName (ec.CurrentInitializerVariable.Type),
-                                                               TypeManager.CSharpName (ec.BuiltinTypes.IEnumerable));
+                                                               ec.CurrentInitializerVariable.Type.GetSignatureForError (),
+                                                               ec.BuiltinTypes.IEnumerable.GetSignatureForError ());
                                                        return null;
                                                }
                                                is_collection_initialization = true;
@@ -10108,7 +10118,7 @@ namespace Mono.CSharp
                        if (is_collection_initialization) {
                                if (TypeManager.HasElementType (type)) {
                                        ec.Report.Error (1925, loc, "Cannot initialize object of type `{0}' with a collection initializer",
-                                               TypeManager.CSharpName (type));
+                                               type.GetSignatureForError ());
                                }
                        }
 
index 3b0f76d34eeb3ff1ed7afdca188b6ec284617da9..ee55bec872a32d0edb466371d22bd9a3bb36110f 100644 (file)
@@ -482,7 +482,7 @@ namespace Mono.CSharp
 
                        if (buffer_size > int.MaxValue / type_size) {
                                Report.Error (1664, Location, "Fixed size buffer `{0}' of length `{1}' and type `{2}' exceeded 2^31 limit",
-                                       GetSignatureForError (), buffer_size.ToString (), TypeManager.CSharpName (MemberType));
+                                       GetSignatureForError (), buffer_size.ToString (), MemberType.GetSignatureForError ());
                                return;
                        }
 
@@ -664,7 +664,7 @@ namespace Mono.CSharp
                        if ((ModFlags & Modifiers.VOLATILE) != 0) {
                                if (!CanBeVolatile ()) {
                                        Report.Error (677, Location, "`{0}': A volatile field cannot be of the type `{1}'",
-                                               GetSignatureForError (), TypeManager.CSharpName (MemberType));
+                                               GetSignatureForError (), MemberType.GetSignatureForError ());
                                }
 
                                if ((ModFlags & Modifiers.READONLY) != 0) {
index b8cec0cfff22075ee4378111ccbcc5bb995b6e89..3e8d32f8d5f492e46ed0f1e07bccf8329066d4fb 100644 (file)
@@ -312,7 +312,7 @@ namespace Mono.CSharp {
                                if (type.IsSealed || !type.IsClass) {
                                        context.Module.Compiler.Report.Error (701, loc,
                                                "`{0}' is not a valid constraint. A constraint must be an interface, a non-sealed class or a type parameter",
-                                               TypeManager.CSharpName (type));
+                                               type.GetSignatureForError ());
                                        continue;
                                }
 
@@ -489,7 +489,7 @@ namespace Mono.CSharp {
                //
                // If partial type parameters constraints are not null and we don't
                // already have constraints they become our constraints. If we already
-               // have constraints, we must check that they're the same.
+               // have constraints, we must check that they're same.
                //
                public bool AddPartialConstraints (TypeDefinition part, TypeParameter tp)
                {
@@ -545,15 +545,19 @@ namespace Mono.CSharp {
                // with SRE (by calling `DefineGenericParameters()' on the TypeBuilder /
                // MethodBuilder).
                //
-               public void Define (GenericTypeParameterBuilder type, TypeSpec declaringType, TypeContainer parent)
+               public void Create (TypeSpec declaringType, TypeContainer parent)
                {
                        if (builder != null)
                                throw new InternalErrorException ();
 
                        // Needed to get compiler reference
                        this.Parent = parent;
-                       this.builder = type;
                        spec.DeclaringType = declaringType;
+               }
+
+               public void Define (GenericTypeParameterBuilder type)
+               {
+                       this.builder = type;
                        spec.SetMetaInfo (type);
                }
 
@@ -776,6 +780,8 @@ namespace Mono.CSharp {
                                                                }
                                                        }
                                                }
+                                       } else if (ifaces_defined == null) {
+                                               ifaces_defined = ifaces == null ? TypeSpec.EmptyTypes : ifaces.ToArray ();
                                        }
 
                                        //
@@ -793,9 +799,6 @@ namespace Mono.CSharp {
                                                }
                                        }
 
-                                       if (ifaces_defined == null)
-                                               ifaces_defined = ifaces == null ? TypeSpec.EmptyTypes : ifaces.ToArray ();
-
                                        state |= StateFlags.InterfacesExpanded;
                                }
 
@@ -2176,13 +2179,13 @@ namespace Mono.CSharp {
                        names.AddRange (tparams.names);
                }
 
-               public void Define (GenericTypeParameterBuilder[] buiders, TypeSpec declaringType, int parentOffset, TypeContainer parent)
+               public void Create (TypeSpec declaringType, int parentOffset, TypeContainer parent)
                {
                        types = new TypeParameterSpec[Count];
                        for (int i = 0; i < types.Length; ++i) {
                                var tp = names[i];
 
-                               tp.Define (buiders[i + parentOffset], declaringType, parent);
+                               tp.Create (declaringType, parent);
                                types[i] = tp.Type;
                                types[i].DeclaredPosition = i + parentOffset;
 
@@ -2192,6 +2195,14 @@ namespace Mono.CSharp {
                        }
                }
 
+               public void Define (GenericTypeParameterBuilder[] builders)
+               {
+                       for (int i = 0; i < types.Length; ++i) {
+                               var tp = names[i];
+                               tp.Define (builders [types [i].DeclaredPosition]);
+                       }
+               }
+
                public TypeParameter this[int index] {
                        get {
                                return names [index];
@@ -2231,6 +2242,44 @@ namespace Mono.CSharp {
                        return sb.ToString ();
                }
 
+
+               public void CheckPartialConstraints (Method part)
+               {
+                       var partTypeParameters = part.CurrentTypeParameters;
+
+                       for (int i = 0; i < Count; i++) {
+                               var tp_a = names[i];
+                               var tp_b = partTypeParameters [i];
+                               if (tp_a.Constraints == null) {
+                                       if (tp_b.Constraints == null)
+                                               continue;
+                               } else if (tp_b.Constraints != null && tp_a.Type.HasSameConstraintsDefinition (tp_b.Type)) {
+                                       continue;
+                               }
+
+                               part.Compiler.Report.SymbolRelatedToPreviousError (this[i].CurrentMemberDefinition.Location, "");
+                               part.Compiler.Report.Error (761, part.Location,
+                                       "Partial method declarations of `{0}' have inconsistent constraints for type parameter `{1}'",
+                                       part.GetSignatureForError (), partTypeParameters[i].GetSignatureForError ());
+                       }
+               }
+
+               public void UpdateConstraints (TypeDefinition part)
+               {
+                       var partTypeParameters = part.MemberName.TypeParameters;
+
+                       for (int i = 0; i < Count; i++) {
+                               var tp = names [i];
+                               if (tp.AddPartialConstraints (part, partTypeParameters [i]))
+                                       continue;
+
+                               part.Compiler.Report.SymbolRelatedToPreviousError (this[i].CurrentMemberDefinition);
+                               part.Compiler.Report.Error (265, part.Location,
+                                       "Partial declarations of `{0}' have inconsistent constraints for type parameter `{1}'",
+                                       part.GetSignatureForError (), tp.GetSignatureForError ());
+                       }
+               }
+
                public void VerifyClsCompliance ()
                {
                        foreach (var tp in names) {
@@ -2261,7 +2310,7 @@ namespace Mono.CSharp {
 
                public override string GetSignatureForError ()
                {
-                       return TypeManager.CSharpName (type);
+                       return type.GetSignatureForError ();
                }
 
                public override TypeSpec ResolveAsType (IMemberContext mc)
@@ -2409,7 +2458,7 @@ namespace Mono.CSharp {
                                if (mc != null) {
                                        mc.Module.Compiler.Report.Error (452, loc,
                                                "The type `{0}' must be a reference type in order to use it as type parameter `{1}' in the generic type or method `{2}'",
-                                               TypeManager.CSharpName (atype), tparam.GetSignatureForError (), context.GetSignatureForError ());
+                                               atype.GetSignatureForError (), tparam.GetSignatureForError (), context.GetSignatureForError ());
                                }
 
                                return false;
@@ -2419,7 +2468,7 @@ namespace Mono.CSharp {
                                if (mc != null) {
                                        mc.Module.Compiler.Report.Error (453, loc,
                                                "The type `{0}' must be a non-nullable value type in order to use it as type parameter `{1}' in the generic type or method `{2}'",
-                                               TypeManager.CSharpName (atype), tparam.GetSignatureForError (), context.GetSignatureForError ());
+                                               atype.GetSignatureForError (), tparam.GetSignatureForError (), context.GetSignatureForError ());
                                }
 
                                return false;
@@ -2480,7 +2529,7 @@ namespace Mono.CSharp {
                                        mc.Module.Compiler.Report.SymbolRelatedToPreviousError (atype);
                                        mc.Module.Compiler.Report.Error (310, loc,
                                                "The type `{0}' must have a public parameterless constructor in order to use it as parameter `{1}' in the generic type or method `{2}'",
-                                               TypeManager.CSharpName (atype), tparam.GetSignatureForError (), context.GetSignatureForError ());
+                                               atype.GetSignatureForError (), tparam.GetSignatureForError (), context.GetSignatureForError ());
                                }
                                return false;
                        }
index 6fe8770f6fa6b75fcc75eca8ff65110b25d35557..35d32c1d11643fd948721584b4d95282174cf297 100644 (file)
@@ -420,7 +420,7 @@ namespace Mono.CSharp
                                }
                        }
 
-                       IMemberDefinition definition;
+                       IMethodDefinition definition;
                        if (tparams != null) {
                                var gmd = new ImportedGenericMethodDefinition ((MethodInfo) mb, returnType, parameters, tparams, this);
                                foreach (var tp in gmd.TypeParameters) {
@@ -429,10 +429,10 @@ namespace Mono.CSharp
 
                                definition = gmd;
                        } else {
-                               definition = new ImportedParameterMemberDefinition (mb, returnType, parameters, this);
+                               definition = new ImportedMethodDefinition (mb, returnType, parameters, this);
                        }
 
-                       MethodSpec ms = new MethodSpec (kind, declaringType, definition, returnType, mb, parameters, mod);
+                       MethodSpec ms = new MethodSpec (kind, declaringType, definition, returnType, parameters, mod);
                        if (tparams != null)
                                ms.IsGeneric = true;
 
@@ -1006,58 +1006,6 @@ namespace Mono.CSharp
                                spec.BaseType = base_type;
                        }
 
-                       MetaType[] ifaces;
-#if STATIC
-                       ifaces = type.__GetDeclaredInterfaces ();
-                       if (ifaces.Length != 0) {
-                               foreach (var iface in ifaces) {
-                                       var it = CreateType (iface);
-                                       if (it == null)
-                                               continue;
-
-                                       spec.AddInterface (it);
-
-                                       // Unfortunately not all languages expand inherited interfaces
-                                       var bifaces = it.Interfaces;
-                                       if (bifaces != null) {
-                                               foreach (var biface in bifaces) {
-                                                       spec.AddInterface (biface);
-                                               }
-                                       }
-                               }
-                       }
-
-                       //
-                       // It's impossible to get declared interfaces only using System.Reflection
-                       // hence we need to mimic the behavior with ikvm-reflection too to keep
-                       // our type look-up logic same
-                       //
-                       if (spec.BaseType != null) {
-                               var bifaces = spec.BaseType.Interfaces;
-                               if (bifaces != null) {
-                                       //
-                                       // Before adding base class interfaces close defined interfaces
-                                       // on type parameter
-                                       //
-                                       var tp = spec as TypeParameterSpec;
-                                       if (tp != null && tp.InterfacesDefined == null) {
-                                               tp.InterfacesDefined = TypeSpec.EmptyTypes;
-                                       }
-
-                                       foreach (var iface in bifaces)
-                                               spec.AddInterface (iface);
-                               }
-                       }
-#else
-                       ifaces = type.GetInterfaces ();
-
-                       if (ifaces.Length > 0) {
-                               foreach (var iface in ifaces) {
-                                       spec.AddInterface (CreateType (iface));
-                               }
-                       }
-#endif
-
                        if (spec.MemberDefinition.TypeParametersCount > 0) {
                                foreach (var tp in spec.MemberDefinition.TypeParameters) {
                                        ImportTypeParameterTypeConstraints (tp, tp.GetMetaInfo ());
@@ -1735,7 +1683,7 @@ namespace Mono.CSharp
        {
                readonly AParametersCollection parameters;
 
-               public ImportedParameterMemberDefinition (MethodBase provider, TypeSpec type, AParametersCollection parameters, MetadataImporter importer)
+               protected ImportedParameterMemberDefinition (MethodBase provider, TypeSpec type, AParametersCollection parameters, MetadataImporter importer)
                        : base (provider, type, importer)
                {
                        this.parameters = parameters;
@@ -1758,7 +1706,21 @@ namespace Mono.CSharp
                #endregion
        }
 
-       class ImportedGenericMethodDefinition : ImportedParameterMemberDefinition, IGenericMethodDefinition
+       class ImportedMethodDefinition : ImportedParameterMemberDefinition, IMethodDefinition
+       {
+               public ImportedMethodDefinition (MethodBase provider, TypeSpec type, AParametersCollection parameters, MetadataImporter importer)
+                       : base (provider, type, parameters, importer)
+               {
+               }
+
+               MethodBase IMethodDefinition.Metadata {
+                       get {
+                               return (MethodBase) provider;
+                       }
+               }
+       }
+
+       class ImportedGenericMethodDefinition : ImportedMethodDefinition, IGenericMethodDefinition
        {
                readonly TypeParameterSpec[] tparams;
 
@@ -1864,6 +1826,63 @@ namespace Mono.CSharp
 
                #endregion
 
+               public void DefineInterfaces (TypeSpec spec)
+               {
+                       var type = (MetaType) provider;
+                       MetaType[] ifaces;
+#if STATIC
+                       ifaces = type.__GetDeclaredInterfaces ();
+                       if (ifaces.Length != 0) {
+                               foreach (var iface in ifaces) {
+                                       var it = importer.CreateType (iface);
+                                       if (it == null)
+                                               continue;
+
+                                       spec.AddInterfaceDefined (it);
+
+                                       // Unfortunately not all languages expand inherited interfaces
+                                       var bifaces = it.Interfaces;
+                                       if (bifaces != null) {
+                                               foreach (var biface in bifaces) {
+                                                       spec.AddInterfaceDefined (biface);
+                                               }
+                                       }
+                               }
+                       }
+                       
+                       //
+                       // It's impossible to get declared interfaces only using System.Reflection
+                       // hence we need to mimic the behavior with ikvm-reflection too to keep
+                       // our type look-up logic same
+                       //
+                       if (spec.BaseType != null) {
+                               var bifaces = spec.BaseType.Interfaces;
+                               if (bifaces != null) {
+                                       //
+                                       // Before adding base class interfaces close defined interfaces
+                                       // on type parameter
+                                       //
+                                       var tp = spec as TypeParameterSpec;
+                                       if (tp != null && tp.InterfacesDefined == null) {
+                                               tp.InterfacesDefined = TypeSpec.EmptyTypes;
+                                       }
+
+                                       foreach (var iface in bifaces)
+                                               spec.AddInterfaceDefined (iface);
+                               }
+                       }
+#else
+                       ifaces = type.GetInterfaces ();
+
+                       if (ifaces.Length > 0) {
+                               foreach (var iface in ifaces) {
+                                       spec.AddInterface (importer.CreateType (iface));
+                               }
+                       }
+#endif
+
+               }
+
                public static void Error_MissingDependency (IMemberContext ctx, List<TypeSpec> types, Location loc)
                {
                        // 
@@ -1872,33 +1891,36 @@ namespace Mono.CSharp
                        // or referenced from the user core in which case compilation error has to
                        // be reported because compiler cannot continue anyway
                        //
+
+                       var report = ctx.Module.Compiler.Report;
+
                        for (int i = 0; i < types.Count; ++i) {
                                var t = types [i];
 
                                //
-                               // Report missing types only once per type
+                               // Report missing types only once
                                //
-                               if (i > 0 && types.IndexOf (t) < i)
+                               if (report.Printer.MissingTypeReported (t.MemberDefinition))
                                        continue;
 
                                string name = t.GetSignatureForError ();
 
                                if (t.MemberDefinition.DeclaringAssembly == ctx.Module.DeclaringAssembly) {
-                                       ctx.Module.Compiler.Report.Error (1683, loc,
+                                       report.Error (1683, loc,
                                                "Reference to type `{0}' claims it is defined in this assembly, but it is not defined in source or any added modules",
                                                name);
                                } else if (t.MemberDefinition.DeclaringAssembly.IsMissing) {
                                        if (t.MemberDefinition.IsTypeForwarder) {
-                                               ctx.Module.Compiler.Report.Error (1070, loc,
+                                               report.Error (1070, loc,
                                                        "The type `{0}' has been forwarded to an assembly that is not referenced. Consider adding a reference to assembly `{1}'",
                                                        name, t.MemberDefinition.DeclaringAssembly.FullName);
                                        } else {
-                                               ctx.Module.Compiler.Report.Error (12, loc,
+                                               report.Error (12, loc,
                                                        "The type `{0}' is defined in an assembly that is not referenced. Consider adding a reference to assembly `{1}'",
                                                        name, t.MemberDefinition.DeclaringAssembly.FullName);
                                        }
                                } else {
-                                       ctx.Module.Compiler.Report.Error (1684, loc,
+                                       report.Error (1684, loc,
                                                "Reference to type `{0}' claims it is defined assembly `{1}', but it could not be found",
                                                name, t.MemberDefinition.DeclaringAssembly.FullName);
                                }
index dcbf10edf722bb4a6bf635406f9e62d75466939f..82ded9174c551a96a680ea7c2495cc9e9087b52c 100644 (file)
@@ -245,7 +245,7 @@ namespace Mono.CSharp
 
                                                for (int i = 0; i < host.hoisted_params.Count; ++i) {
                                                        HoistedParameter hp = host.hoisted_params [i];
-                                                       HoistedParameter hp_cp = host.hoisted_params_copy [i];
+                                                       HoistedParameter hp_cp = host.hoisted_params_copy [i] ?? hp;
 
                                                        FieldExpr from = new FieldExpr (hp_cp.Field, loc);
                                                        from.InstanceExpression = new CompilerGeneratedThis (ec.CurrentType, loc);
@@ -431,6 +431,13 @@ namespace Mono.CSharp
                        get { return hoisted_params; }
                }
 
+               protected override Constructor DefineDefaultConstructor (bool is_static)
+               {
+                       var ctor = base.DefineDefaultConstructor (is_static);
+                       ctor.ModFlags |= Modifiers.DEBUGGER_HIDDEN;
+                       return ctor;
+               }
+
                protected override TypeSpec[] ResolveBaseTypes (out FullNamedExpression base_class)
                {
                        var mtype = Iterator.OriginalIteratorType;
@@ -469,17 +476,26 @@ namespace Mono.CSharp
                        current_field = AddCompilerGeneratedField ("$current", iterator_type_expr);
                        disposing_field = AddCompilerGeneratedField ("$disposing", new TypeExpression (Compiler.BuiltinTypes.Bool, Location));
 
-                       if (hoisted_params != null) {
+                       if (Iterator.IsEnumerable && hoisted_params != null) {
                                //
                                // Iterators are independent, each GetEnumerator call has to
                                // create same enumerator therefore we have to keep original values
                                // around for re-initialization
                                //
-                               // TODO: Do it for assigned/modified parameters only
-                               //
                                hoisted_params_copy = new List<HoistedParameter> (hoisted_params.Count);
                                foreach (HoistedParameter hp in hoisted_params) {
-                                       hoisted_params_copy.Add (new HoistedParameter (hp, "<$>" + hp.Field.Name));
+
+                                       //
+                                       // Don't create field copy for unmodified captured parameters
+                                       //
+                                       HoistedParameter hp_copy;
+                                       if (hp.IsAssigned) {
+                                               hp_copy = new HoistedParameter (hp, "<$>" + hp.Field.Name);
+                                       } else {
+                                               hp_copy = null;
+                                       }
+
+                                       hoisted_params_copy.Add (hp_copy);
                                }
                        }
 
@@ -565,7 +581,8 @@ namespace Mono.CSharp
                protected override void EmitHoistedParameters (EmitContext ec, List<HoistedParameter> hoisted)
                {
                        base.EmitHoistedParameters (ec, hoisted);
-                       base.EmitHoistedParameters (ec, hoisted_params_copy);
+                       if (hoisted_params_copy != null)
+                               base.EmitHoistedParameters (ec, hoisted_params_copy);
                }
        }
 
@@ -1101,7 +1118,7 @@ namespace Mono.CSharp
                                              "The body of `{0}' cannot be an iterator block " +
                                              "because `{1}' is not an iterator interface type",
                                              method.GetSignatureForError (),
-                                             TypeManager.CSharpName (ret));
+                                             ret.GetSignatureForError ());
                                return;
                        }
 
index 9c854a8fe9547612f500c1433cecd4c029fc3174..a1c5ab2f914f4bed7b7938ca2f1f93a4463c3d35 100644 (file)
@@ -130,7 +130,7 @@ namespace Mono.CSharp.Linq
 
                                        if (!Convert.ImplicitConversionExists (rc, a.Expr, source_type)) {
                                                rc.Report.Error (1936, loc, "An implementation of `{0}' query expression pattern for source type `{1}' could not be found",
-                                                       best.Name, TypeManager.CSharpName (a.Type));
+                                                       best.Name, a.Type.GetSignatureForError ());
                                                return true;
                                        }
                                }
index bdbd57a4f7d168e9337bac99e60d757be243f1db..1af2d0c9e379ecb600379156bfe84dbf1ab67bb9 100644 (file)
@@ -61,7 +61,7 @@ namespace Mono.CSharp
 
                        if (TypeSpec.IsValueType (t)) {
                                ec.Report.Error(37, loc, "Cannot convert null to `{0}' because it is a value type",
-                                       TypeManager.CSharpName(t));
+                                       t.GetSignatureForError ());
                                return;
                        }
 
index 85eb26c5a1941b47bff6b5272a38d061284e6aed..10afaa1cc263a97ef0ff931eaaa422d01a822619 100644 (file)
@@ -412,11 +412,28 @@ if (checkpoints.Length <= CheckpointIndex) throw new Exception (String.Format ("
                public class MemberLocations
                {
                        public readonly IList<Tuple<Modifiers, Location>> Modifiers;
-                       Location[] locations;
+                       List<Location> locations;
 
-                       public MemberLocations (IList<Tuple<Modifiers, Location>> mods, Location[] locs)
+                       public MemberLocations (IList<Tuple<Modifiers, Location>> mods)
                        {
                                Modifiers = mods;
+                       }
+
+                       public MemberLocations (IList<Tuple<Modifiers, Location>> mods, Location loc)
+                               : this (mods)
+                       {
+                               AddLocations (loc);
+                       }
+
+                       public MemberLocations (IList<Tuple<Modifiers, Location>> mods, Location[] locs)
+                               : this (mods)
+                       {
+                               AddLocations (locs);
+                       }
+
+                       public MemberLocations (IList<Tuple<Modifiers, Location>> mods, List<Location> locs)
+                               : this (mods)
+                       {
                                locations = locs;
                        }
 
@@ -430,31 +447,50 @@ if (checkpoints.Length <= CheckpointIndex) throw new Exception (String.Format ("
                        
                        public int Count {
                                get {
-                                       return locations.Length;
+                                       return locations.Count;
                                }
                        }
 
                        #endregion
 
+                       public void AddLocations (Location loc)
+                       {
+                               if (locations == null) {
+                                       locations = new List<Location> ();
+                               }
+
+                               locations.Add (loc);
+                       }
+
                        public void AddLocations (params Location[] additional)
                        {
                                if (locations == null) {
-                                       locations = additional;
+                                       locations = new List<Location> (additional);
                                } else {
-                                       int pos = locations.Length;
-                                       Array.Resize (ref locations, pos + additional.Length);
-                                       additional.CopyTo (locations, pos);
+                                       locations.AddRange (additional);
                                }
                        }
                }
 
-               Dictionary<object, Location[]> simple_locs = new Dictionary<object, Location[]> (ReferenceEquality<object>.Default);
+               Dictionary<object, List<Location>> simple_locs = new Dictionary<object, List<Location>> (ReferenceEquality<object>.Default);
                Dictionary<MemberCore, MemberLocations> member_locs = new Dictionary<MemberCore, MemberLocations> (ReferenceEquality<MemberCore>.Default);
 
                [Conditional ("FULL_AST")]
                public void AddLocation (object element, params Location[] locations)
                {
-                       simple_locs.Add (element, locations);
+                       simple_locs.Add (element, new List<Location> (locations));
+               }
+
+               [Conditional ("FULL_AST")]
+               public void InsertLocation (object element, int index, Location location)
+               {
+                       List<Location> found;
+                       if (!simple_locs.TryGetValue (element, out found)) {
+                               found = new List<Location> ();
+                               simple_locs.Add (element, found);
+                       }
+
+                       found.Insert (index, location);
                }
 
                [Conditional ("FULL_AST")]
@@ -463,7 +499,19 @@ if (checkpoints.Length <= CheckpointIndex) throw new Exception (String.Format ("
                        if (locations.Length == 0)
                                throw new ArgumentException ("Statement is missing semicolon location");
 
-                       simple_locs.Add (element, locations);
+                       AddLocation (element, locations);
+               }
+
+               [Conditional ("FULL_AST")]
+               public void AddMember (MemberCore member, IList<Tuple<Modifiers, Location>> modLocations)
+               {
+                       member_locs.Add (member, new MemberLocations (modLocations));
+               }
+
+               [Conditional ("FULL_AST")]
+               public void AddMember (MemberCore member, IList<Tuple<Modifiers, Location>> modLocations, Location location)
+               {
+                       member_locs.Add (member, new MemberLocations (modLocations, location));
                }
 
                [Conditional ("FULL_AST")]
@@ -473,13 +521,21 @@ if (checkpoints.Length <= CheckpointIndex) throw new Exception (String.Format ("
                }
 
                [Conditional ("FULL_AST")]
-               public void AppendTo (object existing, params Location[] locations)
+               public void AddMember (MemberCore member, IList<Tuple<Modifiers, Location>> modLocations, List<Location> locations)
                {
-                       Location[] locs;
-                       if (simple_locs.TryGetValue (existing, out locs)) {
-                               simple_locs [existing] = locs.Concat (locations).ToArray ();
-                               return;
+                       member_locs.Add (member, new MemberLocations (modLocations, locations));
+               }
+
+               [Conditional ("FULL_AST")]
+               public void AppendTo (object element, Location location)
+               {
+                       List<Location> found;
+                       if (!simple_locs.TryGetValue (element, out found)) {
+                               found = new List<Location> ();
+                               simple_locs.Add (element, found);
                        }
+
+                       found.Add (location);
                }
 
                [Conditional ("FULL_AST")]
@@ -492,9 +548,9 @@ if (checkpoints.Length <= CheckpointIndex) throw new Exception (String.Format ("
                        }
                }
 
-               public Location[] GetLocations (object element)
+               public List<Location> GetLocations (object element)
                {
-                       Location[] found;
+                       List<Location> found;
                        simple_locs.TryGetValue (element, out found);
                        return found;
                }
index cad910e01bc896b209a8c150e094a23a5513b660..de1ef82c7fd610f50f3cce042a8d9897e2bfeac8 100644 (file)
@@ -1445,9 +1445,12 @@ namespace Mono.CSharp {
                                                                        "A partial method declaration and partial method implementation must be both `static' or neither");
                                                        }
 
-                                                       Report.SymbolRelatedToPreviousError (ce);
-                                                       Report.Error (764, member.Location,
-                                                               "A partial method declaration and partial method implementation must be both `unsafe' or neither");
+                                                       if ((method_a.ModFlags & Modifiers.UNSAFE) != (method_b.ModFlags & Modifiers.UNSAFE)) {
+                                                               Report.SymbolRelatedToPreviousError (ce);
+                                                               Report.Error (764, member.Location,
+                                                                       "A partial method declaration and partial method implementation must be both `unsafe' or neither");
+                                                       }
+
                                                        return false;
                                                }
 
index b571c0c5c4c2b15f146c643a2576a60af9a86e53..22f73d5cef7570a2234b427249c7e3fd85f4a37c 100644 (file)
@@ -188,7 +188,7 @@ namespace Mono.CSharp {
                }
        }
 
-       public interface IGenericMethodDefinition : IMemberDefinition
+       public interface IGenericMethodDefinition : IMethodDefinition
        {
                TypeParameterSpec[] TypeParameters { get; }
                int TypeParametersCount { get; }
@@ -198,18 +198,17 @@ namespace Mono.CSharp {
 
        public sealed class MethodSpec : MemberSpec, IParametersMember
        {
-               MethodBase metaInfo, inflatedMetaInfo;
+               MethodBase inflatedMetaInfo;
                AParametersCollection parameters;
                TypeSpec returnType;
 
                TypeSpec[] targs;
                TypeParameterSpec[] constraints;
 
-               public MethodSpec (MemberKind kind, TypeSpec declaringType, IMemberDefinition details, TypeSpec returnType,
-                       MethodBase info, AParametersCollection parameters, Modifiers modifiers)
+               public MethodSpec (MemberKind kind, TypeSpec declaringType, IMethodDefinition details, TypeSpec returnType,
+                       AParametersCollection parameters, Modifiers modifiers)
                        : base (kind, declaringType, details, modifiers)
                {
-                       this.metaInfo = info;
                        this.parameters = parameters;
                        this.returnType = returnType;
                }
@@ -237,6 +236,12 @@ namespace Mono.CSharp {
                        }
                }
 
+               public new IMethodDefinition MemberDefinition {
+                       get {
+                               return (IMethodDefinition) definition;
+                       }
+               }
+
                public IGenericMethodDefinition GenericDefinition {
                        get {
                                return (IGenericMethodDefinition) definition;
@@ -322,21 +327,21 @@ namespace Mono.CSharp {
 
                                        if (DeclaringType.IsTypeBuilder) {
                                                if (IsConstructor)
-                                                       inflatedMetaInfo = TypeBuilder.GetConstructor (dt_meta, (ConstructorInfo) metaInfo);
+                                                       inflatedMetaInfo = TypeBuilder.GetConstructor (dt_meta, (ConstructorInfo) MemberDefinition.Metadata);
                                                else
-                                                       inflatedMetaInfo = TypeBuilder.GetMethod (dt_meta, (MethodInfo) metaInfo);
+                                                       inflatedMetaInfo = TypeBuilder.GetMethod (dt_meta, (MethodInfo) MemberDefinition.Metadata);
                                        } else {
 #if STATIC
                                                // it should not be reached
                                                throw new NotImplementedException ();
 #else
-                                               inflatedMetaInfo = MethodInfo.GetMethodFromHandle (metaInfo.MethodHandle, dt_meta.TypeHandle);
+                                               inflatedMetaInfo = MethodInfo.GetMethodFromHandle (MemberDefinition.Metadata.MethodHandle, dt_meta.TypeHandle);
 #endif
                                        }
 
                                        state &= ~StateFlags.PendingMetaInflate;
                                } else {
-                                       inflatedMetaInfo = metaInfo;
+                                       inflatedMetaInfo = MemberDefinition.Metadata;
                                }
                        }
 
@@ -518,19 +523,10 @@ namespace Mono.CSharp {
 
                        return missing;                 
                }
-
-               public void SetMetaInfo (MethodInfo info)
-               {
-                       if (this.metaInfo != null)
-                               throw new InternalErrorException ("MetaInfo reset");
-
-                       this.metaInfo = info;
-               }
        }
 
-       public abstract class MethodOrOperator : MethodCore, IMethodData
+       public abstract class MethodOrOperator : MethodCore, IMethodData, IMethodDefinition
        {
-               public MethodBuilder MethodBuilder;
                ReturnParameter return_attributes;
                SecurityType declarative_security;
                protected MethodData MethodData;
@@ -583,6 +579,19 @@ namespace Mono.CSharp {
                        }
                }
 
+               MethodBase IMethodDefinition.Metadata {
+                       get {
+                               return MethodData.MethodBuilder;
+                       }
+               }
+
+               // TODO: Remove and use MethodData abstraction
+               public MethodBuilder MethodBuilder {
+                       get {
+                               return MethodData.MethodBuilder;
+                       }
+               }
+
                protected override bool CheckForDuplications ()
                {
                        return Parent.MemberCache.CheckExistingMembersOverloads (this, parameters);
@@ -609,41 +618,34 @@ namespace Mono.CSharp {
                        else
                                kind = MemberKind.Method;
 
+                       string explicit_name;
+
                        if (IsPartialDefinition) {
                                caching_flags &= ~Flags.Excluded_Undetected;
                                caching_flags |= Flags.Excluded;
 
                                // Add to member cache only when a partial method implementation has not been found yet
-                               if ((caching_flags & Flags.PartialDefinitionExists) == 0) {
-//                                     MethodBase mb = new PartialMethodDefinitionInfo (this);
+                               if ((caching_flags & Flags.PartialDefinitionExists) != 0)
+                                       return true;
 
-                                       spec = new MethodSpec (kind, Parent.Definition, this, ReturnType, null, parameters, ModFlags);
-                                       if (MemberName.Arity > 0) {
-                                               spec.IsGeneric = true;
+                               if (IsExplicitImpl)
+                                       return true;
 
-                                               // TODO: Have to move DefineMethod after Define (ideally to Emit)
-                                               throw new NotImplementedException ("Generic partial methods");
-                                       }
+                               explicit_name = null;
+                       } else {
+                               MethodData = new MethodData (this, ModFlags, flags, this, base_method);
 
-                                       Parent.MemberCache.AddMember (spec);
-                               }
+                               if (!MethodData.Define (Parent.PartialContainer, GetFullName (MemberName)))
+                                       return false;
 
-                               return true;
+                               explicit_name = MethodData.MetadataName;
                        }
 
-                       MethodData = new MethodData (
-                               this, ModFlags, flags, this, MethodBuilder, base_method);
-
-                       if (!MethodData.Define (Parent.PartialContainer, GetFullName (MemberName)))
-                               return false;
-                                       
-                       MethodBuilder = MethodData.MethodBuilder;
-
-                       spec = new MethodSpec (kind, Parent.Definition, this, ReturnType, MethodBuilder, parameters, ModFlags);
+                       spec = new MethodSpec (kind, Parent.Definition, this, ReturnType, parameters, ModFlags);
                        if (MemberName.Arity > 0)
                                spec.IsGeneric = true;
-                       
-                       Parent.MemberCache.AddMember (this, MethodBuilder.Name, spec);
+
+                       Parent.MemberCache.AddMember (this, explicit_name, spec);
 
                        return true;
                }
@@ -798,6 +800,33 @@ namespace Mono.CSharp {
 
                #endregion
 
+               public virtual void PrepareEmit ()
+               {
+                       var mb = MethodData.DefineMethodBuilder (Parent);
+
+                       if (CurrentTypeParameters != null) {
+                               string[] gnames = new string[CurrentTypeParameters.Count];
+                               for (int i = 0; i < gnames.Length; ++i) {
+                                       gnames[i] = CurrentTypeParameters[i].Name;
+                               }
+
+                               var gen_params = MethodBuilder.DefineGenericParameters (gnames);
+
+                               for (int i = 0; i < CurrentTypeParameters.Count; ++i) {
+                                       var tp = CurrentTypeParameters[i];
+
+                                       tp.Define (gen_params[i]);
+                               }
+                       }
+
+                       //
+                       // Generic method has been already defined to resolve method parameters
+                       // correctly when they use type parameters
+                       //
+                       mb.SetParameters (parameters.GetMetaInfo ());
+                       mb.SetReturnType (ReturnType.GetMetaInfo ());
+               }
+
                public override void WriteDebugSymbol (MonoSymbolFile file)
                {
                        if (MethodData != null)
@@ -844,7 +873,7 @@ namespace Mono.CSharp {
                        }
                }
 
-#endregion
+               #endregion
 
                public override void Accept (StructuralVisitor visitor)
                {
@@ -972,10 +1001,9 @@ namespace Mono.CSharp {
                void CreateTypeParameters ()
                {
                        var tparams = MemberName.TypeParameters;
-                       string[] snames = new string[MemberName.Arity];
                        var parent_tparams = Parent.TypeParametersAll;
 
-                       for (int i = 0; i < snames.Length; i++) {
+                       for (int i = 0; i < MemberName.Arity; i++) {
                                string type_argument_name = tparams[i].MemberName.Name;
 
                                if (block == null) {
@@ -1000,12 +1028,9 @@ namespace Mono.CSharp {
                                                tparams[i].WarningParentNameConflict (tp);
                                        }
                                }
-
-                               snames[i] = type_argument_name;
                        }
 
-                       GenericTypeParameterBuilder[] gen_params = MethodBuilder.DefineGenericParameters (snames);
-                       tparams.Define (gen_params, null, 0, Parent);
+                       tparams.Create (null, 0, Parent);
                }
 
                protected virtual void DefineTypeParameters ()
@@ -1171,9 +1196,6 @@ namespace Mono.CSharp {
                                        "Introducing `Finalize' method can interfere with destructor invocation. Did you intend to declare a destructor?");
                        }
 
-                       if (partialMethodImplementation != null && IsPartialDefinition)
-                               MethodBuilder = partialMethodImplementation.MethodBuilder;
-
                        if (Compiler.Settings.StdLib && ReturnType.IsSpecialRuntimeType) {
                                Error1599 (Location, ReturnType, Report);
                                return false;
@@ -1208,7 +1230,7 @@ namespace Mono.CSharp {
                                                Report.Error (1983, Location, "The return type of an async method must be void, Task, or Task<T>");
                                        }
 
-                                       block = (ToplevelBlock) block.ConvertToAsyncTask (this, Parent.PartialContainer, parameters, ReturnType, Location);
+                                       block = (ToplevelBlock) block.ConvertToAsyncTask (this, Parent.PartialContainer, parameters, ReturnType, null, Location);
                                        ModFlags |= Modifiers.DEBUGGER_HIDDEN;
                                }
 
@@ -1272,6 +1294,22 @@ namespace Mono.CSharp {
                        return true;
                }
 
+               public override void PrepareEmit ()
+               {
+                       if (IsPartialDefinition) {
+                               //
+                               // Use partial method implementation builder for partial method declaration attributes
+                               //
+                               if (partialMethodImplementation != null) {
+                                       MethodData = partialMethodImplementation.MethodData;
+                               }
+
+                               return;
+                       }
+
+                       base.PrepareEmit ();
+               }
+
                //
                // Emits the code
                // 
@@ -1279,11 +1317,8 @@ namespace Mono.CSharp {
                {
                        try {
                                if (IsPartialDefinition) {
-                                       //
-                                       // Use partial method implementation builder for partial method declaration attributes
-                                       //
-                                       if (partialMethodImplementation != null) {
-                                               MethodBuilder = partialMethodImplementation.MethodBuilder;
+                                       if (partialMethodImplementation != null && CurrentTypeParameters != null) {
+                                               CurrentTypeParameters.CheckPartialConstraints (partialMethodImplementation);
                                        }
 
                                        return;
@@ -1297,11 +1332,15 @@ namespace Mono.CSharp {
                                if (CurrentTypeParameters != null) {
                                        for (int i = 0; i < CurrentTypeParameters.Count; ++i) {
                                                var tp = CurrentTypeParameters [i];
+
                                                tp.CheckGenericConstraints (false);
                                                tp.Emit ();
                                        }
                                }
 
+                               if (IsExplicitImpl)
+                                       MethodData.DefineOverride (Parent);
+
                                if (block != null && block.StateMachine is AsyncTaskStorey) {
                                        var psm = Module.PredefinedAttributes.AsyncStateMachine;
                                        
@@ -1312,10 +1351,8 @@ namespace Mono.CSharp {
                                        Module.PredefinedAttributes.Extension.EmitAttribute (MethodBuilder);
 
                                base.Emit ();
-                       } catch {
-                               Console.WriteLine ("Internal compiler error at {0}: exception caught while emitting {1}",
-                                                  Location, MethodBuilder);
-                               throw;
+                       } catch (Exception e) {
+                               throw new InternalErrorException (this, e);
                        }
                }
 
@@ -1329,13 +1366,12 @@ namespace Mono.CSharp {
 
                public static void Error1599 (Location loc, TypeSpec t, Report Report)
                {
-                       Report.Error (1599, loc, "Method or delegate cannot return type `{0}'", TypeManager.CSharpName (t));
+                       Report.Error (1599, loc, "Method or delegate cannot return type `{0}'", t.GetSignatureForError ());
                }
 
                protected override bool ResolveMemberType ()
                {
                        if (CurrentTypeParameters != null) {
-                               MethodBuilder = Parent.TypeBuilder.DefineMethod (GetFullName (MemberName), flags);
                                CreateTypeParameters ();
                        }
 
@@ -1485,7 +1521,7 @@ namespace Mono.CSharp {
                }
        }
        
-       public class Constructor : MethodCore, IMethodData
+       public class Constructor : MethodCore, IMethodData, IMethodDefinition
        {
                public ConstructorBuilder ConstructorBuilder;
                public ConstructorInitializer Initializer;
@@ -1533,6 +1569,13 @@ namespace Mono.CSharp {
                    }
                }
 
+               
+               MethodBase IMethodDefinition.Metadata {
+                       get {
+                               return ConstructorBuilder;
+                       }
+               }
+
                //
                // Returns true if this is a default constructor
                //
@@ -1620,7 +1663,7 @@ namespace Mono.CSharp {
                                ca, CallingConventions,
                                parameters.GetMetaInfo ());
 
-                       spec = new MethodSpec (MemberKind.Constructor, Parent.Definition, this, Compiler.BuiltinTypes.Void, ConstructorBuilder, parameters, ModFlags);
+                       spec = new MethodSpec (MemberKind.Constructor, Parent.Definition, this, Compiler.BuiltinTypes.Void, parameters, ModFlags);
                        
                        Parent.MemberCache.AddMember (spec);
                        
@@ -1828,10 +1871,6 @@ namespace Mono.CSharp {
        //
        public class MethodData
        {
-#if !STATIC
-               static FieldInfo methodbuilder_attrs_field;
-#endif
-
                public readonly IMethodData method;
 
                //
@@ -1848,6 +1887,7 @@ namespace Mono.CSharp {
                protected TypeSpec declaring_type;
                protected MethodSpec parent_method;
                SourceMethodBuilder debug_builder;
+               string full_name;
 
                MethodBuilder builder;
                public MethodBuilder MethodBuilder {
@@ -1862,6 +1902,12 @@ namespace Mono.CSharp {
                        }
                }
 
+               public string MetadataName {
+                       get {
+                               return full_name;
+                       }
+               }
+
                public MethodData (InterfaceMemberBase member,
                                   Modifiers modifiers, MethodAttributes flags, IMethodData method)
                {
@@ -1874,11 +1920,10 @@ namespace Mono.CSharp {
 
                public MethodData (InterfaceMemberBase member,
                                   Modifiers modifiers, MethodAttributes flags, 
-                                  IMethodData method, MethodBuilder builder,
+                                  IMethodData method,
                                   MethodSpec parent_method)
                        : this (member, modifiers, flags, method)
                {
-                       this.builder = builder;
                        this.parent_method = parent_method;
                }
 
@@ -1896,13 +1941,13 @@ namespace Mono.CSharp {
                                                if (member is PropertyBase) {
                                                        container.Compiler.Report.Error (550, method.Location,
                                                                "`{0}' is an accessor not found in interface member `{1}{2}'",
-                                                                         method.GetSignatureForError (), TypeManager.CSharpName (member.InterfaceType),
+                                                                         method.GetSignatureForError (), member.InterfaceType.GetSignatureForError (),
                                                                          member.GetSignatureForError ().Substring (member.GetSignatureForError ().LastIndexOf ('.')));
 
                                                } else {
                                                        container.Compiler.Report.Error (539, method.Location,
                                                                          "`{0}.{1}' in explicit interface declaration is not a member of interface",
-                                                                         TypeManager.CSharpName (member.InterfaceType), member.ShortName);
+                                                                         member.InterfaceType.GetSignatureForError (), member.ShortName);
                                                }
                                                return false;
                                        }
@@ -1910,7 +1955,7 @@ namespace Mono.CSharp {
                                                container.Compiler.Report.SymbolRelatedToPreviousError (implementing);
                                                container.Compiler.Report.Error (683, method.Location,
                                                        "`{0}' explicit method implementation cannot implement `{1}' because it is an accessor",
-                                                       member.GetSignatureForError (), TypeManager.CSharpSignature (implementing));
+                                                       member.GetSignatureForError (), implementing.GetSignatureForError ());
                                                return false;
                                        }
                                } else {
@@ -2033,58 +2078,45 @@ namespace Mono.CSharp {
                                        method_full_name = implementing.MemberDefinition.Name;
                        }
 
-                       DefineMethodBuilder (container, method_full_name, method.ParameterInfo);
+                       full_name = method_full_name;
+                       declaring_type = container.Definition;
 
-                       if (builder == null)
-                               return false;
+                       return true;
+               }
 
-//                     if (container.CurrentType != null)
-//                             declaring_type = container.CurrentType;
-//                     else
-                               declaring_type = container.Definition;
+               public void DefineOverride (TypeDefinition container)
+               {
+                       if (implementing == null)
+                               return;
 
-                       if (implementing != null && member.IsExplicitImpl) {
-                               container.TypeBuilder.DefineMethodOverride (builder, (MethodInfo) implementing.GetMetaInfo ());
-                       }
+                       if (!member.IsExplicitImpl)
+                               return;
 
-                       return true;
+                       container.TypeBuilder.DefineMethodOverride (builder, (MethodInfo) implementing.GetMetaInfo ());
                }
 
-
-               /// <summary>
-               /// Create the MethodBuilder for the method 
-               /// </summary>
-               void DefineMethodBuilder (TypeDefinition container, string method_name, ParametersCompiled param)
+               //
+               // Creates partial MethodBuilder for the method when has generic parameters used
+               // as arguments or return type
+               //
+               public MethodBuilder DefineMethodBuilder (TypeDefinition container)
                {
-                       var return_type = method.ReturnType.GetMetaInfo ();
-                       var p_types = param.GetMetaInfo ();
+                       if (builder != null)
+                               throw new InternalErrorException ();
 
-                       if (builder == null) {
-                               builder = container.TypeBuilder.DefineMethod (
-                                       method_name, flags, method.CallingConventions,
-                                       return_type, p_types);
-                               return;
-                       }
+                       builder = container.TypeBuilder.DefineMethod (full_name, flags, method.CallingConventions);
+                       return builder;
+               }
 
-                       //
-                       // Generic method has been already defined to resolve method parameters
-                       // correctly when they use type parameters
-                       //
-                       builder.SetParameters (p_types);
-                       builder.SetReturnType (return_type);
-                       if (builder.Attributes != flags) {
-#if STATIC
-                               builder.__SetAttributes (flags);
-#else
-                               try {
-                                       if (methodbuilder_attrs_field == null)
-                                               methodbuilder_attrs_field = typeof (MethodBuilder).GetField ("attrs", BindingFlags.NonPublic | BindingFlags.Instance);
-                                       methodbuilder_attrs_field.SetValue (builder, flags);
-                               } catch {
-                                       container.Compiler.Report.RuntimeMissingSupport (method.Location, "Generic method MethodAttributes");
-                               }
-#endif
-                       }
+               //
+               // Creates full MethodBuilder for the method 
+               //
+               public MethodBuilder DefineMethodBuilder (TypeDefinition container, ParametersCompiled param)
+               {
+                       DefineMethodBuilder (container);
+                       builder.SetReturnType (method.ReturnType.GetMetaInfo ());
+                       builder.SetParameters (param.GetMetaInfo ());
+                       return builder;
                }
 
                //
@@ -2092,6 +2124,8 @@ namespace Mono.CSharp {
                // 
                public void Emit (TypeDefinition parent)
                {
+                       DefineOverride (parent);
+
                        var mc = (IMemberContext) method;
 
                        method.ParameterInfo.ApplyAttributes (mc, MethodBuilder);
@@ -2226,7 +2260,7 @@ namespace Mono.CSharp {
 
        // Ooouh Martin, templates are missing here.
        // When it will be possible move here a lot of child code and template method type.
-       public abstract class AbstractPropertyEventMethod : MemberCore, IMethodData {
+       public abstract class AbstractPropertyEventMethod : MemberCore, IMethodData, IMethodDefinition {
                protected MethodData method_data;
                protected ToplevelBlock block;
                protected SecurityType declarative_security;
@@ -2292,6 +2326,12 @@ namespace Mono.CSharp {
                        }
                }
 
+               MethodBase IMethodDefinition.Metadata {
+                       get {
+                               return method_data.MethodBuilder;
+                       }
+               }
+
                public abstract ParametersCompiled ParameterInfo { get ; }
                public abstract TypeSpec ReturnType { get; }
 
@@ -2302,7 +2342,7 @@ namespace Mono.CSharp {
                        if (a.Type == pa.CLSCompliant || a.Type == pa.Obsolete || a.Type == pa.Conditional) {
                                Report.Error (1667, a.Location,
                                        "Attribute `{0}' is not valid on property or event accessors. It is valid on `{1}' declarations only",
-                                       TypeManager.CSharpName (a.Type), a.GetValidTargets ());
+                                       a.Type.GetSignatureForError (), a.GetValidTargets ());
                                return;
                        }
 
index de355945a0643f97667e26eac9179ae7fb1a7ae0..c1cef03916432b4f8564c0a2329b2662eecbbc9b 100644 (file)
@@ -252,7 +252,7 @@ namespace Mono.CSharp {
 
                        case "System.Windows.Forms":
                        case "System.Windows.Forms.Layout":
-                               assembly = "System.Windows.Name";
+                               assembly = "System.Windows.Forms";
                                break;
                        }
 
index 788bbfbeb8e5cd3aaed4114ae1ac2e2508d80a7d..badf5e1a7301b7aa9dded3c6b81d5b37d144a9fd 100644 (file)
@@ -320,7 +320,7 @@ namespace Mono.CSharp.Nullable
                public static Constant CreateFromExpression (ResolveContext ec, Expression e)
                {
                        ec.Report.Warning (458, 2, e.Location, "The result of the expression is always `null' of type `{0}'",
-                               TypeManager.CSharpName (e.Type));
+                               e.Type.GetSignatureForError ());
 
                        return ReducedExpression.Create (Create (e.Type, e.Location), e);
                }
@@ -592,10 +592,10 @@ namespace Mono.CSharp.Nullable
 
                        if ((Oper & Operator.EqualityMask) != 0) {
                                ec.Report.Warning (472, 2, loc, "The result of comparing value type `{0}' with null is always `{1}'",
-                                       TypeManager.CSharpName (expr.Type), c.GetValueAsLiteral ());
+                                       expr.Type.GetSignatureForError (), c.GetValueAsLiteral ());
                        } else {
                                ec.Report.Warning (464, 2, loc, "The result of comparing type `{0}' with null is always `{1}'",
-                                       TypeManager.CSharpName (expr.Type), c.GetValueAsLiteral ());
+                                       expr.Type.GetSignatureForError (), c.GetValueAsLiteral ());
                        }
 
                        return ReducedExpression.Create (c, this);
index 75a7bb73db0afe40c9e2f8f70753dd0555d7810f..69ae1cf839f2a8da9cd5352f0b2fa11521f27a8f 100644 (file)
@@ -338,7 +338,7 @@ namespace Mono.CSharp {
                                if (HasOptionalExpression) {
                                        a.Report.Error (1745, a.Location,
                                                "Cannot specify `{0}' attribute on optional parameter `{1}'",
-                                               TypeManager.CSharpName (a.Type).Replace ("Attribute", ""), Name);
+                                               a.Type.GetSignatureForError ().Replace ("Attribute", ""), Name);
                                }
 
                                if (a.Type == pa.DefaultParameterValue)
@@ -406,7 +406,7 @@ namespace Mono.CSharp {
 
                        if ((modFlags & Modifier.This) != 0 && (parameter_type.IsPointer || parameter_type.BuiltinType == BuiltinTypeSpec.Type.Dynamic)) {
                                rc.Module.Compiler.Report.Error (1103, Location, "The extension method cannot be of type `{0}'",
-                                       TypeManager.CSharpName (parameter_type));
+                                       parameter_type.GetSignatureForError ());
                        }
 
                        return parameter_type;
@@ -582,7 +582,7 @@ namespace Mono.CSharp {
                {
                        string type_name;
                        if (parameter_type != null)
-                               type_name = TypeManager.CSharpName (parameter_type);
+                               type_name = parameter_type.GetSignatureForError ();
                        else
                                type_name = texpr.GetSignatureForError ();
 
@@ -989,11 +989,11 @@ namespace Mono.CSharp {
                        if (types == null || types [pos] == null)
                                return ((Parameter)FixedParameters [pos]).GetSignatureForError ();
 
-                       string type = TypeManager.CSharpName (types [pos]);
+                       string type = types [pos].GetSignatureForError ();
                        if (FixedParameters [pos].HasExtensionMethodModifier)
                                return "this " + type;
 
-                       Parameter.Modifier mod = FixedParameters [pos].ModFlags;
+                       var mod = FixedParameters[pos].ModFlags & Parameter.Modifier.ModifierMask;
                        if (mod == 0)
                                return type;
 
index 325b8f118f4bab61e4995812fa54f66a22821e3f..327c58c60839155d452ed05d7e118e659f1c8372 100644 (file)
@@ -201,14 +201,14 @@ namespace Mono.CSharp
                        {
                                base.Define (parent);
 
-                               Spec = new MethodSpec (MemberKind.Method, parent.PartialContainer.Definition, this, ReturnType, null, ParameterInfo, ModFlags);
+                               Spec = new MethodSpec (MemberKind.Method, parent.PartialContainer.Definition, this, ReturnType, ParameterInfo, ModFlags);
 
                                method_data = new MethodData (method, ModFlags, flags, this);
 
                                if (!method_data.Define (parent.PartialContainer, method.GetFullName (MemberName)))
                                        return null;
 
-                               Spec.SetMetaInfo (method_data.MethodBuilder);
+                               method_data.DefineMethodBuilder (parent.PartialContainer, ParameterInfo);
 
                                return method_data.MethodBuilder;
                        }
@@ -268,14 +268,14 @@ namespace Mono.CSharp
                                
                                base.Define (parent);
 
-                               Spec = new MethodSpec (MemberKind.Method, parent.PartialContainer.Definition, this, ReturnType, null, ParameterInfo, ModFlags);
+                               Spec = new MethodSpec (MemberKind.Method, parent.PartialContainer.Definition, this, ReturnType, ParameterInfo, ModFlags);
 
                                method_data = new MethodData (method, ModFlags, flags, this);
 
                                if (!method_data.Define (parent.PartialContainer, method.GetFullName (MemberName)))
                                        return null;
 
-                               Spec.SetMetaInfo (method_data.MethodBuilder);
+                               method_data.DefineMethodBuilder (parent.PartialContainer, ParameterInfo);
 
                                return method_data.MethodBuilder;
                        }
@@ -1198,15 +1198,15 @@ namespace Mono.CSharp
                                if (!method_data.Define (parent.PartialContainer, method.GetFullName (MemberName)))
                                        return null;
 
+                               method_data.DefineMethodBuilder (parent.PartialContainer, ParameterInfo);
+
                                if (Compiler.Settings.WriteMetadataOnly)
                                        block = null;
 
-                               MethodBuilder mb = method_data.MethodBuilder;
-
-                               Spec = new MethodSpec (MemberKind.Method, parent.PartialContainer.Definition, this, ReturnType, mb, ParameterInfo, method.ModFlags);
+                               Spec = new MethodSpec (MemberKind.Method, parent.PartialContainer.Definition, this, ReturnType, ParameterInfo, method.ModFlags);
                                Spec.IsAccessor = true;
 
-                               return mb;
+                               return method_data.MethodBuilder;
                        }
 
                        public override TypeSpec ReturnType {
index bfb82fb9f30f7e72fd259e526f5be2f0d1538288..f49a2980d7aa08a37ad608d4a1e958b934a35208 100644 (file)
@@ -550,6 +550,8 @@ namespace Mono.CSharp {
        //
        public abstract class ReportPrinter
        {
+               protected HashSet<ITypeDefinition> reported_missing_definitions;
+
                #region Properties
 
                public int ErrorsCount { get; protected set; }
@@ -605,6 +607,22 @@ namespace Mono.CSharp {
                        }
                }
 
+               //
+               // Tracks reported missing types. It needs to be session specific 
+               // because we can run in probing mode
+               //
+               public bool MissingTypeReported (ITypeDefinition typeDefinition)
+               {
+                       if (reported_missing_definitions == null)
+                               reported_missing_definitions = new HashSet<ITypeDefinition> ();
+
+                       if (reported_missing_definitions.Contains (typeDefinition))
+                               return true;
+
+                       reported_missing_definitions.Add (typeDefinition);
+                       return false;
+               }
+
                public void Reset ()
                {
                        // HACK: Temporary hack for broken repl flow
@@ -735,6 +753,11 @@ namespace Mono.CSharp {
                                error_msg |= !msg.IsWarning;
                        }
 
+                       if (reported_missing_definitions != null) {
+                               foreach (var missing in reported_missing_definitions)
+                                       dest.MissingTypeReported (missing);
+                       }
+
                        return error_msg;
                }
        }
index eec04bb687b4a7d633138b887e467c9ffe249044..0d27014d5a10cd5fbfbc1e4b21fea5fc0e8b7de2 100644 (file)
@@ -706,6 +706,7 @@ namespace Mono.CSharp {
                public StatementErrorExpression (Expression expr)
                {
                        this.expr = expr;
+                       this.loc = expr.StartLocation;
                }
 
                public Expression Expr {
@@ -714,6 +715,12 @@ namespace Mono.CSharp {
                        }
                }
 
+               public override bool Resolve (BlockContext bc)
+               {
+                       expr.Error_InvalidExpressionStatement (bc);
+                       return true;
+               }
+
                protected override void DoEmit (EmitContext ec)
                {
                        throw new NotSupportedException ();
@@ -903,9 +910,18 @@ namespace Mono.CSharp {
                                                        if (this is ContextualReturn)
                                                                return true;
 
-                                                       ec.Report.Error (1997, loc,
-                                                               "`{0}': A return keyword must not be followed by an expression when async method returns `Task'. Consider using `Task<T>' return type",
-                                                               ec.GetSignatureForError ());
+                                                       // Same error code as .NET but better error message
+                                                       if (async_block.DelegateType != null) {
+                                                               ec.Report.Error (1997, loc,
+                                                                       "`{0}': A return keyword must not be followed by an expression when async delegate returns `Task'. Consider using `Task<T>' return type",
+                                                                       async_block.DelegateType.GetSignatureForError ());
+                                                       } else {
+                                                               ec.Report.Error (1997, loc,
+                                                                       "`{0}': A return keyword must not be followed by an expression when async method returns `Task'. Consider using `Task<T>' return type",
+                                                                       ec.GetSignatureForError ());
+
+                                                       }
+
                                                        return false;
                                                }
 
@@ -1252,7 +1268,7 @@ namespace Mono.CSharp {
                                if (!Convert.ImplicitStandardConversionExists (c, type))
                                        ec.Report.Warning (469, 2, loc,
                                                "The `goto case' value is not implicitly convertible to type `{0}'",
-                                               TypeManager.CSharpName (type));
+                                               type.GetSignatureForError ());
 
                        }
 
@@ -1607,7 +1623,7 @@ namespace Mono.CSharp {
                        bool eval_global = bc.Module.Compiler.Settings.StatementMode && bc.CurrentBlock is ToplevelBlock;
                        if (eval_global) {
                                CreateEvaluatorVariable (bc, li);
-                       } else {
+                       } else if (type != InternalType.ErrorType) {
                                li.PrepareForFlowAnalysis (bc);
                        }
 
@@ -1621,7 +1637,7 @@ namespace Mono.CSharp {
                                        d.Variable.Type = li.Type;
                                        if (eval_global) {
                                                CreateEvaluatorVariable (bc, d.Variable);
-                                       } else {
+                                       } else if (type != InternalType.ErrorType) {
                                                d.Variable.PrepareForFlowAnalysis (bc);
                                        }
 
@@ -2059,7 +2075,8 @@ namespace Mono.CSharp {
                        HasAsyncModifier = 1 << 10,
                        Resolved = 1 << 11,
                        YieldBlock = 1 << 12,
-                       AwaitBlock = 1 << 13
+                       AwaitBlock = 1 << 13,
+                       Iterator = 1 << 14
                }
 
                public Block Parent;
@@ -2646,6 +2663,7 @@ namespace Mono.CSharp {
                        }
 
                        storey.Define ();
+                       storey.PrepareEmit ();
                        storey.Parent.PartialContainer.AddCompilerGeneratedClass (storey);
                }
 
@@ -2664,6 +2682,8 @@ namespace Mono.CSharp {
 
                public void RegisterIteratorYield ()
                {
+                       ParametersBlock.TopBlock.IsIterator = true;
+
                        var block = this;
                        while ((block.flags & Flags.YieldBlock) == 0) {
                                block.flags |= Flags.YieldBlock;
@@ -3112,7 +3132,7 @@ namespace Mono.CSharp {
                        return tlb;
                }
 
-               public ParametersBlock ConvertToAsyncTask (IMemberContext context, TypeDefinition host, ParametersCompiled parameters, TypeSpec returnType, Location loc)
+               public ParametersBlock ConvertToAsyncTask (IMemberContext context, TypeDefinition host, ParametersCompiled parameters, TypeSpec returnType, TypeSpec delegateType, Location loc)
                {
                        for (int i = 0; i < parameters.Count; i++) {
                                Parameter p = parameters[i];
@@ -3144,6 +3164,7 @@ namespace Mono.CSharp {
                        var block_type = host.Module.Compiler.BuiltinTypes.Void;
                        var initializer = new AsyncInitializer (this, host, block_type);
                        initializer.Type = block_type;
+                       initializer.DelegateType = delegateType;
 
                        var stateMachine = new AsyncTaskStorey (this, context, initializer, returnType);
 
@@ -3207,7 +3228,10 @@ namespace Mono.CSharp {
 
                public bool IsIterator {
                        get {
-                               return HasYield;
+                               return (flags & Flags.Iterator) != 0;
+                       }
+                       set {
+                               flags = value ? flags | Flags.Iterator : flags & ~Flags.Iterator;
                        }
                }
 
@@ -4110,10 +4134,13 @@ namespace Mono.CSharp {
                                new_expr = SwitchGoverningType (ec, unwrap);
                        }
 
-                       if (new_expr == null){
-                               ec.Report.Error (151, loc,
-                                       "A switch expression of type `{0}' cannot be converted to an integral type, bool, char, string, enum or nullable type",
-                                       TypeManager.CSharpName (Expr.Type));
+                       if (new_expr == null) {
+                               if (Expr.Type != InternalType.ErrorType) {
+                                       ec.Report.Error (151, loc,
+                                               "A switch expression of type `{0}' cannot be converted to an integral type, bool, char, string, enum or nullable type",
+                                               Expr.Type.GetSignatureForError ());
+                               }
+
                                return false;
                        }
 
@@ -4512,6 +4539,7 @@ namespace Mono.CSharp {
 
                        if (finally_host != null) {
                                finally_host.Define ();
+                               finally_host.PrepareEmit ();
                                finally_host.Emit ();
 
                                // Now it's safe to add, to close it properly and emit sequence points
index 4a674c4c46a2cac0270e6cec8fe901b23c485198..cefb322eeb540cbdc3d483c22ebd8ccc1a0b32b6 100644 (file)
@@ -984,15 +984,7 @@ namespace Mono.CSharp
 
        partial class TypeManager {
 
-       /// <summary>
-       ///   Returns the C# name of a type if possible, or the full type name otherwise
-       /// </summary>
-       static public string CSharpName (TypeSpec t)
-       {
-               return t.GetSignatureForError ();
-       }
-
-       static public string CSharpName (IList<TypeSpec> types)
+       static public string CSharpName(IList<TypeSpec> types)
        {
                if (types.Count == 0)
                        return string.Empty;
@@ -1002,7 +994,7 @@ namespace Mono.CSharp
                        if (i > 0)
                                sb.Append (",");
 
-                       sb.Append (CSharpName (types [i]));
+                       sb.Append (types [i].GetSignatureForError ());
                }
                return sb.ToString ();
        }
@@ -1090,7 +1082,7 @@ namespace Mono.CSharp
                rc.Compiler.Report.SymbolRelatedToPreviousError (t);
                rc.Compiler.Report.Error (208, loc,
                        "Cannot take the address of, get the size of, or declare a pointer to a managed type `{0}'",
-                       CSharpName (t));
+                       t.GetSignatureForError ());
 
                return false;   
        }
index e0d813030ca6d3c78c97eff169aa379f0d42f7e8..2657956a2f540821f0d0b6332483790ef391a7ef 100644 (file)
@@ -98,6 +98,20 @@ namespace Mono.CSharp
                //
                public virtual IList<TypeSpec> Interfaces {
                        get {
+                               if ((state & StateFlags.InterfacesImported) == 0) {
+                                       state |= StateFlags.InterfacesImported;
+
+                                       //
+                                       // Delay interfaces expansion to save memory and once all
+                                       // base types has been imported to avoid problems where
+                                       // interface references type before its base was imported
+                                       //
+                                       var imported = MemberDefinition as ImportedTypeDefinition;
+                                       if (imported != null && Kind != MemberKind.MissingType)
+                                               imported.DefineInterfaces (this);
+
+                               }
+
                                return ifaces;
                        }
                        set {
diff --git a/mcs/tests/gtest-581-lib.cs b/mcs/tests/gtest-581-lib.cs
new file mode 100644 (file)
index 0000000..bb1d7a3
--- /dev/null
@@ -0,0 +1,21 @@
+// Compiler options: -t:library
+
+public interface IA<T>
+{
+}
+
+public interface IB<T>
+{
+}
+
+public abstract class A : IA<A>, IB<A>
+{
+}
+
+public abstract class B : A, IA<B>, IB<B>, IB<C>
+{
+}
+
+public sealed class C : B, IA<C>
+{
+}
diff --git a/mcs/tests/gtest-581.cs b/mcs/tests/gtest-581.cs
new file mode 100644 (file)
index 0000000..5021792
--- /dev/null
@@ -0,0 +1,12 @@
+// Compiler options: -r:gtest-581-lib.dll
+
+class Program
+{
+       static void Main()
+       {
+               var f1 = (IA<A>) new C();
+               var f2 = (IA<B>) new C();
+               var f3 = (IB<A>) new C();
+               var f4 = (IB<C>) new C();
+       }
+}
\ No newline at end of file
diff --git a/mcs/tests/gtest-582-lib.cs b/mcs/tests/gtest-582-lib.cs
new file mode 100644 (file)
index 0000000..a5c58fa
--- /dev/null
@@ -0,0 +1,9 @@
+// Compiler options: -t:library
+
+public class C : I
+{
+}
+
+interface I
+{
+}
diff --git a/mcs/tests/gtest-582.cs b/mcs/tests/gtest-582.cs
new file mode 100644 (file)
index 0000000..5534de4
--- /dev/null
@@ -0,0 +1,27 @@
+// Compiler options: -r:gtest-582-lib.dll
+
+using System;
+using System.Reflection;
+
+public class G1 : GC<C>
+{
+}
+
+public class GC<T> where T : C
+{
+}
+
+class Program
+{
+       public static int Main()
+       {
+               var constraints = typeof (GC<>).GetGenericArguments ()[0].GetGenericParameterConstraints ();
+               if (constraints.Length != 1)
+                       return 1;
+               if (constraints [0] != typeof (C))
+                       return 2;
+
+               Console.WriteLine ("ok");
+               return 0;
+       }
+}
\ No newline at end of file
diff --git a/mcs/tests/gtest-partial-06.cs b/mcs/tests/gtest-partial-06.cs
new file mode 100644 (file)
index 0000000..3dd2dd3
--- /dev/null
@@ -0,0 +1,23 @@
+partial class Test
+{
+       static partial void Foo<T> ();
+
+       static partial void Baz<T> ();
+
+       static partial void Baz<U> ()
+       {
+       }
+
+       static partial void Bar<T> (T t) where T : class;
+
+       static partial void Bar<U> (U u) where U : class
+       {
+       }
+
+       public static void Main ()
+       {
+               Foo<long> ();
+               Baz<string> ();
+               Bar<Test> (null);
+       }
+}
\ No newline at end of file
index 60787efbfa9cf5b5ed5d3e6f48b57e39b315fdfe..e05993a5f03ba65b1c3f206b0c6b26caeed3bebc 100644 (file)
@@ -1,6 +1,8 @@
 #if false
 #line hahaha
 #error
+#define X
+#undef X
 #pragma warning disable 3005 // wrong directive on csc 1.x
        public class Foo
        {
@@ -16,6 +18,9 @@ public class Test
 {
        public static void Main ()
        {
+               string s = @"Test string
+                       #define
+                       ";
        }
 }
 
diff --git a/mcs/tests/test-async-46.cs b/mcs/tests/test-async-46.cs
new file mode 100644 (file)
index 0000000..5a0aed3
--- /dev/null
@@ -0,0 +1,16 @@
+using System;
+using System.Threading.Tasks;
+
+partial class X
+{
+       partial void Foo ();
+
+       async partial void Foo ()
+       {
+               await Task.FromResult (1);
+       }
+
+       public static void Main ()
+       {
+       }
+}
\ No newline at end of file
index 6d3f12c18465e91e3ac857f651372a7092170454..09f0c57ba8dd8117551385d6c8a6c9db84185e65 100644 (file)
@@ -5,15 +5,15 @@
   </files>
   <methods>
     <method token="0x6000001">
-      <sequencepoints>
-        <entry il="0x0" row="4" col="2" file_ref="1" hidden="false" />
-        <entry il="0x1" row="5" col="2" file_ref="1" hidden="false" />
-      </sequencepoints>
+      <sequencepoints />
       <locals />
       <scopes />
     </method>
     <method token="0x6000002">
-      <sequencepoints />
+      <sequencepoints>
+        <entry il="0x0" row="4" col="2" file_ref="1" hidden="false" />
+        <entry il="0x1" row="5" col="2" file_ref="1" hidden="false" />
+      </sequencepoints>
       <locals />
       <scopes />
     </method>
index 98ce07ad2ffb3c9745ff52129cb138ad52920c4e..b2fd331bf76dd8198ae9e3efd455e4ef2668f67d 100644 (file)
       <scopes />
     </method>
     <method token="0x6000007">
-      <sequencepoints>
-        <entry il="0x0" row="47" col="2" file_ref="1" hidden="false" />
-        <entry il="0x1" row="48" col="2" file_ref="1" hidden="false" />
-      </sequencepoints>
+      <sequencepoints />
       <locals />
       <scopes />
     </method>
     <method token="0x6000008">
-      <sequencepoints />
+      <sequencepoints>
+        <entry il="0x0" row="47" col="2" file_ref="1" hidden="false" />
+        <entry il="0x1" row="48" col="2" file_ref="1" hidden="false" />
+      </sequencepoints>
       <locals />
       <scopes />
     </method>
index 9cc8718343c79c8fee2075a6ab7ca452ea6eab0b..5c6423f005ce311fe8fa739ad772b214d534d9f2 100644 (file)
       <scopes />
     </method>
     <method token="0x6000007">
-      <sequencepoints>
-        <entry il="0x0" row="25" col="2" file_ref="1" hidden="false" />
-        <entry il="0x1" row="26" col="2" file_ref="1" hidden="false" />
-      </sequencepoints>
+      <sequencepoints />
       <locals />
       <scopes />
     </method>
     <method token="0x6000008">
-      <sequencepoints />
+      <sequencepoints>
+        <entry il="0x0" row="25" col="2" file_ref="1" hidden="false" />
+        <entry il="0x1" row="26" col="2" file_ref="1" hidden="false" />
+      </sequencepoints>
       <locals />
       <scopes />
     </method>
index 6216b888614ab0496c5dce0f94bd23444c6f07db..156d687a7db82e9ab3c33a6b9fcc5ee89779e0eb 100644 (file)
       <scopes />
     </method>
     <method token="0x6000004">
-      <sequencepoints>
-        <entry il="0x0" row="22" col="2" file_ref="2" hidden="false" />
-        <entry il="0x1" row="23" col="2" file_ref="2" hidden="false" />
-      </sequencepoints>
+      <sequencepoints />
       <locals />
       <scopes />
     </method>
     <method token="0x6000005">
-      <sequencepoints />
+      <sequencepoints>
+        <entry il="0x0" row="22" col="2" file_ref="2" hidden="false" />
+        <entry il="0x1" row="23" col="2" file_ref="2" hidden="false" />
+      </sequencepoints>
       <locals />
       <scopes />
     </method>
index 0114c98f11855dbc94234bde93caf5d466e4e437..78b7fcc3b6b8f4d48225aeda0f66715d07951c61 100644 (file)
@@ -6,6 +6,11 @@
   </files>
   <methods>
     <method token="0x6000001">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
+    <method token="0x6000002">
       <sequencepoints>
         <entry il="0x0" row="4" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="5" col="3" file_ref="1" hidden="false" />
@@ -18,7 +23,7 @@
       </locals>
       <scopes />
     </method>
-    <method token="0x6000002">
+    <method token="0x6000003">
       <sequencepoints>
         <entry il="0x0" row="12" col="2" file_ref="1" hidden="false" />
         <entry il="0x9" row="55" col="3" file_ref="1" hidden="false" />
@@ -31,7 +36,7 @@
       </locals>
       <scopes />
     </method>
-    <method token="0x6000003">
+    <method token="0x6000004">
       <sequencepoints>
         <entry il="0x0" row="59" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="60" col="3" file_ref="1" hidden="false" />
       </locals>
       <scopes />
     </method>
-    <method token="0x6000004">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
   </methods>
 </symbols>
\ No newline at end of file
index 9714fb693d75052d70df726075d3e98c3bc77c4f..925cb921f893b64548c58d7c491423d542ecf96c 100644 (file)
@@ -5,6 +5,11 @@
   </files>
   <methods>
     <method token="0x6000001">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
+    <method token="0x6000002">
       <sequencepoints>
         <entry il="0x0" row="6" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="7" col="2" file_ref="1" hidden="false" />
@@ -12,7 +17,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000002">
+    <method token="0x6000003">
       <sequencepoints>
         <entry il="0x0" row="10" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="12" col="3" file_ref="1" hidden="false" />
@@ -28,7 +33,7 @@
         <entry index="1" start="0xa" end="0xa" />
       </scopes>
     </method>
-    <method token="0x6000003">
+    <method token="0x6000004">
       <sequencepoints>
         <entry il="0x0" row="20" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="22" col="3" file_ref="1" hidden="false" />
@@ -47,7 +52,7 @@
         <entry index="1" start="0xa" end="0xc" />
       </scopes>
     </method>
-    <method token="0x6000004">
+    <method token="0x6000005">
       <sequencepoints>
         <entry il="0x0" row="31" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="33" col="3" file_ref="1" hidden="false" />
@@ -71,7 +76,7 @@
         <entry index="2" start="0x14" end="0x19" />
       </scopes>
     </method>
-    <method token="0x6000005">
+    <method token="0x6000006">
       <sequencepoints>
         <entry il="0x0" row="46" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="48" col="3" file_ref="1" hidden="false" />
@@ -86,7 +91,7 @@
         <entry index="1" start="0x9" end="0x9" />
       </scopes>
     </method>
-    <method token="0x6000006">
+    <method token="0x6000007">
       <sequencepoints>
         <entry il="0x0" row="56" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="58" col="3" file_ref="1" hidden="false" />
         <entry index="2" start="0x13" end="0x13" />
       </scopes>
     </method>
-    <method token="0x6000007">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
   </methods>
 </symbols>
\ No newline at end of file
index faccf800550c039fb658de3977c664a1346a30a2..15473e5f5821ddd55d5cb88adb0621524d6640d6 100644 (file)
@@ -5,6 +5,11 @@
   </files>
   <methods>
     <method token="0x6000001">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
+    <method token="0x6000002">
       <sequencepoints>
         <entry il="0x0" row="4" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="5" col="3" file_ref="1" hidden="false" />
@@ -13,7 +18,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000002">
+    <method token="0x6000003">
       <sequencepoints>
         <entry il="0x0" row="9" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="10" col="3" file_ref="1" hidden="false" />
@@ -22,7 +27,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000003">
+    <method token="0x6000004">
       <sequencepoints>
         <entry il="0x0" row="14" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="15" col="3" file_ref="1" hidden="false" />
         <entry index="1" start="0x3" end="0xa" />
       </scopes>
     </method>
-    <method token="0x6000004">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
   </methods>
 </symbols>
\ No newline at end of file
index c8083e9c1fd778b82e7ade18c0d734eea82e2f83..e7442c65a8bc9f73206a10df293e07174d40ea18 100644 (file)
@@ -5,25 +5,30 @@
   </files>
   <methods>
     <method token="0x6000001">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
+    <method token="0x6000002">
       <sequencepoints>
         <entry il="0x0" row="7" col="3" file_ref="1" hidden="false" />
       </sequencepoints>
       <locals />
       <scopes />
     </method>
-    <method token="0x6000002">
+    <method token="0x6000003">
       <sequencepoints />
       <locals />
       <scopes />
     </method>
-    <method token="0x6000003">
+    <method token="0x6000004">
       <sequencepoints>
         <entry il="0x0" row="16" col="3" file_ref="1" hidden="false" />
       </sequencepoints>
       <locals />
       <scopes />
     </method>
-    <method token="0x6000004">
+    <method token="0x6000005">
       <sequencepoints>
         <entry il="0x0" row="23" col="5" file_ref="1" hidden="false" />
       </sequencepoints>
         <entry index="1" start="0x0" end="0x2" />
       </scopes>
     </method>
-    <method token="0x6000005">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
   </methods>
 </symbols>
\ No newline at end of file
index 42d40c79d4b0a8500bc0e9518232feb507a8198f..5e2b972cdc0500fb77220bb8d25bcc1800663503 100644 (file)
       <scopes />
     </method>
     <method token="0x6000003">
-      <sequencepoints>
-        <entry il="0x0" row="10" col="2" file_ref="1" hidden="false" />
-        <entry il="0x1" row="12" col="2" file_ref="1" hidden="false" />
-      </sequencepoints>
+      <sequencepoints />
       <locals />
       <scopes />
     </method>
     <method token="0x6000004">
-      <sequencepoints />
+      <sequencepoints>
+        <entry il="0x0" row="10" col="2" file_ref="1" hidden="false" />
+        <entry il="0x1" row="12" col="2" file_ref="1" hidden="false" />
+      </sequencepoints>
       <locals />
       <scopes />
     </method>
index 925bc0314519928b24c1f8005eaf34ce06997c8d..4181816941a75c39217ec50e9ec9d9a3258856df 100644 (file)
@@ -5,15 +5,6 @@
   </files>
   <methods>
     <method token="0x6000001">
-      <sequencepoints>
-        <entry il="0x0" row="4" col="2" file_ref="1" hidden="false" />
-        <entry il="0x1" row="5" col="3" file_ref="1" hidden="false" />
-        <entry il="0x7" row="6" col="2" file_ref="1" hidden="false" />
-      </sequencepoints>
-      <locals />
-      <scopes />
-    </method>
-    <method token="0x6000002">
       <sequencepoints>
         <entry il="0x0" row="10" col="7" file_ref="1" hidden="false" />
         <entry il="0x1" row="11" col="4" file_ref="1" hidden="false" />
@@ -22,7 +13,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000003">
+    <method token="0x6000002">
       <sequencepoints>
         <entry il="0x0" row="14" col="7" file_ref="1" hidden="false" />
         <entry il="0x1" row="15" col="3" file_ref="1" hidden="false" />
       <locals />
       <scopes />
     </method>
-    <method token="0x6000004">
+    <method token="0x6000003">
       <sequencepoints>
         <entry il="0x0" row="20" col="3" file_ref="1" hidden="false" />
       </sequencepoints>
       <locals />
       <scopes />
     </method>
-    <method token="0x6000005">
+    <method token="0x6000004">
       <sequencepoints>
         <entry il="0x0" row="21" col="3" file_ref="1" hidden="false" />
       </sequencepoints>
       <locals />
       <scopes />
     </method>
-    <method token="0x6000006">
+    <method token="0x6000005">
       <sequencepoints />
       <locals />
       <scopes />
     </method>
+    <method token="0x6000006">
+      <sequencepoints>
+        <entry il="0x0" row="4" col="2" file_ref="1" hidden="false" />
+        <entry il="0x1" row="5" col="3" file_ref="1" hidden="false" />
+        <entry il="0x7" row="6" col="2" file_ref="1" hidden="false" />
+      </sequencepoints>
+      <locals />
+      <scopes />
+    </method>
   </methods>
 </symbols>
\ No newline at end of file
index 9a0d0e0d940f14e1cf7600f48d57a1089cdd8521..5d0b5d1f2160c244ce54c149abc20b19282bf9bc 100644 (file)
       <scopes />
     </method>
     <method token="0x6000003">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
+    <method token="0x6000004">
       <sequencepoints>
         <entry il="0x0" row="20" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="21" col="2" file_ref="1" hidden="false" />
@@ -30,7 +35,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000004">
+    <method token="0x6000005">
       <sequencepoints>
         <entry il="0x0" row="24" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="25" col="10" file_ref="1" hidden="false" />
@@ -46,7 +51,7 @@
         <entry index="1" start="0xa" end="0xa" />
       </scopes>
     </method>
-    <method token="0x6000005">
+    <method token="0x6000006">
       <sequencepoints>
         <entry il="0x0" row="31" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="32" col="10" file_ref="1" hidden="false" />
@@ -64,7 +69,7 @@
         <entry index="1" start="0x12" end="0x12" />
       </scopes>
     </method>
-    <method token="0x6000006">
+    <method token="0x6000007">
       <sequencepoints>
         <entry il="0x0" row="38" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="39" col="10" file_ref="1" hidden="false" />
@@ -80,7 +85,7 @@
         <entry index="1" start="0x11" end="0x11" />
       </scopes>
     </method>
-    <method token="0x6000007">
+    <method token="0x6000008">
       <sequencepoints>
         <entry il="0x0" row="45" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="46" col="10" file_ref="1" hidden="false" />
         <entry index="1" start="0x8" end="0x12" />
       </scopes>
     </method>
-    <method token="0x6000008">
+    <method token="0x6000009">
       <sequencepoints>
         <entry il="0x0" row="53" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="54" col="3" file_ref="1" hidden="false" />
         <entry index="0" start="0xe" end="0xe" />
       </scopes>
     </method>
-    <method token="0x6000009">
+    <method token="0x600000a">
       <sequencepoints>
         <entry il="0x0" row="60" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="61" col="3" file_ref="1" hidden="false" />
         <entry index="0" start="0xe" end="0x13" />
       </scopes>
     </method>
-    <method token="0x600000a">
+    <method token="0x600000b">
       <sequencepoints>
         <entry il="0x0" row="68" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="70" col="3" file_ref="1" hidden="false" />
         <entry index="1" start="0x28" end="0x2d" />
       </scopes>
     </method>
-    <method token="0x600000b">
+    <method token="0x600000c">
       <sequencepoints>
         <entry il="0x0" row="88" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="89" col="3" file_ref="1" hidden="false" />
         <entry index="1" start="0x2e" end="0x33" />
       </scopes>
     </method>
-    <method token="0x600000c">
+    <method token="0x600000d">
       <sequencepoints>
         <entry il="0x0" row="103" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="105" col="3" file_ref="1" hidden="false" />
         <entry index="1" start="0xb9" end="0xbe" />
       </scopes>
     </method>
-    <method token="0x600000d">
+    <method token="0x600000e">
       <sequencepoints>
         <entry il="0x0" row="127" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="129" col="3" file_ref="1" hidden="false" />
         <entry index="0" start="0x2c" end="0x3b" />
       </scopes>
     </method>
-    <method token="0x600000e">
+    <method token="0x600000f">
       <sequencepoints>
         <entry il="0x0" row="140" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="142" col="3" file_ref="1" hidden="false" />
         <entry index="1" start="0x6" end="0x8" />
       </scopes>
     </method>
-    <method token="0x600000f">
+    <method token="0x6000010">
       <sequencepoints>
         <entry il="0x0" row="153" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="155" col="3" file_ref="1" hidden="false" />
         <entry index="1" start="0xf" end="0xf" />
       </scopes>
     </method>
-    <method token="0x6000010">
+    <method token="0x6000011">
       <sequencepoints>
         <entry il="0x0" row="165" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="167" col="3" file_ref="1" hidden="false" />
         <entry index="0" start="0x2" end="0x4" />
       </scopes>
     </method>
-    <method token="0x6000011">
+    <method token="0x6000012">
       <sequencepoints>
         <entry il="0x0" row="174" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="175" col="3" file_ref="1" hidden="false" />
         <entry index="0" start="0x3" end="0xd" />
       </scopes>
     </method>
-    <method token="0x6000012">
+    <method token="0x6000013">
       <sequencepoints>
         <entry il="0x0" row="182" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="183" col="3" file_ref="1" hidden="false" />
         <entry index="1" start="0x19" end="0x19" />
       </scopes>
     </method>
-    <method token="0x6000013">
+    <method token="0x6000014">
       <sequencepoints>
         <entry il="0x0" row="192" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="193" col="3" file_ref="1" hidden="false" />
         <entry index="2" start="0x30" end="0x30" />
       </scopes>
     </method>
-    <method token="0x6000014">
+    <method token="0x6000015">
       <sequencepoints>
         <entry il="0x0" row="205" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="206" col="3" file_ref="1" hidden="false" />
         <entry index="1" start="0x10" end="0x10" />
       </scopes>
     </method>
-    <method token="0x6000015">
+    <method token="0x6000016">
       <sequencepoints>
         <entry il="0x0" row="215" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="216" col="8" file_ref="1" hidden="false" />
         <entry index="3" start="0x1b" end="0x1b" />
       </scopes>
     </method>
-    <method token="0x6000016">
+    <method token="0x6000017">
       <sequencepoints>
         <entry il="0x0" row="230" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="231" col="8" file_ref="1" hidden="false" />
         <entry index="1" start="0x9" end="0x9" />
       </scopes>
     </method>
-    <method token="0x6000017">
+    <method token="0x6000018">
       <sequencepoints>
         <entry il="0x0" row="237" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="238" col="3" file_ref="1" hidden="false" />
         <entry index="1" start="0x10" end="0x10" />
       </scopes>
     </method>
-    <method token="0x6000018">
+    <method token="0x6000019">
       <sequencepoints>
         <entry il="0x0" row="246" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="247" col="3" file_ref="1" hidden="false" />
         <entry index="1" start="0x17" end="0x17" />
       </scopes>
     </method>
-    <method token="0x6000019">
+    <method token="0x600001a">
       <sequencepoints>
         <entry il="0x0" row="256" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="257" col="3" file_ref="1" hidden="false" />
         <entry index="1" start="0x17" end="0x17" />
       </scopes>
     </method>
-    <method token="0x600001a">
+    <method token="0x600001b">
       <sequencepoints>
         <entry il="0x0" row="266" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="267" col="3" file_ref="1" hidden="false" />
         <entry index="1" start="0x30" end="0x30" />
       </scopes>
     </method>
-    <method token="0x600001b">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
   </methods>
 </symbols>
\ No newline at end of file
index 338ebab2372853b7ff26877d90ce9ec7b8b65b05..bc71011e0e5619b30eb6c5b1ec0f34dc7add039a 100644 (file)
@@ -5,15 +5,15 @@
   </files>
   <methods>
     <method token="0x6000001">
-      <sequencepoints>
-        <entry il="0x0" row="7" col="2" file_ref="1" hidden="false" />
-        <entry il="0x1" row="8" col="2" file_ref="1" hidden="false" />
-      </sequencepoints>
+      <sequencepoints />
       <locals />
       <scopes />
     </method>
     <method token="0x6000002">
-      <sequencepoints />
+      <sequencepoints>
+        <entry il="0x0" row="7" col="2" file_ref="1" hidden="false" />
+        <entry il="0x1" row="8" col="2" file_ref="1" hidden="false" />
+      </sequencepoints>
       <locals />
       <scopes />
     </method>
index 5125b202491c51b2c812f7b43be70070ac4e539d..46631e8e15c4f5124f50960f4691ca004d86524b 100644 (file)
@@ -5,15 +5,15 @@
   </files>
   <methods>
     <method token="0x6000001">
-      <sequencepoints>
-        <entry il="0x0" row="7" col="2" file_ref="1" hidden="false" />
-        <entry il="0x1" row="9" col="2" file_ref="1" hidden="false" />
-      </sequencepoints>
+      <sequencepoints />
       <locals />
       <scopes />
     </method>
     <method token="0x6000002">
-      <sequencepoints />
+      <sequencepoints>
+        <entry il="0x0" row="7" col="2" file_ref="1" hidden="false" />
+        <entry il="0x1" row="9" col="2" file_ref="1" hidden="false" />
+      </sequencepoints>
       <locals />
       <scopes />
     </method>
       <scopes />
     </method>
     <method token="0x6000008">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
-    <method token="0x6000009">
       <sequencepoints>
         <entry il="0x21" row="12" col="2" file_ref="1" hidden="false" />
         <entry il="0x22" row="13" col="3" file_ref="1" hidden="false" />
       <locals />
       <scopes />
     </method>
+    <method token="0x6000009">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
     <method token="0x600000a">
       <sequencepoints />
       <locals />
       <scopes />
     </method>
     <method token="0x6000010">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
-    <method token="0x6000011">
       <sequencepoints>
         <entry il="0x12" row="17" col="2" file_ref="1" hidden="false" />
         <entry il="0x13" row="18" col="3" file_ref="1" hidden="false" />
       <locals />
       <scopes />
     </method>
+    <method token="0x6000011">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
     <method token="0x6000012">
       <sequencepoints />
       <locals />
index e550e8ecffac9a0aa5620e70bd55ba4f7f6aba56..e9d76ccc3802a75944049c24de92d7fed31e966f 100644 (file)
@@ -5,6 +5,11 @@
   </files>
   <methods>
     <method token="0x6000001">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
+    <method token="0x6000002">
       <sequencepoints>
         <entry il="0x0" row="6" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="7" col="2" file_ref="1" hidden="false" />
@@ -12,7 +17,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000002">
+    <method token="0x6000003">
       <sequencepoints>
         <entry il="0x0" row="10" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="11" col="3" file_ref="1" hidden="false" />
@@ -23,7 +28,7 @@
       </locals>
       <scopes />
     </method>
-    <method token="0x6000003">
+    <method token="0x6000004">
       <sequencepoints>
         <entry il="0x0" row="17" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="18" col="3" file_ref="1" hidden="false" />
@@ -34,7 +39,7 @@
       </locals>
       <scopes />
     </method>
-    <method token="0x6000004">
+    <method token="0x6000005">
       <sequencepoints>
         <entry il="0x0" row="26" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="27" col="3" file_ref="1" hidden="false" />
@@ -45,7 +50,7 @@
       </locals>
       <scopes />
     </method>
-    <method token="0x6000005">
+    <method token="0x6000006">
       <sequencepoints>
         <entry il="0xd" row="34" col="2" file_ref="1" hidden="false" />
         <entry il="0xe" row="35" col="3" file_ref="1" hidden="false" />
       </locals>
       <scopes />
     </method>
-    <method token="0x6000006">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
     <method token="0x6000007">
       <sequencepoints>
         <entry il="0x0" row="13" col="3" file_ref="1" hidden="false" />
index 1e4c752197b5dcf6bfff8a108c935a96d7d69209..48404440a0df1051b5f348b13cb33e64e8223e6b 100644 (file)
@@ -5,6 +5,11 @@
   </files>
   <methods>
     <method token="0x6000001">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
+    <method token="0x6000002">
       <sequencepoints>
         <entry il="0x0" row="6" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="7" col="3" file_ref="1" hidden="false" />
@@ -16,7 +21,7 @@
         <entry index="1" start="0x15" end="0x1b" />
       </scopes>
     </method>
-    <method token="0x6000002">
+    <method token="0x6000003">
       <sequencepoints>
         <entry il="0x0" row="11" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="12" col="3" file_ref="1" hidden="false" />
       <locals />
       <scopes />
     </method>
-    <method token="0x6000003">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
   </methods>
 </symbols>
\ No newline at end of file
index f34f901bff4f45c5560781da7f4c62934ee7cf74..6c9c492e40a4b920591dd347e71f0a742ed521d3 100644 (file)
@@ -5,6 +5,11 @@
   </files>
   <methods>
     <method token="0x6000001">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
+    <method token="0x6000002">
       <sequencepoints>
         <entry il="0x0" row="10" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="11" col="2" file_ref="1" hidden="false" />
@@ -12,7 +17,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000002">
+    <method token="0x6000003">
       <sequencepoints>
         <entry il="0x0" row="14" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="15" col="3" file_ref="1" hidden="false" />
@@ -25,7 +30,7 @@
       </locals>
       <scopes />
     </method>
-    <method token="0x6000003">
+    <method token="0x6000004">
       <sequencepoints>
         <entry il="0x0" row="27" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="28" col="3" file_ref="1" hidden="false" />
       </locals>
       <scopes />
     </method>
-    <method token="0x6000004">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
   </methods>
 </symbols>
\ No newline at end of file
index e71763c6366a5a1271b9ca889a7a0883275fa8e0..cf51ed208c79b7d0f899c2edcac1385ce9f16cd7 100644 (file)
@@ -5,6 +5,11 @@
   </files>
   <methods>
     <method token="0x6000001">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
+    <method token="0x6000002">
       <sequencepoints>
         <entry il="0x0" row="7" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="8" col="2" file_ref="1" hidden="false" />
@@ -12,7 +17,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000002">
+    <method token="0x6000003">
       <sequencepoints>
         <entry il="0x2a" row="11" col="2" file_ref="1" hidden="false" />
         <entry il="0x2b" row="12" col="3" file_ref="1" hidden="false" />
@@ -24,7 +29,7 @@
       </locals>
       <scopes />
     </method>
-    <method token="0x6000003">
+    <method token="0x6000004">
       <sequencepoints>
         <entry il="0x0" row="20" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="21" col="3" file_ref="1" hidden="false" />
       </locals>
       <scopes />
     </method>
-    <method token="0x6000004">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
   </methods>
 </symbols>
\ No newline at end of file
index d1386aff5e20e5c7ffa4b87bba2624da6c0429fa..7961bca8a067fb15475cddf89c9f191b9978e31d 100644 (file)
       <scopes />
     </method>
     <method token="0x6000003">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
+    <method token="0x6000004">
       <sequencepoints>
         <entry il="0x0" row="8" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="9" col="2" file_ref="1" hidden="false" />
@@ -22,7 +27,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000004">
+    <method token="0x6000005">
       <sequencepoints>
         <entry il="0x0" row="12" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="13" col="3" file_ref="1" hidden="false" />
@@ -31,7 +36,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000005">
+    <method token="0x6000006">
       <sequencepoints>
         <entry il="0x0" row="17" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="18" col="3" file_ref="1" hidden="false" />
@@ -45,7 +50,7 @@
       </locals>
       <scopes />
     </method>
-    <method token="0x6000006">
+    <method token="0x6000007">
       <sequencepoints>
         <entry il="0x0" row="24" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="25" col="3" file_ref="1" hidden="false" />
@@ -57,7 +62,7 @@
       </locals>
       <scopes />
     </method>
-    <method token="0x6000007">
+    <method token="0x6000008">
       <sequencepoints>
         <entry il="0x0" row="30" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="31" col="3" file_ref="1" hidden="false" />
@@ -73,7 +78,7 @@
       </locals>
       <scopes />
     </method>
-    <method token="0x6000008">
+    <method token="0x6000009">
       <sequencepoints>
         <entry il="0x0" row="38" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="39" col="3" file_ref="1" hidden="false" />
       </locals>
       <scopes />
     </method>
-    <method token="0x6000009">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
     <method token="0x600000a">
       <sequencepoints>
         <entry il="0x0" row="40" col="38" file_ref="1" hidden="false" />
index 1d9a90dfbf848c5f67b0d182e0fdac61a44a12e7..9e557b6733fdffb4ad0f8e468057c9ace70a8047 100644 (file)
@@ -5,6 +5,11 @@
   </files>
   <methods>
     <method token="0x6000001">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
+    <method token="0x6000002">
       <sequencepoints>
         <entry il="0x0" row="7" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="8" col="2" file_ref="1" hidden="false" />
       <locals />
       <scopes />
     </method>
-    <method token="0x6000002">
+    <method token="0x6000003">
       <sequencepoints />
       <locals />
       <scopes />
     </method>
-    <method token="0x6000003">
+    <method token="0x6000004">
       <sequencepoints>
         <entry il="0x0" row="16" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="17" col="3" file_ref="1" hidden="false" />
       <locals />
       <scopes />
     </method>
-    <method token="0x6000004">
+    <method token="0x6000005">
       <sequencepoints />
       <locals />
       <scopes />
     </method>
-    <method token="0x6000005">
+    <method token="0x6000006">
       <sequencepoints>
         <entry il="0x0" row="29" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="30" col="3" file_ref="1" hidden="false" />
       <locals />
       <scopes />
     </method>
-    <method token="0x6000006">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
     <method token="0x6000007">
       <sequencepoints />
       <locals />
index ac2dc762dc3c3c1b39c9b2f37c3122064c64b478..fd90d797f79a8640322ff8327e71b260146c0e14 100644 (file)
       <scopes />
     </method>
     <method token="0x6000002">
-      <sequencepoints>
-        <entry il="0x0" row="17" col="2" file_ref="1" hidden="false" />
-        <entry il="0x1" row="18" col="2" file_ref="1" hidden="false" />
-      </sequencepoints>
+      <sequencepoints />
       <locals />
       <scopes />
     </method>
     <method token="0x6000003">
-      <sequencepoints />
+      <sequencepoints>
+        <entry il="0x0" row="17" col="2" file_ref="1" hidden="false" />
+        <entry il="0x1" row="18" col="2" file_ref="1" hidden="false" />
+      </sequencepoints>
       <locals />
       <scopes />
     </method>
index 3b9f00550830d4ec2287d50a18c92db5fb0e6298..a6af337137c7da45c8d30df948875f53239721e1 100644 (file)
       <scopes />
     </method>
     <method token="0x6000002">
-      <sequencepoints>
-        <entry il="0x0" row="22" col="2" file_ref="1" hidden="false" />
-        <entry il="0x1" row="23" col="2" file_ref="1" hidden="false" />
-      </sequencepoints>
+      <sequencepoints />
       <locals />
       <scopes />
     </method>
     <method token="0x6000003">
-      <sequencepoints />
+      <sequencepoints>
+        <entry il="0x0" row="22" col="2" file_ref="1" hidden="false" />
+        <entry il="0x1" row="23" col="2" file_ref="1" hidden="false" />
+      </sequencepoints>
       <locals />
       <scopes />
     </method>
       <scopes />
     </method>
     <method token="0x6000007">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
-    <method token="0x6000008">
       <sequencepoints>
         <entry il="0x27" row="7" col="2" file_ref="1" hidden="false" />
         <entry il="0x28" row="8" col="3" file_ref="1" hidden="false" />
         <entry index="0" start="0x42" end="0x5f" />
       </scopes>
     </method>
+    <method token="0x6000008">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
     <method token="0x6000009">
       <sequencepoints />
       <locals />
index 2b4a8e44532320e5b24cb224c5fa62ae4877524b..75fe231b6a569b382719c9a5fc2a72be14ca9d3f 100644 (file)
@@ -5,6 +5,11 @@
   </files>
   <methods>
     <method token="0x6000001">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
+    <method token="0x6000002">
       <sequencepoints>
         <entry il="0x0" row="7" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="8" col="3" file_ref="1" hidden="false" />
       <locals />
       <scopes />
     </method>
-    <method token="0x6000002">
+    <method token="0x6000003">
       <sequencepoints />
       <locals />
       <scopes />
     </method>
-    <method token="0x6000003">
+    <method token="0x6000004">
       <sequencepoints />
       <locals />
       <scopes />
     </method>
-    <method token="0x6000004">
+    <method token="0x6000005">
       <sequencepoints>
         <entry il="0x0" row="20" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="21" col="3" file_ref="1" hidden="false" />
@@ -31,7 +36,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000005">
+    <method token="0x6000006">
       <sequencepoints>
         <entry il="0x0" row="25" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="26" col="2" file_ref="1" hidden="false" />
       <locals />
       <scopes />
     </method>
-    <method token="0x6000006">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
     <method token="0x6000007">
       <sequencepoints />
       <locals />
       <scopes />
     </method>
     <method token="0x600000b">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
-    <method token="0x600000c">
       <sequencepoints>
         <entry il="0x21" row="15" col="2" file_ref="1" hidden="false" />
         <entry il="0x22" row="16" col="3" file_ref="1" hidden="false" />
       <locals />
       <scopes />
     </method>
+    <method token="0x600000c">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
     <method token="0x600000d">
       <sequencepoints />
       <locals />
index bb884fe89d1ab023d0be0002c954ef61f8601048..c1fba7edd1a4f91de7f0cd44349f810370f80b75 100644 (file)
@@ -5,6 +5,20 @@
   </files>
   <methods>
     <method token="0x6000001">
+      <sequencepoints>
+        <entry il="0x0" row="39" col="7" file_ref="1" hidden="false" />
+        <entry il="0x1" row="40" col="4" file_ref="1" hidden="false" />
+        <entry il="0x8" row="41" col="3" file_ref="1" hidden="false" />
+      </sequencepoints>
+      <locals />
+      <scopes />
+    </method>
+    <method token="0x6000002">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
+    <method token="0x6000003">
       <sequencepoints>
         <entry il="0x0" row="8" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="9" col="3" file_ref="1" hidden="false" />
@@ -14,7 +28,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000002">
+    <method token="0x6000004">
       <sequencepoints>
         <entry il="0x0" row="13" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="14" col="3" file_ref="1" hidden="false" />
@@ -24,7 +38,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000003">
+    <method token="0x6000005">
       <sequencepoints>
         <entry il="0x0" row="18" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="19" col="3" file_ref="1" hidden="false" />
@@ -34,7 +48,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000004">
+    <method token="0x6000006">
       <sequencepoints>
         <entry il="0x0" row="23" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="24" col="3" file_ref="1" hidden="false" />
@@ -47,7 +61,7 @@
       </locals>
       <scopes />
     </method>
-    <method token="0x6000005">
+    <method token="0x6000007">
       <sequencepoints>
         <entry il="0x0" row="29" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="30" col="3" file_ref="1" hidden="false" />
@@ -56,7 +70,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000006">
+    <method token="0x6000008">
       <sequencepoints>
         <entry il="0x0" row="34" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="35" col="3" file_ref="1" hidden="false" />
       <locals />
       <scopes />
     </method>
-    <method token="0x6000007">
-      <sequencepoints>
-        <entry il="0x0" row="39" col="7" file_ref="1" hidden="false" />
-        <entry il="0x1" row="40" col="4" file_ref="1" hidden="false" />
-        <entry il="0x8" row="41" col="3" file_ref="1" hidden="false" />
-      </sequencepoints>
-      <locals />
-      <scopes />
-    </method>
-    <method token="0x6000008">
+    <method token="0x6000009">
       <sequencepoints>
         <entry il="0x0" row="45" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="46" col="2" file_ref="1" hidden="false" />
       <locals />
       <scopes />
     </method>
-    <method token="0x6000009">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
     <method token="0x600000a">
       <sequencepoints>
         <entry il="0x0" row="24" col="27" file_ref="1" hidden="false" />
index b3de71ee9781e9ba57c1f506238b20be3ce13502..6a0622205d9f95b36a5e8672784ad22c9264032e 100644 (file)
@@ -5,6 +5,11 @@
   </files>
   <methods>
     <method token="0x6000001">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
+    <method token="0x6000002">
       <sequencepoints>
         <entry il="0x0" row="6" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="7" col="3" file_ref="1" hidden="false" />
@@ -17,7 +22,7 @@
       </locals>
       <scopes />
     </method>
-    <method token="0x6000002">
+    <method token="0x6000003">
       <sequencepoints>
         <entry il="0x0" row="11" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="12" col="8" file_ref="1" hidden="false" />
@@ -35,7 +40,7 @@
         <entry index="1" start="0x9" end="0x9" />
       </scopes>
     </method>
-    <method token="0x6000003">
+    <method token="0x6000004">
       <sequencepoints>
         <entry il="0x0" row="16" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="17" col="2" file_ref="1" hidden="false" />
       <locals />
       <scopes />
     </method>
-    <method token="0x6000004">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
   </methods>
 </symbols>
\ No newline at end of file
index 28c1c5327ea5c0f9a858384f22d55e31eeba8575..de5ef91f9f2094bee8714cea9566aa4b688c6f44 100644 (file)
@@ -5,15 +5,15 @@
   </files>
   <methods>
     <method token="0x6000001">
-      <sequencepoints>
-        <entry il="0x0" row="6" col="2" file_ref="1" hidden="false" />
-        <entry il="0x1" row="7" col="2" file_ref="1" hidden="false" />
-      </sequencepoints>
+      <sequencepoints />
       <locals />
       <scopes />
     </method>
     <method token="0x6000002">
-      <sequencepoints />
+      <sequencepoints>
+        <entry il="0x0" row="6" col="2" file_ref="1" hidden="false" />
+        <entry il="0x1" row="7" col="2" file_ref="1" hidden="false" />
+      </sequencepoints>
       <locals />
       <scopes />
     </method>
index b5f611c816ffb4ef08829d420c2882952bfbf34a..0d2412db8769092b7d76b3215ec11b010b8470b5 100644 (file)
   <test name="gtest-062.cs">\r
     <type name="X">\r
       <method name="IEnumerable`1 Test(Int32, Int64)" attrs="134">\r
-        <size>51</size>\r
+        <size>44</size>\r
       </method>\r
       <method name="Int32 Main()" attrs="150">\r
         <size>95</size>\r
   <test name="gtest-163.cs">\r
     <type name="Foo`1[T]">\r
       <method name="IEnumerator`1 getEnumerator(Int32)" attrs="134">\r
-        <size>29</size>\r
+        <size>22</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
         <size>2</size>\r
       </method>\r
       <method name="IEnumerable get_Item(Int32)" attrs="2177">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="Void set_Item(Int32, IEnumerable)" attrs="2177">\r
         <size>2</size>\r
   <test name="gtest-183.cs">\r
     <type name="test.Test`1[T]">\r
       <method name="IEnumerable`1 Lookup(T)" attrs="134">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
     </type>\r
     <type name="Test5.Test">\r
       <method name="IEnumerable`1 Replace[T](T)" attrs="150">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
     </type>\r
     <type name="Test6.Test">\r
       <method name="IEnumerable`1 Replace[T](T)" attrs="150">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
     </type>\r
     <type name="Test7.Test">\r
       <method name="IEnumerable`1 Replace[T](T[])" attrs="150">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
   <test name="gtest-193.cs">\r
     <type name="OrderedMultiDictionary`2[T,U]">\r
       <method name="IEnumerator`1 EnumerateKeys(RedBlackTree`1+RangeTester[System.Collections.Generic.KeyValuePair`2[T,U]])" attrs="129">\r
-        <size>36</size>\r
+        <size>29</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
     </type>\r
     <type name="OrderedMultiDictionary`2[T,U]">\r
       <method name="IEnumerator`1 EnumerateKeys(RedBlackTree`1+RangeTester[System.Collections.Generic.KeyValuePair`2[T,U]])" attrs="129">\r
-        <size>36</size>\r
+        <size>29</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
         <size>99</size>\r
       </method>\r
       <method name="IEnumerable`1 Map[Aa,Af,Rf,Rr](Fun`2[Af,Rf], IEnumerable`1)" attrs="150">\r
-        <size>51</size>\r
+        <size>37</size>\r
       </method>\r
       <method name="IEnumerable`1 FromTo(Int32, Int32)" attrs="150">\r
-        <size>51</size>\r
+        <size>37</size>\r
       </method>\r
       <method name="System.String &lt;Main&gt;m__0(Int32)" attrs="145">\r
         <size>22</size>\r
     </type>\r
     <type name="ConvertHelper">\r
       <method name="IEnumerator`1 Test[S,T](S)" attrs="150">\r
-        <size>29</size>\r
+        <size>22</size>\r
       </method>\r
       <method name="Void Main()" attrs="150">\r
         <size>2</size>\r
       </method>\r
     </type>\r
   </test>\r
+  <test name="gtest-581.cs">\r
+    <type name="Program">\r
+      <method name="Void Main()" attrs="145">\r
+        <size>26</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
+  <test name="gtest-582.cs">\r
+    <type name="G1">\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="GC`1[T]">\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="Program">\r
+      <method name="Int32 Main()" attrs="150">\r
+        <size>89</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
   <test name="gtest-anontype-01.cs">\r
     <type name="Test">\r
       <method name="Int32 Main()" attrs="150">\r
   <test name="gtest-anontype-13.cs">\r
     <type name="Test">\r
       <method name="IEnumerable`1 Select[T](System.Array, System.Func`2[System.Object,T])" attrs="150">\r
-        <size>51</size>\r
+        <size>37</size>\r
       </method>\r
       <method name="Void Main()" attrs="150">\r
         <size>182</size>\r
         <size>66</size>\r
       </method>\r
       <method name="IEnumerable`1 Test[T](Int32)" attrs="145">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
         <size>67</size>\r
       </method>\r
       <method name="IEnumerable`1 GetPersons[T](IEnumerable`1, Int32)" attrs="145">\r
-        <size>51</size>\r
+        <size>37</size>\r
       </method>\r
       <method name="Boolean Test[T](T, System.Linq.Expressions.Expression`1[System.Func`2[T,System.Boolean]])" attrs="145">\r
         <size>21</size>\r
         <size>30</size>\r
       </method>\r
       <method name="IEnumerable`1 Annotations(System.Type)" attrs="134">\r
-        <size>44</size>\r
+        <size>37</size>\r
       </method>\r
       <method name="Void Main()" attrs="150">\r
         <size>15</size>\r
         <size>32</size>\r
       </method>\r
       <method name="IEnumerable`1 TestRoutine[T](IEnumerable`1, Foo`1[T])" attrs="150">\r
-        <size>51</size>\r
+        <size>37</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
         <size>16</size>\r
       </method>\r
       <method name="IEnumerable`1 CreateUnfoldrIterator[TSource,TResult](TSource, System.Func`2[TSource,System.Nullable`1[System.Collections.Generic.KeyValuePair`2[TResult,TSource]]])" attrs="145">\r
-        <size>51</size>\r
+        <size>44</size>\r
       </method>\r
     </type>\r
     <type name="Mono.Rocks.Test">\r
   <test name="gtest-iter-09.cs">\r
     <type name="Test">\r
       <method name="IEnumerable`1 Create[T](T[,])" attrs="145">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="Int32 Main()" attrs="150">\r
         <size>89</size>\r
   <test name="gtest-iter-10.cs">\r
     <type name="Test">\r
       <method name="IEnumerable`1 FromTo(Int32, Int32)" attrs="145">\r
-        <size>51</size>\r
+        <size>44</size>\r
       </method>\r
       <method name="Int32 Main()" attrs="150">\r
         <size>185</size>\r
         <size>2</size>\r
       </method>\r
       <method name="IEnumerable`1 Merge[T](IEnumerator`1)" attrs="150">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
         <size>20</size>\r
       </method>\r
       <method name="IEnumerable`1 Filter(System.Func`2[T,System.Boolean])" attrs="134">\r
-        <size>44</size>\r
+        <size>37</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
   <test name="gtest-iter-15.cs">\r
     <type name="C`1[TFirst]">\r
       <method name="IEnumerable`1 GetEnumerable[V](IEnumerable`1)" attrs="131">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
     </type>\r
     <type name="Test.Derived">\r
       <method name="IEnumerable`1 GetStuff(Int32)" attrs="198">\r
-        <size>44</size>\r
+        <size>37</size>\r
       </method>\r
       <method name="IEnumerable`1 &lt;GetStuff&gt;__BaseCallProxy0(Int32)" attrs="129">\r
         <size>15</size>\r
     </type>\r
     <type name="Test.SpecialDerived">\r
       <method name="IEnumerable`1 GetStuff(Int32)" attrs="198">\r
-        <size>44</size>\r
+        <size>37</size>\r
       </method>\r
       <method name="Void Main()" attrs="150">\r
         <size>65</size>\r
   <test name="gtest-iter-19.cs">\r
     <type name="IEnumerableTransform">\r
       <method name="IEnumerable`1 Transform[TOut](IEnumerable`1, IEnumerableTransform+EmitterFunc`1[TOut])" attrs="150">\r
-        <size>51</size>\r
+        <size>37</size>\r
       </method>\r
       <method name="IEnumerableTransform+EmitterFunc`1[TOut] Emit[TOut](TOut)" attrs="150">\r
         <size>34</size>\r
   <test name="gtest-iter-28.cs">\r
     <type name="A">\r
       <method name="IEnumerable`1 Test(B)" attrs="134">\r
-        <size>44</size>\r
+        <size>37</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>18</size>\r
     </type>\r
     <type name="NameCollisionTest.Ex">\r
       <method name="IEnumerable`1 Foo[T,TR](IEnumerable`1, System.Func`2[T,TR])" attrs="150">\r
-        <size>51</size>\r
+        <size>37</size>\r
       </method>\r
     </type>\r
     <type name="NameCollisionTest.C">\r
   <test name="test-476.cs">\r
     <type name="Test">\r
       <method name="Void Main()" attrs="150">\r
-        <size>2</size>\r
+        <size>8</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
     </type>\r
     <type name="Foo">\r
       <method name="IEnumerable`1 Test(Foo)" attrs="134">\r
-        <size>49</size>\r
+        <size>42</size>\r
       </method>\r
       <method name="Void Hello(Int32)" attrs="134">\r
         <size>20</size>\r
     </type>\r
     <type name="X">\r
       <method name="IEnumerable`1 Test(Int32)" attrs="150">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="Void Main()" attrs="150">\r
         <size>62</size>\r
         <size>38</size>\r
       </method>\r
       <method name="IEnumerable`1 op_Addition(Test, Test)" attrs="2198">\r
-        <size>51</size>\r
+        <size>37</size>\r
       </method>\r
       <method name="IEnumerable`1 get_Foo()" attrs="2182">\r
         <size>23</size>\r
   <test name="test-anon-110.cs">\r
     <type name="X">\r
       <method name="IEnumerable`1 Test[T](T, T)" attrs="134">\r
-        <size>51</size>\r
+        <size>44</size>\r
       </method>\r
       <method name="Int32 Main()" attrs="150">\r
         <size>110</size>\r
   <test name="test-anon-50.cs">\r
     <type name="Test">\r
       <method name="IEnumerable Foo(Int32)" attrs="134">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
   <test name="test-anon-52.cs">\r
     <type name="X">\r
       <method name="IEnumerator GetIt(System.Int32[])" attrs="145">\r
-        <size>29</size>\r
+        <size>22</size>\r
       </method>\r
       <method name="Int32 Main()" attrs="150">\r
         <size>40</size>\r
   <test name="test-anon-63.cs">\r
     <type name="X">\r
       <method name="IEnumerator GetIt(System.Int32[])" attrs="145">\r
-        <size>29</size>\r
+        <size>22</size>\r
       </method>\r
       <method name="Int32 Main()" attrs="150">\r
         <size>40</size>\r
   <test name="test-async-30.cs">\r
     <type name="C">\r
       <method name="IEnumerable`1 Test(System.String)" attrs="129">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="IEnumerable`1 Test2()" attrs="129">\r
         <size>23</size>\r
       </method>\r
     </type>\r
   </test>\r
+  <test name="test-async-46.cs">\r
+    <type name="X">\r
+      <method name="Void Foo()" attrs="129">\r
+        <size>27</size>\r
+      </method>\r
+      <method name="Void Main()" attrs="150">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="X+&lt;Foo&gt;c__async0">\r
+      <method name="Void MoveNext()" attrs="486">\r
+        <size>158</size>\r
+      </method>\r
+      <method name="Void SetStateMachine(IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
   <test name="test-cls-00.cs">\r
     <type name="CLSCLass_6">\r
       <method name="Void add_Disposed(Delegate)" attrs="2182">\r
   <test name="test-iter-03.cs">\r
     <type name="X">\r
       <method name="IEnumerable GetIt(System.Int32[])" attrs="145">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="IEnumerable GetMulti(System.Int32[,])" attrs="145">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="Int32 Main()" attrs="150">\r
         <size>275</size>\r
   <test name="test-iter-04.cs">\r
     <type name="X">\r
       <method name="IEnumerable GetRange(Int32, Int32)" attrs="145">\r
-        <size>51</size>\r
+        <size>37</size>\r
       </method>\r
       <method name="Void Main()" attrs="150">\r
         <size>104</size>\r
   <test name="test-iter-06.cs">\r
     <type name="S">\r
       <method name="IEnumerable Get(Int32)" attrs="134">\r
-        <size>49</size>\r
+        <size>42</size>\r
       </method>\r
       <method name="IEnumerable GetS(Int32)" attrs="150">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
     </type>\r
     <type name="X">\r
       <method name="IEnumerable Get(Int32)" attrs="129">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="IEnumerable GetS(Int32)" attrs="145">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="Int32 Main()" attrs="150">\r
         <size>449</size>\r
   <test name="test-iter-07.cs">\r
     <type name="Test">\r
       <method name="IEnumerable Foo(Int32)" attrs="134">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       <method name="Void Reset()" attrs="486">\r
         <size>6</size>\r
       </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
       <method name="Void &lt;&gt;__Finally0()" attrs="129">\r
         <size>13</size>\r
       </method>\r
       <method name="Void &lt;&gt;__Finally2()" attrs="129">\r
         <size>13</size>\r
       </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="test-iter-08.cs">\r
     </type>\r
     <type name="X">\r
       <method name="IEnumerable Test(Int32, Int32)" attrs="150">\r
-        <size>51</size>\r
+        <size>37</size>\r
       </method>\r
       <method name="Int32 Main()" attrs="150">\r
         <size>210</size>\r
         <size>2</size>\r
       </method>\r
       <method name="IEnumerable get_Item(Int32)" attrs="2177">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="Void set_Item(Int32, IEnumerable)" attrs="2177">\r
         <size>2</size>\r
   <test name="test-iter-18.cs">\r
     <type name="test">\r
       <method name="IEnumerable testen(Int32)" attrs="134">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
   <test name="test-iter-21.cs">\r
     <type name="X">\r
       <method name="IEnumerable GetIt(System.Int32[])" attrs="145">\r
-        <size>37</size>\r
+        <size>30</size>\r
       </method>\r
       <method name="Int32 Main()" attrs="150">\r
         <size>138</size>\r
         <size>26</size>\r
       </method>\r
       <method name="Boolean MoveNext()" attrs="486">\r
-        <size>75</size>\r
+        <size>60</size>\r
       </method>\r
       <method name="Void Dispose()" attrs="486">\r
         <size>1</size>\r
   <test name="test-iter-26.cs">\r
     <type name="C">\r
       <method name="IEnumerable Test(Boolean, Int32)" attrs="150">\r
-        <size>51</size>\r
+        <size>37</size>\r
       </method>\r
       <method name="Void Main()" attrs="150">\r
         <size>10</size>\r
         <size>26</size>\r
       </method>\r
       <method name="Boolean MoveNext()" attrs="486">\r
-        <size>37</size>\r
+        <size>32</size>\r
       </method>\r
       <method name="Void Dispose()" attrs="486">\r
         <size>1</size>\r
         <size>26</size>\r
       </method>\r
       <method name="Boolean MoveNext()" attrs="486">\r
-        <size>37</size>\r
+        <size>32</size>\r
       </method>\r
       <method name="Void Dispose()" attrs="486">\r
         <size>1</size>\r
         <size>26</size>\r
       </method>\r
       <method name="Boolean MoveNext()" attrs="486">\r
-        <size>37</size>\r
+        <size>32</size>\r
       </method>\r
       <method name="Void Dispose()" attrs="486">\r
         <size>1</size>\r
index ac97a4ac9facb92580124e74d0a9eef8d05a3fd1..c4387a2fad308c0f70a48ea82d70456cfecc5e53 100644 (file)
@@ -8,8 +8,7 @@ OTHER_RES = template.c template_z.c template_main.c
 
 RESOURCE_FILES = $(OTHER_RES)
 
-LOCAL_MCS_FLAGS=-r:Mono.Posix.dll -r:ICSharpCode.SharpZipLib.dll \
-               $(OTHER_RES:%=-resource:%)
+LOCAL_MCS_FLAGS= $(OTHER_RES:%=-resource:%)
 
 EXTRA_DISTFILES = $(RESOURCE_FILES)
 
index a1d2148e5f90f2048162cb45a59ac5815a73a2e5..77cc7123e2162dc426940c0319eddf436131a6ff 100644 (file)
 using System;
 using System.Diagnostics;
 using System.Xml;
-using System.Collections;
+using System.Collections.Generic;
 using System.Reflection;
 using System.IO;
+using System.IO.Compression;
 using System.Runtime.InteropServices;
 using System.Text;
-using Mono.Unix;
-using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
+
+
+#if NET_4_5
+using System.Threading.Tasks;
+#endif
 
 class MakeBundle {
        static string output = "a.out";
        static string object_out = null;
-       static ArrayList link_paths = new ArrayList ();
+       static List<string> link_paths = new List<string> ();
        static bool autodeps = false;
        static bool keeptemp = false;
        static bool compile_only = false;
@@ -36,7 +40,7 @@ class MakeBundle {
        
        static int Main (string [] args)
        {
-               ArrayList sources = new ArrayList ();
+               List<string> sources = new List<string> ();
                int top = args.Length;
                link_paths.Add (".");
 
@@ -158,8 +162,8 @@ class MakeBundle {
                        Environment.Exit (1);
                }
 
-               ArrayList assemblies = LoadAssemblies (sources);
-               ArrayList files = new ArrayList ();
+               List<Assembly> assemblies = LoadAssemblies (sources);
+               List<string> files = new List<string> ();
                foreach (Assembly a in assemblies)
                        QueueAssembly (files, a.CodeBase);
                        
@@ -239,7 +243,7 @@ class MakeBundle {
                ts.WriteLine ();
        }
        
-       static void GenerateBundles (ArrayList files)
+       static void GenerateBundles (List<string> files)
        {
                string temp_s = "temp.s"; // Path.GetTempFileName ();
                string temp_c = "temp.c";
@@ -251,8 +255,8 @@ class MakeBundle {
                        temp_o = object_out;
                
                try {
-                       ArrayList c_bundle_names = new ArrayList ();
-                       ArrayList config_names = new ArrayList ();
+                       List<string> c_bundle_names = new List<string> ();
+                       List<string[]> config_names = new List<string[]> ();
                        byte [] buffer = new byte [8192];
 
                        using (StreamWriter ts = new StreamWriter (File.Create (temp_s))) {
@@ -270,66 +274,78 @@ class MakeBundle {
                                tc.WriteLine ("} CompressedAssembly;\n");
                        }
 
-                       foreach (string url in files){
+                       object monitor = new object ();
+
+                       // Do the file reading and compression in parallel
+                       Action<string> body = delegate (string url) {
                                string fname = new Uri (url).LocalPath;
                                string aname = Path.GetFileName (fname);
                                string encoded = aname.Replace ("-", "_").Replace (".", "_");
 
                                if (prog == null)
                                        prog = aname;
-                               
-                               Console.WriteLine ("   embedding: " + fname);
-                               
+                                                               
                                Stream stream = File.OpenRead (fname);
 
-                               // Compression can be parallelized
                                long real_size = stream.Length;
                                int n;
                                if (compress) {
                                        MemoryStream ms = new MemoryStream ();
-                                       DeflaterOutputStream deflate = new DeflaterOutputStream (ms);
+                                       GZipStream deflate = new GZipStream (ms, CompressionMode.Compress, leaveOpen:true);
                                        while ((n = stream.Read (buffer, 0, buffer.Length)) != 0){
                                                deflate.Write (buffer, 0, n);
                                        }
                                        stream.Close ();
-                                       deflate.Finish ();
+                                       deflate.Close ();
                                        byte [] bytes = ms.GetBuffer ();
                                        stream = new MemoryStream (bytes, 0, (int) ms.Length, false, false);
                                }
 
-                               WriteSymbol (ts, "assembly_data_" + encoded, stream.Length);
+                               // The non-parallel part
+                               lock (monitor) {
+                                       Console.WriteLine ("   embedding: " + fname);
+
+                                       WriteSymbol (ts, "assembly_data_" + encoded, stream.Length);
                        
-                               WriteBuffer (ts, stream, buffer);
+                                       WriteBuffer (ts, stream, buffer);
+
+                                       if (compress) {
+                                               tc.WriteLine ("extern const unsigned char assembly_data_{0} [];", encoded);
+                                               tc.WriteLine ("static CompressedAssembly assembly_bundle_{0} = {{{{\"{1}\"," +
+                                                                         " assembly_data_{0}, {2}}}, {3}}};",
+                                                                         encoded, aname, real_size, stream.Length);
+                                               double ratio = ((double) stream.Length * 100) / real_size;
+                                               Console.WriteLine ("   compression ratio: {0:.00}%", ratio);
+                                       } else {
+                                               tc.WriteLine ("extern const unsigned char assembly_data_{0} [];", encoded);
+                                               tc.WriteLine ("static const MonoBundledAssembly assembly_bundle_{0} = {{\"{1}\", assembly_data_{0}, {2}}};",
+                                                                         encoded, aname, real_size);
+                                       }
+                                       stream.Close ();
 
-                               if (compress) {
-                                       tc.WriteLine ("extern const unsigned char assembly_data_{0} [];", encoded);
-                                       tc.WriteLine ("static CompressedAssembly assembly_bundle_{0} = {{{{\"{1}\"," +
-                                                       " assembly_data_{0}, {2}}}, {3}}};",
-                                                     encoded, aname, real_size, stream.Length);
-                                       double ratio = ((double) stream.Length * 100) / real_size;
-                                       Console.WriteLine ("   compression ratio: {0:.00}%", ratio);
-                               } else {
-                                       tc.WriteLine ("extern const unsigned char assembly_data_{0} [];", encoded);
-                                       tc.WriteLine ("static const MonoBundledAssembly assembly_bundle_{0} = {{\"{1}\", assembly_data_{0}, {2}}};",
-                                                     encoded, aname, real_size);
+                                       c_bundle_names.Add ("assembly_bundle_" + encoded);
+
+                                       try {
+                                               FileStream cf = File.OpenRead (fname + ".config");
+                                               Console.WriteLine (" config from: " + fname + ".config");
+                                               tc.WriteLine ("extern const unsigned char assembly_config_{0} [];", encoded);
+                                               WriteSymbol (ts, "assembly_config_" + encoded, cf.Length);
+                                               WriteBuffer (ts, cf, buffer);
+                                               ts.WriteLine ();
+                                               config_names.Add (new string[] {aname, encoded});
+                                       } catch (FileNotFoundException) {
+                                               /* we ignore if the config file doesn't exist */
+                                       }
                                }
-                               stream.Close ();
+                       };
 
-                               c_bundle_names.Add ("assembly_bundle_" + encoded);
+#if NET_4_5
+                       Parallel.ForEach (files, body);
+#else
+                       foreach (var url in files)
+                               body (url);
+#endif
 
-                               try {
-                                       FileStream cf = File.OpenRead (fname + ".config");
-                                       Console.WriteLine (" config from: " + fname + ".config");
-                                       tc.WriteLine ("extern const unsigned char assembly_config_{0} [];", encoded);
-                                       WriteSymbol (ts, "assembly_config_" + encoded, cf.Length);
-                                       WriteBuffer (ts, cf, buffer);
-                                       ts.WriteLine ();
-                                       config_names.Add (new string[] {aname, encoded});
-                               } catch (FileNotFoundException) {
-                                       /* we ignore if the config file doesn't exist */
-                               }
-
-                       }
                        if (config_file != null){
                                FileStream conf;
                                try {
@@ -466,9 +482,9 @@ class MakeBundle {
                }
        }
        
-       static ArrayList LoadAssemblies (ArrayList sources)
+       static List<Assembly> LoadAssemblies (List<string> sources)
        {
-               ArrayList assemblies = new ArrayList ();
+               List<Assembly> assemblies = new List<Assembly> ();
                bool error = false;
                
                foreach (string name in sources){
@@ -488,7 +504,7 @@ class MakeBundle {
                return assemblies;
        }
        
-       static void QueueAssembly (ArrayList files, string codebase)
+       static void QueueAssembly (List<string> files, string codebase)
        {
                if (files.Contains (codebase))
                        return;
@@ -588,10 +604,10 @@ class MakeBundle {
                        return;
                }
 
-               IntPtr buf = UnixMarshal.AllocHeap(8192);
+               IntPtr buf = Marshal.AllocHGlobal (8192);
                if (uname (buf) != 0){
                        Console.WriteLine ("Warning: Unable to detect OS");
-                       UnixMarshal.FreeHeap(buf);
+                       Marshal.FreeHGlobal (buf);
                        return;
                }
                string os = Marshal.PtrToStringAnsi (buf);
@@ -599,7 +615,7 @@ class MakeBundle {
                if (os == "Darwin")
                        style = "osx";
                
-               UnixMarshal.FreeHeap(buf);
+               Marshal.FreeHGlobal (buf);
        }
 
        static bool IsUnix {
index 7aac318bb88f91034569adbdc887bd2d593aa457..7987f82c7e893a540266476c92d57e71839c0192 100644 (file)
@@ -13,7 +13,8 @@ my_inflate (const Byte *compr, uLong compr_len, Byte *uncompr, uLong uncompr_len
        memset (&stream, 0, sizeof (z_stream));
        stream.next_in = (Byte *) compr;
        stream.avail_in = (uInt) compr_len;
-       err = inflateInit (&stream);
+       /* To decompress gzip format: http://stackoverflow.com/a/1838702/83444 */
+       err = inflateInit2 (&stream, 16+MAX_WBITS);
        if (err != Z_OK)
                return 1;
 
index f9c73859a9924bd046f1577b47e9d978561afd0d..df6d4b31c6331e6c8a11ac91d40802747c1dee77 100644 (file)
@@ -43,8 +43,15 @@ namespace Mono.Tuner {
                        return (attribute.AttributeType.Name == "LinkerSafeAttribute");
                }
 
+               const ModuleAttributes Supported = ModuleAttributes.ILOnly | ModuleAttributes.Required32Bit | 
+                       ModuleAttributes.Preferred32Bit | ModuleAttributes.StrongNameSigned;
+
                protected virtual bool IsSkipped (AssemblyDefinition assembly)
                {
+                       // Cecil can't save back mixed-mode assemblies - so we can't link them
+                       if ((assembly.MainModule.Attributes & ~Supported) != 0)
+                               return true;
+
                        if (assembly.HasCustomAttributes) {
                                foreach (var ca in assembly.CustomAttributes) {
                                        if (IsPreservedAttribute (ca))
index 6c528bdfb9adfd4e826d13a56f1ed550405f850a..7ccd5002f1c9e26df35c1fea6d4870ad331bb8c0 100644 (file)
@@ -903,6 +903,7 @@ Mono implementation of ASP.NET, Remoting and Web Services.
 %_prefix/lib/mono/4.5/System.Web.ApplicationServices.dll
 %_prefix/lib/mono/4.5/System.Web.Http.dll
 %_prefix/lib/mono/4.5/System.Web.Http.SelfHost.dll
+%_prefix/lib/mono/4.5/System.Web.Http.WebHost.dll
 %_prefix/lib/mono/4.5/System.Web.Routing.dll
 %_prefix/lib/mono/4.5/System.Web.Razor.dll
 %_prefix/lib/mono/4.5/System.Web.Services.dll
@@ -929,6 +930,7 @@ Mono implementation of ASP.NET, Remoting and Web Services.
 %_prefix/lib/mono/gac/System.Web.ApplicationServices
 %_prefix/lib/mono/gac/System.Web.Http
 %_prefix/lib/mono/gac/System.Web.Http.SelfHost
+%_prefix/lib/mono/gac/System.Web.Http.WebHost
 %_prefix/lib/mono/gac/System.Web.Routing
 %_prefix/lib/mono/gac/System.Web.Razor
 %_prefix/lib/mono/gac/System.Web.Services
index fd2c528c862a53d37690e797fdb51c96c2b6e235..ced466eaf1407c509f05e76eca52389a7a38d575 100644 (file)
@@ -814,6 +814,14 @@ typedef union {
                x86_imm_emit32 ((inst), (imm)); \
        } while (0)
 
+#define x86_test_mem_imm8(inst,mem,imm)        \
+       do {    \
+               x86_codegen_pre(&(inst), 7); \
+               *(inst)++ = (unsigned char)0xf6;        \
+               x86_mem_emit ((inst), 0, (mem));        \
+               x86_imm_emit8 ((inst), (imm));  \
+       } while (0)
+
 #define x86_test_mem_imm(inst,mem,imm) \
        do {    \
                x86_codegen_pre(&(inst), 10); \
index 327218e168622d90b3a8d686033d49c66aa6b4cf..72e528d2e31ca5491ccac8f9a1112c6ace3591af 100644 (file)
@@ -29,6 +29,11 @@ extern int isinf (double);
 
 #endif
 
+#if defined(__native_client__) && defined(__GLIBC__)
+volatile int __nacl_thread_suspension_needed = 0;
+void __nacl_suspend_thread_if_needed() {}
+#endif
+
 void
 dump_table_assembly (MonoImage *m)
 {
index c0d6e0ddf76f145297ea360505cee60aa3555aac..81df30727e317d948dafdbc15272fc04a04b28b9 100644 (file)
@@ -11,7 +11,6 @@ libwapiincludedir = $(includedir)/mono-$(API_VER)/mono/io-layer
 
 OTHER_H = \
        access.h        \
-       atomic.h        \
        collection.h    \
        context.h       \
        critical-sections.h     \
@@ -41,8 +40,6 @@ OTHER_H = \
 
 OTHER_SRC = \
        access.h                \
-       atomic.c                \
-       atomic.h                \
        collection.c            \
        collection.h            \
        context.c               \
diff --git a/mono/io-layer/atomic.c b/mono/io-layer/atomic.c
deleted file mode 100644 (file)
index 07732fd..0000000
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * atomic.c:  Workarounds for atomic operations for platforms that dont have
- *           really atomic asm functions in atomic.h
- *
- * Author:
- *     Dick Porter (dick@ximian.com)
- *
- * (C) 2002 Ximian, Inc.
- */
-
-#include <config.h>
-#include <glib.h>
-#include <pthread.h>
-
-#include "mono/io-layer/wapi.h"
-
-#ifndef WAPI_ATOMIC_ASM
-
-static pthread_mutex_t spin = PTHREAD_MUTEX_INITIALIZER;
-static mono_once_t spin_once=MONO_ONCE_INIT;
-
-static void spin_init(void)
-{
-       g_warning("Using non-atomic functions!  Expect race conditions when using process-shared handles!");
-}
-
-gint32 InterlockedCompareExchange(volatile gint32 *dest, gint32 exch,
-                                 gint32 comp)
-{
-       gint32 old;
-       int ret;
-       
-       mono_once(&spin_once, spin_init);
-       
-       pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
-                             (void *)&spin);
-       ret = pthread_mutex_lock(&spin);
-       g_assert (ret == 0);
-       
-       old= *dest;
-       if(old==comp) {
-               *dest=exch;
-       }
-       
-       ret = pthread_mutex_unlock(&spin);
-       g_assert (ret == 0);
-       
-       pthread_cleanup_pop (0);
-
-       return(old);
-}
-
-gpointer InterlockedCompareExchangePointer(volatile gpointer *dest,
-                                          gpointer exch, gpointer comp)
-{
-       gpointer old;
-       int ret;
-       
-       mono_once(&spin_once, spin_init);
-       
-       pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
-                             (void *)&spin);
-       ret = pthread_mutex_lock(&spin);
-       g_assert (ret == 0);
-       
-       old= *dest;
-       if(old==comp) {
-               *dest=exch;
-       }
-       
-       ret = pthread_mutex_unlock(&spin);
-       g_assert (ret == 0);
-       
-       pthread_cleanup_pop (0);
-
-       return(old);
-}
-
-gint32 InterlockedIncrement(volatile gint32 *dest)
-{
-       gint32 ret;
-       int thr_ret;
-       
-       mono_once(&spin_once, spin_init);
-       
-       pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
-                             (void *)&spin);
-       thr_ret = pthread_mutex_lock(&spin);
-       g_assert (thr_ret == 0);
-
-       (*dest)++;
-       ret= *dest;
-       
-       thr_ret = pthread_mutex_unlock(&spin);
-       g_assert (thr_ret == 0);
-       
-       pthread_cleanup_pop (0);
-       
-       return(ret);
-}
-
-gint32 InterlockedDecrement(volatile gint32 *dest)
-{
-       gint32 ret;
-       int thr_ret;
-       
-       mono_once(&spin_once, spin_init);
-       
-       pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
-                             (void *)&spin);
-       thr_ret = pthread_mutex_lock(&spin);
-       g_assert (thr_ret == 0);
-       
-       (*dest)--;
-       ret= *dest;
-       
-       thr_ret = pthread_mutex_unlock(&spin);
-       g_assert (thr_ret == 0);
-       
-       pthread_cleanup_pop (0);
-       
-       return(ret);
-}
-
-gint32 InterlockedExchange(volatile gint32 *dest, gint32 exch)
-{
-       gint32 ret;
-       int thr_ret;
-       
-       mono_once(&spin_once, spin_init);
-       
-       pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
-                             (void *)&spin);
-       thr_ret = pthread_mutex_lock(&spin);
-       g_assert (thr_ret == 0);
-
-       ret=*dest;
-       *dest=exch;
-       
-       thr_ret = pthread_mutex_unlock(&spin);
-       g_assert (thr_ret == 0);
-       
-       pthread_cleanup_pop (0);
-       
-       return(ret);
-}
-
-gpointer InterlockedExchangePointer(volatile gpointer *dest, gpointer exch)
-{
-       gpointer ret;
-       int thr_ret;
-       
-       mono_once(&spin_once, spin_init);
-       
-       pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
-                             (void *)&spin);
-       thr_ret = pthread_mutex_lock(&spin);
-       g_assert (thr_ret == 0);
-       
-       ret=*dest;
-       *dest=exch;
-       
-       thr_ret = pthread_mutex_unlock(&spin);
-       g_assert (thr_ret == 0);
-       
-       pthread_cleanup_pop (0);
-       
-       return(ret);
-}
-
-gint32 InterlockedExchangeAdd(volatile gint32 *dest, gint32 add)
-{
-       gint32 ret;
-       int thr_ret;
-       
-       mono_once(&spin_once, spin_init);
-       
-       pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
-                             (void *)&spin);
-       thr_ret = pthread_mutex_lock(&spin);
-       g_assert (thr_ret == 0);
-
-       ret= *dest;
-       *dest+=add;
-       
-       thr_ret = pthread_mutex_unlock(&spin);
-       g_assert (thr_ret == 0);
-
-       pthread_cleanup_pop (0);
-
-       return(ret);
-}
-
-#endif
diff --git a/mono/io-layer/atomic.h b/mono/io-layer/atomic.h
deleted file mode 100644 (file)
index 6d2f767..0000000
+++ /dev/null
@@ -1,1222 +0,0 @@
-/*
- * atomic.h:  Atomic operations
- *
- * Author:
- *     Dick Porter (dick@ximian.com)
- *
- * (C) 2002 Ximian, Inc.
- * Copyright 2012 Xamarin Inc
- */
-
-#ifndef _WAPI_ATOMIC_H_
-#define _WAPI_ATOMIC_H_
-
-#if defined(__NetBSD__)
-#include <sys/param.h>
-
-#if __NetBSD_Version__ > 499004000
-#include <sys/atomic.h>
-#define HAVE_ATOMIC_OPS
-#endif
-
-#endif
-
-#include <glib.h>
-
-#include "mono/io-layer/wapi.h"
-
-#if defined(__NetBSD__) && defined(HAVE_ATOMIC_OPS)
-
-#define WAPI_ATOMIC_ASM
-static inline gint32 InterlockedCompareExchange(volatile gint32 *dest,
-       gint32 exch, gint32 comp)
-{
-       return atomic_cas_32((uint32_t*)dest, comp, exch);
-}
-
-static inline gpointer InterlockedCompareExchangePointer(volatile gpointer *dest, gpointer exch, gpointer comp)
-{
-       return atomic_cas_ptr(dest, comp, exch);
-}
-
-static inline gint32 InterlockedIncrement(volatile gint32 *val)
-{
-       return atomic_inc_32_nv((uint32_t*)val);
-}
-
-static inline gint32 InterlockedDecrement(volatile gint32 *val)
-{
-       return atomic_dec_32_nv((uint32_t*)val);
-}
-
-static inline gint32 InterlockedExchange(volatile gint32 *val, gint32 new_val)
-{
-       return atomic_swap_32((uint32_t*)val, new_val);
-}
-
-static inline gpointer InterlockedExchangePointer(volatile gpointer *val,
-               gpointer new_val)
-{
-       return atomic_swap_ptr(val, new_val);
-}
-
-static inline gint32 InterlockedExchangeAdd(volatile gint32 *val, gint32 add)
-{
-       return atomic_add_32_nv((uint32_t*)val, add) - add;
-}
-
-#elif defined(__i386__) || defined(__x86_64__)
-#define WAPI_ATOMIC_ASM
-
-/*
- * NB: The *Pointer() functions here assume that
- * sizeof(pointer)==sizeof(gint32)
- *
- * NB2: These asm functions assume 486+ (some of the opcodes dont
- * exist on 386).  If this becomes an issue, we can get configure to
- * fall back to the non-atomic C versions of these calls.
- */
-
-static inline gint32 InterlockedCompareExchange(volatile gint32 *dest,
-                                               gint32 exch, gint32 comp)
-{
-       gint32 old;
-
-       __asm__ __volatile__ ("lock; cmpxchgl %2, %0"
-                             : "=m" (*dest), "=a" (old)
-                             : "r" (exch), "m" (*dest), "a" (comp));   
-       return(old);
-}
-
-static inline gpointer InterlockedCompareExchangePointer(volatile gpointer *dest, gpointer exch, gpointer comp)
-{
-       gpointer old;
-
-       __asm__ __volatile__ ("lock; "
-#if defined(__x86_64__)  && !defined(__native_client__)
-                             "cmpxchgq"
-#else
-                             "cmpxchgl"
-#endif
-                             " %2, %0"
-                             : "=m" (*dest), "=a" (old)
-                             : "r" (exch), "m" (*dest), "a" (comp));   
-
-       return(old);
-}
-
-static inline gint32 InterlockedIncrement(volatile gint32 *val)
-{
-       gint32 tmp;
-       
-       __asm__ __volatile__ ("lock; xaddl %0, %1"
-                             : "=r" (tmp), "=m" (*val)
-                             : "0" (1), "m" (*val));
-
-       return(tmp+1);
-}
-
-static inline gint32 InterlockedDecrement(volatile gint32 *val)
-{
-       gint32 tmp;
-       
-       __asm__ __volatile__ ("lock; xaddl %0, %1"
-                             : "=r" (tmp), "=m" (*val)
-                             : "0" (-1), "m" (*val));
-
-       return(tmp-1);
-}
-
-/*
- * See
- * http://msdn.microsoft.com/library/en-us/dnmag00/html/win320700.asp?frame=true
- * for the reasons for using cmpxchg and a loop here.
- *
- * That url is no longer valid, but it's still in the google cache at the
- * moment: http://www.google.com/search?q=cache:http://msdn.microsoft.com/library/en-us/dnmag00/html/win320700.asp?frame=true
- *
- * For the time being, http://msdn.microsoft.com/msdnmag/issues/0700/Win32/
- * might work.  Bet it will change soon enough though.
- */
-static inline gint32 InterlockedExchange(volatile gint32 *val, gint32 new_val)
-{
-       gint32 ret;
-       
-       __asm__ __volatile__ ("1:; lock; cmpxchgl %2, %0; jne 1b"
-                             : "=m" (*val), "=a" (ret)
-                             : "r" (new_val), "m" (*val), "a" (*val));
-
-       return(ret);
-}
-
-static inline gpointer InterlockedExchangePointer(volatile gpointer *val,
-                                                 gpointer new_val)
-{
-       gpointer ret;
-       
-       __asm__ __volatile__ ("1:; lock; "
-#if defined(__x86_64__)  && !defined(__native_client__)
-                             "cmpxchgq"
-#else
-                             "cmpxchgl"
-#endif
-                             " %2, %0; jne 1b"
-                             : "=m" (*val), "=a" (ret)
-                             : "r" (new_val), "m" (*val), "a" (*val));
-
-       return(ret);
-}
-
-static inline gint32 InterlockedExchangeAdd(volatile gint32 *val, gint32 add)
-{
-       gint32 ret;
-       
-       __asm__ __volatile__ ("lock; xaddl %0, %1"
-                             : "=r" (ret), "=m" (*val)
-                             : "0" (add), "m" (*val));
-       
-       return(ret);
-}
-
-#elif (defined(sparc) || defined (__sparc__)) && defined(__GNUC__)
-#define WAPI_ATOMIC_ASM
-
-G_GNUC_UNUSED 
-static inline gint32 InterlockedCompareExchange(volatile gint32 *_dest, gint32 _exch, gint32 _comp)
-{
-       register volatile gint32 *dest asm("g1") = _dest;
-       register gint32 comp asm("o4") = _comp;
-       register gint32 exch asm("o5") = _exch;
-
-       __asm__ __volatile__(
-               /* cas [%%g1], %%o4, %%o5 */
-               ".word 0xdbe0500c"
-               : "=r" (exch)
-               : "0" (exch), "r" (dest), "r" (comp)
-               : "memory");
-
-       return exch;
-}
-
-G_GNUC_UNUSED 
-static inline gpointer InterlockedCompareExchangePointer(volatile gpointer *_dest, gpointer _exch, gpointer _comp)
-{
-       register volatile gpointer *dest asm("g1") = _dest;
-       register gpointer comp asm("o4") = _comp;
-       register gpointer exch asm("o5") = _exch;
-
-       __asm__ __volatile__(
-#ifdef SPARCV9
-               /* casx [%%g1], %%o4, %%o5 */
-               ".word 0xdbf0500c"
-#else
-               /* cas [%%g1], %%o4, %%o5 */
-               ".word 0xdbe0500c"
-#endif
-               : "=r" (exch)
-               : "0" (exch), "r" (dest), "r" (comp)
-               : "memory");
-
-       return exch;
-}
-
-G_GNUC_UNUSED 
-static inline gint32 InterlockedIncrement(volatile gint32 *_dest)
-{
-       register volatile gint32 *dest asm("g1") = _dest;
-       register gint32 tmp asm("o4");
-       register gint32 ret asm("o5");
-
-       __asm__ __volatile__(
-               "1:     ld      [%%g1], %%o4\n\t"
-               "       add     %%o4, 1, %%o5\n\t"
-               /*      cas     [%%g1], %%o4, %%o5 */
-               "       .word   0xdbe0500c\n\t"
-               "       cmp     %%o4, %%o5\n\t"
-               "       bne     1b\n\t"
-               "        add    %%o5, 1, %%o5"
-               : "=&r" (tmp), "=&r" (ret)
-               : "r" (dest)
-               : "memory", "cc");
-
-        return ret;
-}
-
-G_GNUC_UNUSED 
-static inline gint32 InterlockedDecrement(volatile gint32 *_dest)
-{
-       register volatile gint32 *dest asm("g1") = _dest;
-       register gint32 tmp asm("o4");
-       register gint32 ret asm("o5");
-
-       __asm__ __volatile__(
-               "1:     ld      [%%g1], %%o4\n\t"
-               "       sub     %%o4, 1, %%o5\n\t"
-               /*      cas     [%%g1], %%o4, %%o5 */
-               "       .word   0xdbe0500c\n\t"
-               "       cmp     %%o4, %%o5\n\t"
-               "       bne     1b\n\t"
-               "        sub    %%o5, 1, %%o5"
-               : "=&r" (tmp), "=&r" (ret)
-               : "r" (dest)
-               : "memory", "cc");
-
-        return ret;
-}
-
-G_GNUC_UNUSED
-static inline gint32 InterlockedExchange(volatile gint32 *_dest, gint32 exch)
-{
-       register volatile gint32 *dest asm("g1") = _dest;
-       register gint32 tmp asm("o4");
-       register gint32 ret asm("o5");
-
-       __asm__ __volatile__(
-               "1:     ld      [%%g1], %%o4\n\t"
-               "       mov     %3, %%o5\n\t"
-               /*      cas     [%%g1], %%o4, %%o5 */
-               "       .word   0xdbe0500c\n\t"
-               "       cmp     %%o4, %%o5\n\t"
-               "       bne     1b\n\t"
-               "        nop"
-               : "=&r" (tmp), "=&r" (ret)
-               : "r" (dest), "r" (exch)
-               : "memory", "cc");
-
-        return ret;
-}
-
-G_GNUC_UNUSED
-static inline gpointer InterlockedExchangePointer(volatile gpointer *_dest, gpointer exch)
-{
-       register volatile gpointer *dest asm("g1") = _dest;
-       register gpointer tmp asm("o4");
-       register gpointer ret asm("o5");
-
-       __asm__ __volatile__(
-#ifdef SPARCV9
-               "1:     ldx     [%%g1], %%o4\n\t"
-#else
-               "1:     ld      [%%g1], %%o4\n\t"
-#endif
-               "       mov     %3, %%o5\n\t"
-#ifdef SPARCV9
-               /*      casx    [%%g1], %%o4, %%o5 */
-               "       .word   0xdbf0500c\n\t"
-#else
-               /*      cas     [%%g1], %%o4, %%o5 */
-               "       .word   0xdbe0500c\n\t"
-#endif
-               "       cmp     %%o4, %%o5\n\t"
-               "       bne     1b\n\t"
-               "        nop"
-               : "=&r" (tmp), "=&r" (ret)
-               : "r" (dest), "r" (exch)
-               : "memory", "cc");
-
-        return ret;
-}
-
-G_GNUC_UNUSED
-static inline gint32 InterlockedExchangeAdd(volatile gint32 *_dest, gint32 add)
-{
-       register volatile gint32 *dest asm("g1") = _dest;
-       register gint32 tmp asm("o4");
-       register gint32 ret asm("o5");
-
-       __asm__ __volatile__(
-               "1:     ld      [%%g1], %%o4\n\t"
-               "       add     %%o4, %3, %%o5\n\t"
-               /*      cas     [%%g1], %%o4, %%o5 */
-               "       .word   0xdbe0500c\n\t"
-               "       cmp     %%o4, %%o5\n\t"
-               "       bne     1b\n\t"
-               "        add    %%o5, %3, %%o5"
-               : "=&r" (tmp), "=&r" (ret)
-               : "r" (dest), "r" (add)
-               : "memory", "cc");
-
-        return ret;
-}
-
-#elif __s390__
-
-#define WAPI_ATOMIC_ASM
-
-static inline gint32 
-InterlockedCompareExchange(volatile gint32 *dest,
-                          gint32 exch, gint32 comp)
-{
-       gint32 old;
-
-       __asm__ __volatile__ ("\tLA\t1,%0\n"
-                             "\tLR\t%1,%3\n"
-                             "\tCS\t%1,%2,0(1)\n"
-                             : "+m" (*dest), "=&r" (old)
-                             : "r" (exch), "r" (comp)
-                             : "1", "cc");     
-       return(old);
-}
-
-#ifndef __s390x__
-static inline gpointer
-InterlockedCompareExchangePointer(volatile gpointer *dest,
-                          gpointer exch, gpointer comp)
-{
-       gpointer old;
-
-       __asm__ __volatile__ ("\tLA\t1,%0\n"
-                             "\tLR\t%1,%3\n"
-                             "\tCS\t%1,%2,0(1)\n"
-                             : "+m" (*dest), "=&r" (old)
-                             : "r" (exch), "r" (comp)
-                             : "1", "cc");     
-       return(old);
-}
-# else
-static inline gpointer 
-InterlockedCompareExchangePointer(volatile gpointer *dest, 
-                                 gpointer exch, 
-                                 gpointer comp)
-{
-       gpointer old;
-
-       __asm__ __volatile__ ("\tLA\t1,%0\n"
-                             "\tLGR\t%1,%3\n"
-                             "\tCSG\t%1,%2,0(1)\n"
-                             : "+m" (*dest), "=&r" (old)
-                             : "r" (exch), "r" (comp)
-                             : "1", "cc");
-
-       return(old);
-}
-# endif
-
-# ifndef __s390x__
-static inline gint32 
-InterlockedIncrement(volatile gint32 *val)
-{
-       gint32 tmp;
-       
-       __asm__ __volatile__ ("\tLA\t2,%1\n"
-                             "0:\tL\t%0,%1\n"
-                             "\tLR\t1,%0\n"
-                             "\tAHI\t1,1\n"
-                             "\tCS\t%0,1,0(2)\n"
-                             "\tJNZ\t0b\n"
-                             "\tLR\t%0,1"
-                             : "=r" (tmp), "+m" (*val)
-                             : : "1", "2", "cc");
-
-       return(tmp);
-}
-# else
-static inline gint32 
-InterlockedIncrement(volatile gint32 *val)
-{
-       gint32 tmp;
-       
-       __asm__ __volatile__ ("\tLA\t2,%1\n"
-                             "0:\tLGF\t%0,%1\n"
-                             "\tLGFR\t1,%0\n"
-                             "\tAGHI\t1,1\n"
-                             "\tCS\t%0,1,0(2)\n"
-                             "\tJNZ\t0b\n"
-                             "\tLGFR\t%0,1"
-                             : "=r" (tmp), "+m" (*val)
-                             : : "1", "2", "cc");
-
-       return(tmp);
-}
-# endif
-
-# ifndef __s390x__
-static inline gint32 
-InterlockedDecrement(volatile gint32 *val)
-{
-       gint32 tmp;
-       
-       __asm__ __volatile__ ("\tLA\t2,%1\n"
-                             "0:\tL\t%0,%1\n"
-                             "\tLR\t1,%0\n"
-                             "\tAHI\t1,-1\n"
-                             "\tCS\t%0,1,0(2)\n"
-                             "\tJNZ\t0b\n"
-                             "\tLR\t%0,1"
-                             : "=r" (tmp), "+m" (*val)
-                             : : "1", "2", "cc");
-
-       return(tmp);
-}
-# else
-static inline gint32 
-InterlockedDecrement(volatile gint32 *val)
-{
-       gint32 tmp;
-       
-       __asm__ __volatile__ ("\tLA\t2,%1\n"
-                             "0:\tLGF\t%0,%1\n"
-                             "\tLGFR\t1,%0\n"
-                             "\tAGHI\t1,-1\n"
-                             "\tCS\t%0,1,0(2)\n"
-                             "\tJNZ\t0b\n"
-                             "\tLGFR\t%0,1"
-                             : "=r" (tmp), "+m" (*val)
-                             : : "1", "2", "cc");
-
-       return(tmp);
-}
-# endif
-
-static inline gint32 
-InterlockedExchange(volatile gint32 *val, gint32 new_val)
-{
-       gint32 ret;
-       
-       __asm__ __volatile__ ("\tLA\t1,%0\n"
-                             "0:\tL\t%1,%0\n"
-                             "\tCS\t%1,%2,0(1)\n"
-                             "\tJNZ\t0b"
-                             : "+m" (*val), "=&r" (ret)
-                             : "r" (new_val)
-                             : "1", "cc");
-
-       return(ret);
-}
-
-# ifndef __s390x__
-static inline gpointer 
-InterlockedExchangePointer(volatile gpointer *val, gpointer new_val)
-{
-       gpointer ret;
-       
-       __asm__ __volatile__ ("\tLA\t1,%0\n"
-                             "0:\tL\t%1,%0\n"
-                             "\tCS\t%1,%2,0(1)\n"
-                             "\tJNZ\t0b"
-                             : "+m" (*val), "=&r" (ret)
-                             : "r" (new_val)
-                             : "1", "cc");
-
-       return(ret);
-}
-# else
-static inline gpointer
-InterlockedExchangePointer(volatile gpointer *val, gpointer new_val)
-{
-       gpointer ret;
-       
-       __asm__ __volatile__ ("\tLA\t1,%0\n"
-                             "0:\tLG\t%1,%0\n"
-                             "\tCSG\t%1,%2,0(1)\n"
-                             "\tJNZ\t0b"
-                             : "+m" (*val), "=&r" (ret)
-                             : "r" (new_val)
-                             : "1", "cc");
-
-       return(ret);
-}
-# endif
-
-# ifndef __s390x__
-static inline gint32 
-InterlockedExchangeAdd(volatile gint32 *val, gint32 add)
-{
-       gint32 ret;
-
-       __asm__ __volatile__ ("\tLA\t2,%1\n"
-                             "0:\tL\t%0,%1\n"
-                             "\tLR\t1,%0\n"
-                             "\tAR\t1,%2\n"
-                             "\tCS\t%0,1,0(2)\n"
-                             "\tJNZ\t0b"
-                             : "=&r" (ret), "+m" (*val)
-                             : "r" (add) 
-                             : "1", "2", "cc");
-       
-       return(ret);
-}
-# else
-static inline gint32 
-InterlockedExchangeAdd(volatile gint32 *val, gint32 add)
-{
-       gint32 ret;
-
-       __asm__ __volatile__ ("\tLA\t2,%1\n"
-                             "0:\tLGF\t%0,%1\n"
-                             "\tLGFR\t1,%0\n"
-                             "\tAGR\t1,%2\n"
-                             "\tCS\t%0,1,0(2)\n"
-                             "\tJNZ\t0b"
-                             : "=&r" (ret), "+m" (*val)
-                             : "r" (add) 
-                             : "1", "2", "cc");
-       
-       return(ret);
-}
-# endif
-
-#elif defined(__mono_ppc__)
-#define WAPI_ATOMIC_ASM
-
-#ifdef G_COMPILER_CODEWARRIOR
-static inline gint32 InterlockedIncrement(volatile register gint32 *val)
-{
-       gint32 result = 0, tmp;
-       register gint32 result = 0;
-       register gint32 tmp;
-
-       asm
-       {
-               @1:
-                       lwarx   tmp, 0, val
-                       addi    result, tmp, 1
-                       stwcx.  result, 0, val
-                       bne-    @1
-       }
-       return result;
-}
-
-static inline gint32 InterlockedDecrement(register volatile gint32 *val)
-{
-       register gint32 result = 0;
-       register gint32 tmp;
-
-       asm
-       {
-               @1:
-                       lwarx   tmp, 0, val
-                       addi    result, tmp, -1
-                       stwcx.  result, 0, val
-                       bne-    @1
-       }
-
-       return result;
-}
-#define InterlockedCompareExchangePointer(dest,exch,comp) (void*)InterlockedCompareExchange((volatile gint32 *)(dest), (gint32)(exch), (gint32)(comp))
-
-static inline gint32 InterlockedCompareExchange(volatile register gint32 *dest, register gint32 exch, register gint32 comp)
-{
-       register gint32 tmp = 0;
-
-       asm
-       {
-               @1:
-                       lwarx   tmp, 0, dest
-                       cmpw    tmp, comp
-                       bne-    @2
-                       stwcx.  exch, 0, dest
-                       bne-    @1
-               @2:
-       }
-
-       return tmp;
-}
-static inline gint32 InterlockedExchange(register volatile gint32 *dest, register gint32 exch)
-{
-       register gint32 tmp = 0;
-
-       asm
-       {
-               @1:
-                       lwarx   tmp, 0, dest
-                       stwcx.  exch, 0, dest
-                       bne-    @1
-       }
-
-       return tmp;
-}
-#define InterlockedExchangePointer(dest,exch) (void*)InterlockedExchange((volatile gint32 *)(dest), (gint32)(exch))
-#else
-
-#if defined(__mono_ppc64__) && !defined(__mono_ilp32__)
-#define LDREGX "ldarx"
-#define STREGCXD "stdcx."
-#define CMPREG "cmpd"
-#else
-#define LDREGX "lwarx"
-#define STREGCXD "stwcx."
-#define CMPREG "cmpw"
-#endif
-
-static inline gint32 InterlockedIncrement(volatile gint32 *val)
-{
-       gint32 result = 0, tmp;
-
-       __asm__ __volatile__ ("\n1:\n\t"
-                             "lwarx  %0, 0, %2\n\t"
-                             "addi   %1, %0, 1\n\t"
-                              "stwcx. %1, 0, %2\n\t"
-                             "bne-   1b"
-                             : "=&b" (result), "=&b" (tmp): "r" (val): "cc", "memory");
-       return result + 1;
-}
-
-static inline gint32 InterlockedDecrement(volatile gint32 *val)
-{
-       gint32 result = 0, tmp;
-
-       __asm__ __volatile__ ("\n1:\n\t"
-                             "lwarx  %0, 0, %2\n\t"
-                             "addi   %1, %0, -1\n\t"
-                              "stwcx. %1, 0, %2\n\t"
-                             "bne-   1b"
-                             : "=&b" (result), "=&b" (tmp): "r" (val): "cc", "memory");
-       return result - 1;
-}
-
-static inline gpointer InterlockedCompareExchangePointer (volatile gpointer *dest,
-                                               gpointer exch, gpointer comp)
-{
-       gpointer tmp = NULL;
-
-       __asm__ __volatile__ ("\n1:\n\t"
-                            LDREGX " %0, 0, %1\n\t"
-                            CMPREG " %0, %2\n\t" 
-                            "bne-    2f\n\t"
-                            STREGCXD " %3, 0, %1\n\t"
-                            "bne-    1b\n"
-                            "2:"
-                            : "=&r" (tmp)
-                            : "b" (dest), "r" (comp), "r" (exch): "cc", "memory");
-       return(tmp);
-}
-
-static inline gint32 InterlockedCompareExchange(volatile gint32 *dest,
-                                               gint32 exch, gint32 comp) {
-       gint32 tmp = 0;
-
-       __asm__ __volatile__ ("\n1:\n\t"
-                            "lwarx   %0, 0, %1\n\t"
-                            "cmpw    %0, %2\n\t" 
-                            "bne-    2f\n\t"
-                            "stwcx.  %3, 0, %1\n\t"
-                            "bne-    1b\n"
-                            "2:"
-                            : "=&r" (tmp)
-                            : "b" (dest), "r" (comp), "r" (exch): "cc", "memory");
-       return(tmp);
-}
-
-static inline gint32 InterlockedExchange(volatile gint32 *dest, gint32 exch)
-{
-       gint32 tmp = 0;
-
-       __asm__ __volatile__ ("\n1:\n\t"
-                             "lwarx  %0, 0, %2\n\t"
-                             "stwcx. %3, 0, %2\n\t"
-                             "bne    1b"
-                             : "=r" (tmp) : "0" (tmp), "b" (dest), "r" (exch): "cc", "memory");
-       return(tmp);
-}
-
-static inline gpointer InterlockedExchangePointer (volatile gpointer *dest, gpointer exch)
-{
-       gpointer tmp = NULL;
-
-       __asm__ __volatile__ ("\n1:\n\t"
-                             LDREGX " %0, 0, %2\n\t"
-                             STREGCXD " %3, 0, %2\n\t"
-                             "bne    1b"
-                             : "=r" (tmp) : "0" (tmp), "b" (dest), "r" (exch): "cc", "memory");
-       return(tmp);
-}
-
-static inline gint32 InterlockedExchangeAdd(volatile gint32 *dest, gint32 add)
-{
-        gint32 result, tmp;
-        __asm__ __volatile__ ("\n1:\n\t"
-                              "lwarx  %0, 0, %2\n\t"
-                              "add    %1, %0, %3\n\t"
-                              "stwcx. %1, 0, %2\n\t"
-                              "bne    1b"
-                              : "=&r" (result), "=&r" (tmp)
-                              : "r" (dest), "r" (add) : "cc", "memory");
-        return(result);
-}
-
-#undef LDREGX
-#undef STREGCXD
-#undef CMPREG
-
-#endif /* !G_COMPILER_CODEWARRIOR */
-
-#elif defined(__arm__)
-#define WAPI_ATOMIC_ASM
-
-/*
- * Atomic operations on ARM doesn't contain memory barriers, and the runtime code
- * depends on this, so we add them explicitly.
- */
-
-static inline gint32 InterlockedCompareExchange(volatile gint32 *dest, gint32 exch, gint32 comp)
-{
-#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7S__)
-       gint32 ret, tmp;
-       __asm__ __volatile__ (  "1:\n"
-                               "dmb\n"
-                               "mov    %0, #0\n"
-                               "ldrex %1, [%2]\n"
-                               "teq    %1, %3\n"
-                               "it eq\n"
-                               "strexeq %0, %4, [%2]\n"
-                               "teq %0, #0\n"
-                               "bne 1b\n"
-                               "dmb\n"
-                               : "=&r" (tmp), "=&r" (ret)
-                               : "r" (dest), "r" (comp), "r" (exch)
-                               : "memory", "cc");
-
-       return ret;
-#else
-       gint32 a, b;
-
-       __asm__ __volatile__ (    "0:\n\t"
-                                 "ldr %1, [%2]\n\t"
-                                 "cmp %1, %4\n\t"
-                                 "mov %0, %1\n\t"
-                                 "bne 1f\n\t"
-                                 "swp %0, %3, [%2]\n\t"
-                                 "cmp %0, %1\n\t"
-                                 "swpne %3, %0, [%2]\n\t"
-                                 "bne 0b\n\t"
-                                 "1:"
-                                 : "=&r" (a), "=&r" (b)
-                                 : "r" (dest), "r" (exch), "r" (comp)
-                                 : "cc", "memory");
-
-       return a;
-#endif
-}
-
-static inline gpointer InterlockedCompareExchangePointer(volatile gpointer *dest, gpointer exch, gpointer comp)
-{
-#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7S__)
-       gpointer ret, tmp;
-       __asm__ __volatile__ (
-                               "dmb\n"
-                               "1:\n"
-                               "mov    %0, #0\n"
-                               "ldrex %1, [%2]\n"
-                               "teq    %1, %3\n"
-                               "it eq\n"
-                               "strexeq %0, %4, [%2]\n"
-                               "teq %0, #0\n"
-                               "bne 1b\n"
-                               "dmb\n"
-                               : "=&r" (tmp), "=&r" (ret)
-                               : "r" (dest), "r" (comp), "r" (exch)
-                               : "memory", "cc");
-
-       return ret;
-#else
-       gpointer a, b;
-
-       __asm__ __volatile__ (    "0:\n\t"
-                                 "ldr %1, [%2]\n\t"
-                                 "cmp %1, %4\n\t"
-                                 "mov %0, %1\n\t"
-                                 "bne 1f\n\t"
-                                 "swpeq %0, %3, [%2]\n\t"
-                                 "cmp %0, %1\n\t"
-                                 "swpne %3, %0, [%2]\n\t"
-                                 "bne 0b\n\t"
-                                 "1:"
-                                 : "=&r" (a), "=&r" (b)
-                                 : "r" (dest), "r" (exch), "r" (comp)
-                                 : "cc", "memory");
-
-       return a;
-#endif
-}
-
-static inline gint32 InterlockedIncrement(volatile gint32 *dest)
-{
-#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7S__)
-       gint32 ret, flag;
-       __asm__ __volatile__ (
-                               "dmb\n"
-                               "1:\n"
-                               "ldrex %0, [%2]\n"
-                               "add %0, %0, %3\n"
-                               "strex %1, %0, [%2]\n"
-                               "teq %1, #0\n"
-                               "bne 1b\n"
-                               "dmb\n"
-                               : "=&r" (ret), "=&r" (flag)
-                               : "r" (dest), "r" (1)
-                               : "memory", "cc");
-
-       return ret;
-#else
-       gint32 a, b, c;
-
-       __asm__ __volatile__ (  "0:\n\t"
-                               "ldr %0, [%3]\n\t"
-                               "add %1, %0, %4\n\t"
-                               "swp %2, %1, [%3]\n\t"
-                               "cmp %0, %2\n\t"
-                               "swpne %1, %2, [%3]\n\t"
-                               "bne 0b"
-                               : "=&r" (a), "=&r" (b), "=&r" (c)
-                               : "r" (dest), "r" (1)
-                               : "cc", "memory");
-
-       return b;
-#endif
-}
-
-static inline gint32 InterlockedDecrement(volatile gint32 *dest)
-{
-#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7S__)
-       gint32 ret, flag;
-       __asm__ __volatile__ (
-                               "dmb\n"
-                               "1:\n"
-                               "ldrex %0, [%2]\n"
-                               "sub %0, %0, %3\n"
-                               "strex %1, %0, [%2]\n"
-                               "teq %1, #0\n"
-                               "bne 1b\n"
-                               "dmb\n"
-                               : "=&r" (ret), "=&r" (flag)
-                               : "r" (dest), "r" (1)
-                               : "memory", "cc");
-
-       return ret;
-#else
-       gint32 a, b, c;
-
-       __asm__ __volatile__ (  "0:\n\t"
-                               "ldr %0, [%3]\n\t"
-                               "add %1, %0, %4\n\t"
-                               "swp %2, %1, [%3]\n\t"
-                               "cmp %0, %2\n\t"
-                               "swpne %1, %2, [%3]\n\t"
-                               "bne 0b"
-                               : "=&r" (a), "=&r" (b), "=&r" (c)
-                               : "r" (dest), "r" (-1)
-                               : "cc", "memory");
-
-       return b;
-#endif
-}
-
-static inline gint32 InterlockedExchange(volatile gint32 *dest, gint32 exch)
-{
-#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7S__)
-       gint32 ret, flag;
-       __asm__ __volatile__ (
-                                 "dmb\n"
-                             "1:\n"
-                             "ldrex %0, [%3]\n"
-                             "strex %1, %2, [%3]\n"
-                             "teq %1, #0\n"
-                             "bne 1b\n"
-                                 "dmb\n"
-                             : "=&r" (ret), "=&r" (flag)
-                             : "r" (exch), "r" (dest)
-                             : "memory", "cc");
-       return ret;
-#else
-       gint32 a;
-
-       __asm__ __volatile__ (  "swp %0, %2, [%1]"
-                               : "=&r" (a)
-                               : "r" (dest), "r" (exch));
-
-       return a;
-#endif
-}
-
-static inline gpointer InterlockedExchangePointer(volatile gpointer *dest, gpointer exch)
-{
-#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7S__)
-       gpointer ret, flag;
-       __asm__ __volatile__ (
-                                 "dmb\n"
-                             "1:\n"
-                             "ldrex %0, [%3]\n"
-                             "strex %1, %2, [%3]\n"
-                             "teq %1, #0\n"
-                             "bne 1b\n"
-                                 "dmb\n"
-                             : "=&r" (ret), "=&r" (flag)
-                             : "r" (exch), "r" (dest)
-                             : "memory", "cc");
-       return ret;
-#else
-       gpointer a;
-
-       __asm__ __volatile__ (  "swp %0, %2, [%1]"
-                               : "=&r" (a)
-                               : "r" (dest), "r" (exch));
-
-       return a;
-#endif
-}
-
-static inline gint32 InterlockedExchangeAdd(volatile gint32 *dest, gint32 add)
-{
-#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7S__)
-       gint32 ret, tmp, flag;
-       __asm__ __volatile__ (
-                               "dmb\n"
-                               "1:\n"
-                               "ldrex %0, [%3]\n"
-                               "add %1, %0, %4\n"
-                               "strex %2, %1, [%3]\n"
-                               "teq %2, #0\n"
-                               "bne 1b\n"
-                               "dmb\n"
-                               : "=&r" (ret), "=&r" (tmp), "=&r" (flag)
-                               : "r" (dest), "r" (add)
-                               : "memory", "cc");
-
-       return ret;
-#else
-       int a, b, c;
-
-       __asm__ __volatile__ (  "0:\n\t"
-                               "ldr %0, [%3]\n\t"
-                               "add %1, %0, %4\n\t"
-                               "swp %2, %1, [%3]\n\t"
-                               "cmp %0, %2\n\t"
-                               "swpne %1, %2, [%3]\n\t"
-                               "bne 0b"
-                               : "=&r" (a), "=&r" (b), "=&r" (c)
-                               : "r" (dest), "r" (add)
-                               : "cc", "memory");
-
-       return a;
-#endif
-}
-
-#elif defined(__ia64__)
-#define WAPI_ATOMIC_ASM
-
-#ifdef __INTEL_COMPILER
-#include <ia64intrin.h>
-#endif
-
-static inline gint32 InterlockedCompareExchange(gint32 volatile *dest,
-                                               gint32 exch, gint32 comp)
-{
-       gint32 old;
-       guint64 real_comp;
-
-#ifdef __INTEL_COMPILER
-       old = _InterlockedCompareExchange (dest, exch, comp);
-#else
-       /* cmpxchg4 zero extends the value read from memory */
-       real_comp = (guint64)(guint32)comp;
-       asm volatile ("mov ar.ccv = %2 ;;\n\t"
-                                 "cmpxchg4.acq %0 = [%1], %3, ar.ccv\n\t"
-                                 : "=r" (old) : "r" (dest), "r" (real_comp), "r" (exch));
-#endif
-
-       return(old);
-}
-
-static inline gpointer InterlockedCompareExchangePointer(gpointer volatile *dest,
-                                               gpointer exch, gpointer comp)
-{
-       gpointer old;
-
-#ifdef __INTEL_COMPILER
-       old = _InterlockedCompareExchangePointer (dest, exch, comp);
-#else
-       asm volatile ("mov ar.ccv = %2 ;;\n\t"
-                                 "cmpxchg8.acq %0 = [%1], %3, ar.ccv\n\t"
-                                 : "=r" (old) : "r" (dest), "r" (comp), "r" (exch));
-#endif
-
-       return(old);
-}
-
-static inline gint32 InterlockedIncrement(gint32 volatile *val)
-{
-#ifdef __INTEL_COMPILER
-       return _InterlockedIncrement (val);
-#else
-       gint32 old;
-
-       do {
-               old = *val;
-       } while (InterlockedCompareExchange (val, old + 1, old) != old);
-
-       return old + 1;
-#endif
-}
-
-static inline gint32 InterlockedDecrement(gint32 volatile *val)
-{
-#ifdef __INTEL_COMPILER
-       return _InterlockedDecrement (val);
-#else
-       gint32 old;
-
-       do {
-               old = *val;
-       } while (InterlockedCompareExchange (val, old - 1, old) != old);
-
-       return old - 1;
-#endif
-}
-
-static inline gint32 InterlockedExchange(gint32 volatile *dest, gint32 new_val)
-{
-#ifdef __INTEL_COMPILER
-       return _InterlockedExchange (dest, new_val);
-#else
-       gint32 res;
-
-       do {
-               res = *dest;
-       } while (InterlockedCompareExchange (dest, new_val, res) != res);
-
-       return res;
-#endif
-}
-
-static inline gpointer InterlockedExchangePointer(gpointer volatile *dest, gpointer new_val)
-{
-#ifdef __INTEL_COMPILER
-       return (gpointer)_InterlockedExchange64 ((gint64*)dest, (gint64)new_val);
-#else
-       gpointer res;
-
-       do {
-               res = *dest;
-       } while (InterlockedCompareExchangePointer (dest, new_val, res) != res);
-
-       return res;
-#endif
-}
-
-static inline gint32 InterlockedExchangeAdd(gint32 volatile *val, gint32 add)
-{
-       gint32 old;
-
-#ifdef __INTEL_COMPILER
-       old = _InterlockedExchangeAdd (val, add);
-#else
-       do {
-               old = *val;
-       } while (InterlockedCompareExchange (val, old + add, old) != old);
-
-       return old;
-#endif
-}
-
-#elif defined(__mips__)
-#define WAPI_ATOMIC_ASM
-
-#if SIZEOF_REGISTER == 8
-#error "Not implemented."
-#endif
-
-static inline gint32 InterlockedIncrement(volatile gint32 *val)
-{
-       gint32 tmp, result = 0;
-
-       __asm__ __volatile__ ("    .set    mips32\n"
-                             "1:  ll      %0, %2\n"
-                             "    addu    %1, %0, 1\n"
-                              "    sc      %1, %2\n"
-                             "    beqz    %1, 1b\n"
-                             "    .set    mips0\n"
-                             : "=&r" (result), "=&r" (tmp), "=m" (*val)
-                             : "m" (*val));
-       return result + 1;
-}
-
-static inline gint32 InterlockedDecrement(volatile gint32 *val)
-{
-       gint32 tmp, result = 0;
-
-       __asm__ __volatile__ ("    .set    mips32\n"
-                             "1:  ll      %0, %2\n"
-                             "    subu    %1, %0, 1\n"
-                              "    sc      %1, %2\n"
-                             "    beqz    %1, 1b\n"
-                             "    .set    mips0\n"
-                             : "=&r" (result), "=&r" (tmp), "=m" (*val)
-                             : "m" (*val));
-       return result - 1;
-}
-
-static inline gint32 InterlockedCompareExchange(volatile gint32 *dest,
-                                               gint32 exch, gint32 comp) {
-       gint32 old, tmp;
-
-       __asm__ __volatile__ ("    .set    mips32\n"
-                             "1:  ll      %0, %2\n"
-                             "    bne     %0, %5, 2f\n"
-                             "    move    %1, %4\n"
-                              "    sc      %1, %2\n"
-                             "    beqz    %1, 1b\n"
-                             "2:  .set    mips0\n"
-                             : "=&r" (old), "=&r" (tmp), "=m" (*dest)
-                             : "m" (*dest), "r" (exch), "r" (comp));
-       return(old);
-}
-
-static inline gpointer InterlockedCompareExchangePointer(volatile gpointer *dest, gpointer exch, gpointer comp)
-{
-       return (gpointer)(InterlockedCompareExchange((volatile gint32 *)(dest), (gint32)(exch), (gint32)(comp)));
-}
-
-static inline gint32 InterlockedExchange(volatile gint32 *dest, gint32 exch)
-{
-       gint32 result, tmp;
-
-       __asm__ __volatile__ ("    .set    mips32\n"
-                             "1:  ll      %0, %2\n"
-                             "    move    %1, %4\n"
-                              "    sc      %1, %2\n"
-                             "    beqz    %1, 1b\n"
-                             "    .set    mips0\n"
-                             : "=&r" (result), "=&r" (tmp), "=m" (*dest)
-                             : "m" (*dest), "r" (exch));
-       return(result);
-}
-
-static inline gpointer InterlockedExchangePointer(volatile gpointer *dest, gpointer exch)
-{
-       return (gpointer)InterlockedExchange((volatile gint32 *)(dest), (gint32)(exch));
-}
-
-static inline gint32 InterlockedExchangeAdd(volatile gint32 *dest, gint32 add)
-{
-        gint32 result, tmp;
-
-       __asm__ __volatile__ ("    .set    mips32\n"
-                             "1:  ll      %0, %2\n"
-                             "    addu    %1, %0, %4\n"
-                              "    sc      %1, %2\n"
-                             "    beqz    %1, 1b\n"
-                             "    .set    mips0\n"
-                             : "=&r" (result), "=&r" (tmp), "=m" (*dest)
-                             : "m" (*dest), "r" (add));
-        return result;
-}
-
-#else
-
-extern gint32 InterlockedCompareExchange(volatile gint32 *dest, gint32 exch, gint32 comp);
-extern gpointer InterlockedCompareExchangePointer(volatile gpointer *dest, gpointer exch, gpointer comp);
-extern gint32 InterlockedIncrement(volatile gint32 *dest);
-extern gint32 InterlockedDecrement(volatile gint32 *dest);
-extern gint32 InterlockedExchange(volatile gint32 *dest, gint32 exch);
-extern gpointer InterlockedExchangePointer(volatile gpointer *dest, gpointer exch);
-extern gint32 InterlockedExchangeAdd(volatile gint32 *dest, gint32 add);
-
-#if defined(__hppa__)
-#define WAPI_ATOMIC_ASM
-#endif
-
-#endif
-
-#endif /* _WAPI_ATOMIC_H_ */
index 9e118a35814f4cba69c91001c5868547a8b10914..9190d2d908707062bb63581e0946e65ab12f45a7 100644 (file)
@@ -17,6 +17,7 @@
 #include <mono/io-layer/wapi.h>
 #include <mono/io-layer/collection.h>
 #include <mono/io-layer/handles-private.h>
+#include <mono/utils/atomic.h>
 
 #if 0
 // #define DEBUG(...) g_message(__VA_ARGS__)
index 5949b3a06bea3a6e3edc66808baa888754922fc9..61aa26d77364807a9ee427640a4d128f601a432c 100644 (file)
@@ -21,6 +21,7 @@
 #include <mono/io-layer/misc-private.h>
 #include <mono/io-layer/collection.h>
 #include <mono/io-layer/shared.h>
+#include <mono/utils/atomic.h>
 
 #define _WAPI_PRIVATE_MAX_SLOTS                (1024 * 16)
 #define _WAPI_PRIVATE_HANDLES(x) (_wapi_private_handles [x / _WAPI_HANDLE_INITIAL_COUNT][x % _WAPI_HANDLE_INITIAL_COUNT])
index 3e61f0cfbbd9eada6d0323ce76ecb52cb7e3f411..a3e5ad15b56aaa87d2e9c89b1266c7bd1753a363 100755 (executable)
@@ -708,6 +708,8 @@ static gboolean file_setendoffile(gpointer handle)
        }
 #endif
 
+/* Native Client has no ftruncate function, even in standalone sel_ldr. */
+#ifndef __native_client__
        /* always truncate, because the extend write() adds an extra
         * byte to the end of the file
         */
@@ -722,6 +724,7 @@ static gboolean file_setendoffile(gpointer handle)
                _wapi_set_last_error_from_errno ();
                return(FALSE);
        }
+#endif
                
        return(TRUE);
 }
@@ -1512,6 +1515,13 @@ gpointer CreateFile(const gunichar2 *name, guint32 fileaccess,
                
                return(INVALID_HANDLE_VALUE);
        }
+#ifdef __native_client__
+       /* Workaround: Native Client currently returns the same fake inode
+        * for all files, so do a simple hash on the filename so we don't
+        * use the same share info for each file.
+        */
+       statbuf.st_ino = g_str_hash(filename);
+#endif
 
        if (share_check (&statbuf, sharemode, fileaccess,
                         &file_handle.share_info, fd) == FALSE) {
@@ -2746,6 +2756,7 @@ retry:
                goto retry;
        }
 
+#ifndef __native_client__
        result = _wapi_lstat (filename, &linkbuf);
        if (result != 0) {
                DEBUG ("%s: lstat failed: %s", __func__, filename);
@@ -2753,6 +2764,7 @@ retry:
                g_free (filename);
                goto retry;
        }
+#endif
 
        utf8_filename = mono_utf8_from_external (filename);
        if (utf8_filename == NULL) {
@@ -2776,7 +2788,11 @@ retry:
        else
                create_time = buf.st_ctime;
        
+#ifdef __native_client__
+       find_data->dwFileAttributes = _wapi_stat_to_file_attributes (utf8_filename, &buf, NULL);
+#else
        find_data->dwFileAttributes = _wapi_stat_to_file_attributes (utf8_filename, &buf, &linkbuf);
+#endif
 
        _wapi_time_t_to_filetime (create_time, &find_data->ftCreationTime);
        _wapi_time_t_to_filetime (buf.st_atime, &find_data->ftLastAccessTime);
@@ -2999,14 +3015,20 @@ guint32 GetFileAttributes (const gunichar2 *name)
                return (INVALID_FILE_ATTRIBUTES);
        }
 
+#ifndef __native_client__
        result = _wapi_lstat (utf8_name, &linkbuf);
        if (result != 0) {
                _wapi_set_last_path_error_from_errno (NULL, utf8_name);
                g_free (utf8_name);
                return (INVALID_FILE_ATTRIBUTES);
        }
+#endif
        
+#ifdef __native_client__
+       ret = _wapi_stat_to_file_attributes (utf8_name, &buf, NULL);
+#else
        ret = _wapi_stat_to_file_attributes (utf8_name, &buf, &linkbuf);
+#endif
        
        g_free (utf8_name);
 
@@ -3203,6 +3225,12 @@ extern guint32 GetCurrentDirectory (guint32 length, gunichar2 *buffer)
        glong count;
        gsize bytes;
 
+#ifdef __native_client__
+       gchar *path = g_get_current_dir ();
+       if (length < strlen(path) + 1 || path == NULL)
+               return 0;
+       memcpy (buffer, path, strlen(path) + 1);
+#else
        if (getcwd ((char*)buffer, length) == NULL) {
                if (errno == ERANGE) { /*buffer length is not big enough */ 
                        gchar *path = g_get_current_dir (); /*FIXME g_get_current_dir doesn't work with broken paths and calling it just to know the path length is silly*/
@@ -3216,6 +3244,7 @@ extern guint32 GetCurrentDirectory (guint32 length, gunichar2 *buffer)
                _wapi_set_last_error_from_errno ();
                return 0;
        }
+#endif
 
        utf16_path = mono_unicode_from_external ((gchar*)buffer, &bytes);
        count = (bytes/2)+1;
index ab0f1195cf0cb88dba8707d7a342610a6ad11427..0f14de7894fce414e3befcbc841a254429d0567d 100644 (file)
@@ -378,7 +378,8 @@ gboolean ShellExecuteEx (WapiShellExecuteInfo *sei)
                                     sei->lpDirectory, NULL, &process_info);
                g_free (args);
                if (!ret){
-                       SetLastError (ERROR_INVALID_DATA);
+                       if (GetLastError () != ERROR_OUTOFMEMORY)
+                               SetLastError (ERROR_INVALID_DATA);
                        return FALSE;
                }
        }
@@ -564,6 +565,7 @@ gboolean CreateProcess (const gunichar2 *appname, const gunichar2 *cmdline,
        int startup_pipe [2] = {-1, -1};
        int dummy;
        struct MonoProcess *mono_process;
+       gboolean fork_failed = FALSE;
        
        mono_once (&process_ops_once, process_ops_init);
        mono_once (&process_sig_chld_once, process_add_sigchld_handler);
@@ -965,14 +967,15 @@ gboolean CreateProcess (const gunichar2 *appname, const gunichar2 *cmdline,
        if (pid == -1) {
                /* Error */
                SetLastError (ERROR_OUTOFMEMORY);
-               _wapi_handle_unref (handle);
+               ret = FALSE;
+               fork_failed = TRUE;
                goto cleanup;
        } else if (pid == 0) {
                /* Child */
                
                if (startup_pipe [0] != -1) {
                        /* Wait until the parent has updated it's internal data */
-                       read (startup_pipe [0], &dummy, 1);
+                       ssize_t _i G_GNUC_UNUSED = read (startup_pipe [0], &dummy, 1);
                        DEBUG ("%s: child: parent has completed its setup", __func__);
                        close (startup_pipe [0]);
                        close (startup_pipe [1]);
@@ -1070,9 +1073,12 @@ gboolean CreateProcess (const gunichar2 *appname, const gunichar2 *cmdline,
 cleanup:
        _wapi_handle_unlock_shared_handles ();
 
+       if (fork_failed)
+               _wapi_handle_unref (handle);
+
        if (startup_pipe [1] != -1) {
                /* Write 1 byte, doesn't matter what */
-               write (startup_pipe [1], startup_pipe, 1);
+               ssize_t _i G_GNUC_UNUSED = write (startup_pipe [1], startup_pipe, 1);
                close (startup_pipe [0]);
                close (startup_pipe [1]);
        }
index 9e70e8c5aec0da235fd4fd3bfa61a499e0eeabeb..ed9bb1fb21178c6d5ec1f8a653ac85c56729e8d0 100644 (file)
@@ -18,7 +18,7 @@
 #include <string.h>
 #include <unistd.h>
 
-#ifdef HAVE_SYS_SEM_H
+#if defined(HAVE_SYS_SEM_H) && !(defined(__native_client__) && defined(__GLIBC__))
 #  include <sys/sem.h>
 #else
 #  define DISABLE_SHARED_HANDLES
index bc98c870468c73e28a1e624880608d87051a8f15..db051decf8413e65468d0614bac5381d32376105 100644 (file)
@@ -15,7 +15,6 @@
 #include <mono/io-layer/handles.h>
 #include <mono/io-layer/io.h>
 #include <mono/io-layer/access.h>
-#include <mono/io-layer/atomic.h>
 #include <mono/io-layer/context.h>
 #include <mono/io-layer/critical-sections.h>
 #include <mono/io-layer/error.h>
index b5d6d6c551181d3a322bf3f8f49a783c6fec3b83..7874b70625445faf338eeac2b6a70936fa4f461b 100644 (file)
 #include <mono/io-layer/mono-mutex.h>
 #include <mono/io-layer/thread-private.h>
 #include <mono/io-layer/mutex-private.h>
-#include <mono/io-layer/atomic.h>
 
 #include <mono/utils/mono-threads.h>
 #include <mono/utils/gc_wrapper.h>
+#include <mono/utils/atomic.h>
 
 #ifdef HAVE_VALGRIND_MEMCHECK_H
 #include <valgrind/memcheck.h>
index a5acdb14639c061746e00721648f0856c9af6935..31725457da0c1ad43f6c0ad254a263af5acef6d4 100644 (file)
@@ -60,6 +60,7 @@
 #include <mono/utils/mono-stdlib.h>
 #include <mono/utils/mono-io-portability.h>
 #include <mono/utils/mono-error-internals.h>
+#include <mono/utils/atomic.h>
 #ifdef HOST_WIN32
 #include <direct.h>
 #endif
@@ -2011,6 +2012,9 @@ ves_icall_System_AppDomain_InternalUnload (gint32 domain_id)
         */
        if (g_getenv ("MONO_NO_UNLOAD"))
                return;
+#ifdef __native_client__
+       return;
+#endif
 
        mono_domain_unload (domain);
 }
index 62490819b1bee62f1eb735bb6c22a6df5d90929a..2d0557264401727357c41bfdc125a9068ad3d1e2 100644 (file)
@@ -34,6 +34,7 @@
 #include <mono/metadata/reflection.h>
 #include <mono/metadata/coree.h>
 #include <mono/utils/mono-io-portability.h>
+#include <mono/utils/atomic.h>
 
 #ifndef HOST_WIN32
 #include <sys/types.h>
@@ -254,10 +255,10 @@ static void
 check_path_env (void)
 {
        const char* path;
-#ifdef __native_client__
-       path = nacl_mono_path;
-#else
        path = g_getenv ("MONO_PATH");
+#ifdef __native_client__
+       if (!path)
+               path = nacl_mono_path;
 #endif
        if (!path || assemblies_path != NULL)
                return;
index e8ff58a98ca020adbdf5c9782d7ce0f32da4504a..9e5ab87ac9c09e9f393f4e6f15ed39cf872a75ec 100644 (file)
@@ -74,7 +74,7 @@ mono_gc_base_init (void)
         * we used to do this only when running on valgrind,
         * but it happens also in other setups.
         */
-#if defined(HAVE_PTHREAD_GETATTR_NP) && defined(HAVE_PTHREAD_ATTR_GETSTACK)
+#if defined(HAVE_PTHREAD_GETATTR_NP) && defined(HAVE_PTHREAD_ATTR_GETSTACK) && !defined(__native_client__)
        {
                size_t size;
                void *sstart;
@@ -923,7 +923,7 @@ mono_gc_get_managed_allocator (MonoVTable *vtable, gboolean for_box)
                return NULL;
        if (!SMALL_ENOUGH (klass->instance_size))
                return NULL;
-       if (mono_class_has_finalizer (klass) || klass->marshalbyref || (mono_profiler_get_events () & MONO_PROFILE_ALLOCATIONS))
+       if (mono_class_has_finalizer (klass) || mono_class_is_marshalbyref (klass) || (mono_profiler_get_events () & MONO_PROFILE_ALLOCATIONS))
                return NULL;
        if (klass->rank)
                return NULL;
@@ -949,7 +949,7 @@ mono_gc_get_managed_allocator (MonoVTable *vtable, gboolean for_box)
 }
 
 MonoMethod*
-mono_gc_get_managed_array_allocator (MonoVTable *vtable, int rank)
+mono_gc_get_managed_array_allocator (MonoClass *klass)
 {
        return NULL;
 }
@@ -1002,7 +1002,7 @@ mono_gc_get_managed_allocator (MonoVTable *vtable, gboolean for_box)
 }
 
 MonoMethod*
-mono_gc_get_managed_array_allocator (MonoVTable *vtable, int rank)
+mono_gc_get_managed_array_allocator (MonoClass *klass)
 {
        return NULL;
 }
index 18d05e989f61413badeca37b42db64d173457a81..39b37fd1afdbb205ff870bb27036d85e8d24743b 100644 (file)
@@ -711,7 +711,7 @@ typedef struct {
 #define MONO_SIZEOF_REMOTE_CLASS (sizeof (MonoRemoteClass) - MONO_ZERO_LEN_ARRAY * SIZEOF_VOID_P)
 
 typedef struct {
-       gulong new_object_count;
+       guint64 new_object_count;
        gulong initialized_class_count;
        gulong generic_vtable_count;
        gulong used_class_count;
index 70654da524914038567ca8a687a5191ae4dfa562..d81269c95ef5b2fb0754ba73c1ba4979a80abdc2 100644 (file)
@@ -16,9 +16,6 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
-#if !HOST_WIN32
-#include <mono/io-layer/atomic.h>
-#endif
 #include <mono/metadata/image.h>
 #include <mono/metadata/assembly.h>
 #include <mono/metadata/metadata.h>
@@ -44,6 +41,7 @@
 #include <mono/utils/mono-error-internals.h>
 #include <mono/utils/mono-logger-internal.h>
 #include <mono/utils/mono-memory-model.h>
+#include <mono/utils/atomic.h>
 MonoStats mono_stats;
 
 gboolean mono_print_vtable = FALSE;
index 15c5ec9bf5b4fb922630fba62cab00bf2325fdbb..3ff6c5ee45f1780dc824f22a799de5d4d27d5802 100644 (file)
@@ -32,6 +32,7 @@
 #include "mono/metadata/attrdefs.h"
 #include "mono/metadata/gc-internal.h"
 #include "mono/utils/mono-counters.h"
+#include "mono/utils/atomic.h"
 #include <string.h>
 #include <errno.h>
 
index 9d6a10c953b5c9c52b7163529ad1fafc471683b6..f8cc9249a17318b93c37eeabe2a8b5afd3e94cc5 100644 (file)
 
 
 static const DateTimeFormatEntry datetime_format_entries [] = {
-       {1, 14, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 266, 268, {14,270,0,0,0,0,0,0,0,0,0,0,0,0},{1,281,0,0,0,0,0,0},{35,301,0,0,0,0,0,0,0,0,0,0},{23,307,0,0,0,0,0,0,0}},
-       {316, 335, 350, 365, 377, 55, 393, 405, {417, 430, 451, 466, 477, 496, 507}, {520, 525, 530, 535, 540, 545, 550}, {555, 558, 561, 564, 567, 558, 564}, {570, 583, 600, 609, 620, 627, 634, 641, 654, 673, 690, 705, 0}, {570, 583, 600, 609, 620, 627, 634, 641, 654, 673, 690, 705, 0}, {722, 728, 600, 738, 620, 627, 634, 746, 754, 764, 772, 782, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {335,792,808,824,0,0,0,0,0,0,0,0,0,0},{316,841,859,884,0,0,0,0},{365,908,0,0,0,0,0,0,0,0,0,0},{350,919,0,0,0,0,0,0,0}},
-       {933, 270, 307, 301, 959, 55, 973, 978, {983, 992, 1000, 1008, 1017, 1024, 1034}, {1043, 1046, 1049, 1052, 1055, 1058, 1061}, {1064, 1066, 1068, 1070, 1072, 1074, 1076}, {1078, 1084, 1091, 1097, 1103, 1108, 1113, 1120, 1126, 1135, 1143, 1152, 0}, {1161, 1170, 1180, 1189, 1199, 1207, 1215, 1225, 1235, 1247, 1259, 1271, 0}, {1283, 1288, 1091, 1294, 1103, 1108, 1299, 1304, 1308, 1313, 1318, 1323, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,14,1328,1339,1347,1354,1363,0,0,0,0,0,0,0},{933,1372,1388,0,0,0,0,0},{301,1404,1409,0,0,0,0,0,0,0,0,0},{307,1420,1428,0,0,0,0,0,0}},
-       {1445, 1467, 1420, 1404, 1476, 1492, 1505, 1512, {1519, 1529, 1539, 1549, 1559, 1569, 1579}, {1589, 1596, 1603, 1610, 1617, 1624, 1631}, {1638, 1642, 1646, 1650, 1654, 1658, 1662}, {1666, 1673, 1680, 1687, 1694, 1701, 1708, 1715, 1722, 1729, 1736, 1746, 0}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {1666, 1673, 1680, 1687, 1694, 1701, 1708, 1715, 1722, 1729, 1736, 1746, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1467,1819,1828,1328,1837,1848,1859,1866,1873,1880,0,0,0,0},{1445,1889,1916,0,0,0,0,0},{1404,301,1943,1951,0,0,0,0,0,0,0,0},{1420,307,1960,1971,0,0,0,0,0}},
-       {1445, 1467, 1420, 1404, 1476, 1492, 1505, 1512, {1519, 1529, 1539, 1549, 1559, 1569, 1579}, {1589, 1596, 1603, 1610, 1617, 1624, 1631}, {1638, 1642, 1646, 1650, 1654, 1658, 1662}, {1666, 1673, 1680, 1687, 1694, 1701, 1708, 1715, 1722, 1729, 1736, 1746, 0}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {1666, 1673, 1680, 1687, 1694, 1701, 1708, 1715, 1722, 1729, 1736, 1746, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1467,1819,1828,1328,1837,1848,1859,1866,1873,1880,0,0,0,0},{1445,1889,1916,0,0,0,0,0},{1404,301,1943,1951,0,0,0,0,0,0,0,0},{1420,307,1960,1971,0,0,0,0,0}},
-       {1983, 1996, 1420, 1404, 2005, 55, 2015, 2020, {2025, 2033, 2043, 2051, 2059, 2068, 2075}, {2082, 2085, 2088, 2092, 2095, 2099, 2103}, {2106, 2108, 2110, 2113, 2115, 2108, 2113}, {2118, 2124, 2130, 2138, 2144, 2152, 2160, 2170, 2176, 2184, 2192, 2201, 0}, {2210, 2216, 2223, 2231, 2237, 2245, 2253, 2263, 2176, 2269, 2277, 2287, 0}, {2296, 2299, 2302, 2305, 2308, 2311, 2314, 2317, 2320, 2323, 2327, 2331, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {1996,2335,1328,1819,1859,0,0,0,0,0,0,0,0,0},{1983,0,0,0,0,0,0,0},{1404,301,2342,2350,0,0,0,0,0,0,0,0},{1420,307,2355,2366,0,0,0,0,0}},
-       {1983, 2374, 307, 301, 2005, 2385, 2393, 2398, {2403, 2411, 2418, 2426, 2433, 2441, 2448}, {2456, 2461, 2465, 2469, 2473, 2477, 2481}, {2113, 2486, 2488, 2490, 2488, 2492, 2494}, {2496, 2503, 2511, 2517, 2523, 2527, 2532, 2537, 2544, 2554, 2562, 2571, 0}, {2496, 2503, 2511, 2517, 2523, 2527, 2532, 2537, 2544, 2554, 2562, 2571, 0}, {2580, 2584, 2588, 2592, 2523, 2596, 2600, 2604, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 2624, 268, {2374,1354,1328,2626,0,0,0,0,0,0,0,0,0,0},{1983,2637,0,0,0,0,0,0},{301,1404,0,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {2651, 2670, 307, 301, 2005, 55, 2681, 2687, {2694, 2702, 2709, 2718, 2727, 2738, 2746}, {2754, 2757, 2760, 2763, 2766, 2769, 2772}, {2113, 2486, 2775, 2486, 2775, 2492, 2113}, {2777, 2784, 2792, 2798, 2804, 2808, 2813, 2818, 2825, 2835, 2843, 2852, 0}, {2777, 2784, 2792, 2798, 2804, 2808, 2813, 2818, 2825, 2835, 2843, 2852, 0}, {2861, 2865, 2869, 2874, 2804, 2878, 2882, 2886, 2890, 2894, 2898, 2902, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {2670,2906,1363,2918,2926,1996,1328,0,0,0,0,0,0,0},{2651,1983,2933,0,0,0,0,0},{301,1404,2350,2945,0,0,0,0,0,0,0,0},{307,2956,2970,2985,0,0,0,0,0}},
-       {2992, 3010, 3019, 3030, 2005, 55, 3038, 3045, {3052, 3067, 3082, 3093, 3108, 3121, 3140}, {3155, 3162, 3169, 3176, 3183, 3190, 3197}, {3204, 3207, 3210, 3210, 3213, 3213, 3216}, {3219, 3240, 3263, 3278, 3295, 3306, 3321, 3336, 3355, 3378, 3397, 3416, 0}, {3437, 3458, 3481, 3496, 3513, 3524, 3539, 3554, 3573, 3596, 3615, 3634, 0}, {3655, 3662, 3669, 3676, 3683, 3690, 3699, 3708, 3715, 3722, 3729, 3736, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {3010,270,1347,14,3743,1328,0,0,0,0,0,0,0,0},{2992,3755,0,0,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {3767, 3787, 3019, 3030, 44, 3796, 3804, 3807, {3810, 3817, 3824, 3832, 3842, 3851, 3858}, {3867, 3871, 3875, 3879, 3883, 3887, 3891}, {2113, 2486, 2488, 3895, 2488, 2492, 2113}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {2861, 2865, 3951, 2874, 3920, 2878, 2882, 2886, 2890, 3955, 2898, 3959, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3787,3963,3970,3979,1880,1328,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {4028, 270, 1420, 1404, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 266, 268, {270,14,1339,1347,1354,1363,1328,2906,0,0,0,0,0,0},{4028,4254,4281,0,0,0,0,0},{1404,301,1409,0,0,0,0,0,0,0,0,0},{1420,307,1428,0,0,0,0,0,0}},
-       {4303, 1996, 1420, 1404, 2005, 4320, 4332, 4336, {4340, 4352, 4364, 4374, 4388, 4398, 4410}, {4421, 4424, 4427, 4430, 4433, 4436, 4439}, {2113, 2486, 2488, 4442, 2488, 2108, 2494}, {4444, 4453, 4462, 4472, 4481, 4490, 4499, 4509, 4516, 4524, 4532, 4542, 0}, {4551, 4562, 4573, 4585, 4596, 4607, 4618, 4630, 4639, 4649, 4659, 4671, 0}, {4682, 4688, 4694, 4701, 4707, 4713, 4719, 4726, 4730, 4735, 4740, 4747, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {1996,2670,2926,1328,0,0,0,0,0,0,0,0,0,0},{4303,4753,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {4771, 270, 307, 301, 2005, 4788, 3804, 3807, {4795, 4804, 4810, 4816, 4825, 4831, 4840}, {4847, 4852, 4857, 4862, 4867, 4872, 4877}, {2775, 2494, 2486, 2486, 4155, 4157, 2113}, {4882, 4890, 4899, 4904, 4910, 4914, 4919, 4927, 4933, 4943, 1143, 4951, 0}, {4882, 4890, 4899, 4904, 4910, 4914, 4919, 4927, 4933, 4943, 1143, 4951, 0}, {4961, 4967, 4899, 4974, 4910, 4914, 4979, 4927, 4985, 1313, 1318, 4991, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 266, 268, {270,14,1363,1354,1328,0,0,0,0,0,0,0,0,0},{4771,4997,3755,0,0,0,0,0},{301,1404,5006,5012,5022,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {5030, 270, 307, 301, 2005, 55, 5048, 5061, {5072, 5090, 5104, 5122, 5140, 5158, 5174}, {5188, 5200, 5212, 5224, 5236, 5248, 5260}, {5267, 5270, 5273, 5276, 5279, 5282, 5285}, {5288, 5299, 5312, 5319, 5330, 5337, 5346, 5355, 5368, 5381, 5396, 5409, 0}, {5288, 5299, 5312, 5319, 5330, 5337, 5346, 5355, 5368, 5381, 5396, 5409, 0}, {5420, 5429, 5312, 5438, 5330, 5447, 5456, 5465, 5474, 5483, 5492, 5501, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,5510,14,1,1354,2374,5523,1328,5536,5553,0,0,0,0},{5030,5510,5563,5585,5536,0,0,0},{301,35,0,0,0,0,0,0,0,0,0,0},{307,23,0,0,0,0,0,0,0}},
-       {5606, 5620, 1420, 1404, 5632, 5643, 5651, 5655, {5659, 5669, 5677, 5682, 5689, 5702, 5710}, {4157, 5718, 4442, 5720, 5724, 2108, 5727}, {4157, 5718, 4442, 5731, 5724, 2108, 5731}, {5734, 5742, 5751, 5760, 5769, 5776, 5784, 5792, 5802, 5813, 2562, 2571, 0}, {5734, 5742, 5751, 5760, 5769, 5776, 5784, 5792, 5802, 5813, 2562, 2571, 0}, {5822, 1288, 5827, 5834, 5840, 5846, 5852, 5858, 5863, 5870, 1318, 5875, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {5620,5880,1328,5894,0,0,0,0,0,0,0,0,0,0},{5606,0,0,0,0,0,0,0},{1404,301,3030,0,0,0,0,0,0,0,0,0},{1420,307,3019,0,0,0,0,0,0}},
-       {1983, 1996, 307, 301, 2005, 2385, 5903, 5908, {5913, 5924, 5935, 5949, 5963, 5975, 5987}, {5999, 6003, 6008, 6013, 6018, 6022, 6027}, {1076, 6031, 6033, 6031, 6036, 6036, 1066}, {6038, 6046, 4899, 6055, 6062, 6067, 6074, 6081, 2544, 5813, 6089, 6099, 0}, {6038, 6046, 4899, 6055, 6062, 6067, 6074, 6081, 2544, 5813, 6089, 6099, 0}, {2580, 2584, 2588, 2592, 6062, 6108, 6113, 6118, 2608, 2612, 6124, 6129, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {1996,1363,6133,6145,1328,6158,0,0,0,0,0,0,0,0},{1983,2637,0,0,0,0,0,0},{301,1404,0,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {4771, 270, 307, 301, 2005, 55, 6167, 6170, {6173, 6182, 6190, 6199, 6210, 6219, 6228}, {4127, 4131, 2588, 6235, 6239, 6243, 6247}, {2775, 2494, 2486, 2486, 6251, 4157, 2113}, {6253, 6261, 6270, 6276, 6283, 6290, 6297, 6304, 6311, 6321, 6329, 6338, 0}, {6347, 6355, 4173, 6364, 6371, 6378, 6385, 4196, 6392, 6402, 1143, 6410, 0}, {6419, 2584, 2588, 2592, 6423, 6427, 6431, 4242, 6435, 6439, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,3743,14,6443,1347,1328,0,0,0,0,0,0,0,0},{4771,6451,3755,0,0,0,0,0},{301,1404,2350,5006,0,0,0,0,0,0,0,0},{307,2366,6460,0,0,0,0,0,0}},
-       {1445, 1837, 1420, 1404, 1476, 1492, 6469, 6476, {6483, 6493, 6503, 6513, 6523, 6533, 6543}, {1638, 6553, 6557, 6561, 6565, 6569, 6573}, {1638, 6553, 6557, 6561, 6565, 6569, 6573}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1837,1880,1866,1467,6577,6596,6613,1328,0,0,0,0,0,0},{1445,6634,6658,6685,0,0,0,0},{1404,301,1943,1951,0,0,0,0,0,0,0,0},{1420,307,1960,1971,0,0,0,0,0}},
-       {6714, 1328, 1960, 1943, 6743, 6760, 6774, 6781, {6788, 6798, 6808, 6818, 6828, 6838, 6848}, {6858, 6862, 6866, 6870, 6874, 6878, 6882}, {6858, 6862, 6866, 6870, 6874, 6878, 6882}, {6886, 6891, 6896, 6901, 6906, 6911, 6916, 6921, 6926, 6931, 6937, 6943, 0}, {6886, 6891, 6896, 6901, 6906, 6911, 6916, 6921, 6926, 6931, 6937, 6943, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {1328,5894,1859,1819,0,0,0,0,0,0,0,0,0,0},{6714,6949,6973,7000,7022,7053,0,0},{1943,1951,1404,301,0,0,0,0,0,0,0,0},{1960,1971,1420,307,0,0,0,0,0}},
-       {4771, 7079, 1420, 1404, 2005, 55, 973, 978, {7088, 7095, 7103, 7111, 7120, 7130, 7138}, {7147, 4424, 7150, 7153, 7156, 7159, 7162}, {7165, 2486, 2775, 3895, 2775, 4157, 7165}, {7167, 7175, 7184, 2517, 7190, 2527, 2532, 7194, 2544, 2554, 2562, 2571, 0}, {7167, 7175, 7184, 2517, 7190, 2527, 2532, 7194, 2544, 2554, 2562, 2571, 0}, {2580, 2584, 7203, 2592, 7190, 2596, 2600, 2604, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 2624, 268, {7079,2335,1354,14,1363,2906,1328,0,0,0,0,0,0,0},{4771,6451,3755,4997,0,0,0,0},{1404,301,2350,7207,7219,0,0,0,0,0,0,0},{1420,307,7231,7246,0,0,0,0,0}},
-       {1983, 2670, 307, 301, 2005, 2385, 973, 978, {2403, 2411, 2418, 2426, 2433, 2441, 2448}, {7261, 7266, 7270, 7274, 7278, 7282, 7286}, {2113, 2486, 2488, 2490, 2488, 2492, 2494}, {2496, 2503, 4899, 2517, 4910, 2527, 2532, 2537, 2544, 2554, 2562, 6099, 0}, {2496, 2503, 4899, 2517, 4910, 2527, 2532, 2537, 2544, 2554, 2562, 6099, 0}, {2580, 2584, 2588, 2592, 4910, 2596, 2600, 2604, 2608, 2612, 2616, 6129, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 790, 268, {2670,1363,2926,1328,2906,0,0,0,0,0,0,0,0,0},{1983,2637,0,0,0,0,0,0},{301,1404,7291,5006,0,0,0,0,0,0,0,0},{307,1420,7302,6460,0,0,0,0,0}},
-       {3755, 1328, 307, 301, 2005, 4788, 3804, 3807, {7316, 7326, 7340, 7347, 7354, 7363, 2075}, {7371, 7378, 7383, 7387, 7392, 7397, 7401}, {2106, 2108, 3895, 7406, 7409, 2108, 2113}, {7411, 7420, 7425, 7432, 2523, 7442, 7451, 7458, 7468, 7478, 2192, 7491, 0}, {7501, 7510, 7517, 7523, 7532, 7537, 7545, 7551, 7560, 7570, 7584, 7594, 0}, {7602, 7606, 2588, 7610, 2523, 7614, 7618, 7622, 7626, 7630, 7635, 7639, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 2624, 268, {1328,5894,0,0,0,0,0,0,0,0,0,0,0,0},{3755,5510,0,0,0,0,0,0},{301,1404,0,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {7643, 270, 307, 301, 4057, 7671, 3804, 3807, {4072, 7684, 7698, 7711, 7724, 7737, 4119}, {4127, 7749, 7753, 7757, 7761, 7765, 4148}, {2775, 2113, 2488, 7769, 7769, 2113, 2113}, {7771, 7779, 7789, 1097, 7796, 7801, 7807, 4196, 7813, 7822, 7830, 7839, 0}, {7771, 7779, 7789, 1097, 7796, 7801, 7807, 4196, 7813, 7822, 7830, 7839, 0}, {2580, 7848, 2588, 4238, 4910, 2596, 2600, 4242, 6435, 7852, 2616, 7856, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,3010,1347,1354,2374,2335,7079,1363,2670,2906,2926,1996,1328},{7643,4281,0,0,0,0,0,0},{301,0,0,0,0,0,0,0,0,0,0,0},{307,0,0,0,0,0,0,0,0}},
-       {2992, 270, 307, 301, 2005, 55, 7860, 7863, {7866, 7875, 4810, 7885, 7893, 7901, 7910}, {7916, 7919, 4424, 7923, 7926, 7930, 2103}, {2775, 6251, 2486, 2486, 6251, 4157, 2113}, {7933, 7941, 4899, 7948, 7955, 7960, 7970, 7978, 7984, 7994, 2562, 2571, 0}, {7933, 7941, 4899, 7948, 7955, 7960, 7970, 7978, 7984, 7994, 2562, 2571, 0}, {8002, 8009, 4899, 4974, 7955, 8015, 8022, 7978, 8027, 1313, 1318, 5875, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,14,1339,8033,1347,270,1328,0,0,0,0,0,0,0},{2992,3755,4997,0,0,0,0,0},{301,1404,8041,8053,8064,8072,8082,8091,2945,8097,8105,8110},{307,1420,8113,8128,2970,2956,8142,8155,2985}},
-       {3755, 2670, 307, 301, 2005, 4788, 3804, 3807, {8167, 8177, 8182, 8189, 8198, 8202, 8209}, {8220, 8223, 8226, 2763, 8229, 8232, 8235}, {2775, 2494, 2486, 2486, 4155, 4157, 2113}, {8239, 8248, 8258, 8265, 4910, 8273, 8279, 2537, 8285, 8296, 8306, 8316, 0}, {8239, 8248, 8258, 8265, 4910, 8273, 8279, 2537, 8285, 8296, 8306, 8316, 0}, {8326, 8331, 4857, 8336, 4910, 8341, 8346, 5858, 4985, 1313, 1318, 5875, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1996,1328,0,0,0,0,0,0,0,0,0,0,0},{3755,0,0,0,0,0,0,0},{301,1404,0,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {841, 2670, 1420, 1404, 2005, 3796, 8351, 8371, {8397, 8420, 451, 8443, 8454, 8469, 8484}, {8499, 8504, 8509, 8514, 8519, 8524, 8529}, {8534, 8537, 8534, 8540, 8543, 8537, 8540}, {8546, 8559, 8574, 8583, 8596, 8603, 8612, 8621, 8634, 8651, 8666, 8679, 0}, {8694, 8707, 8722, 8733, 8746, 8753, 8762, 8771, 8786, 8803, 8818, 8831, 0}, {8846, 8854, 8574, 8864, 8596, 8603, 8612, 8872, 8880, 8890, 8898, 8908, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1363,2926,14,1328,0,0,0,0,0,0,0,0,0},{841,316,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {8916, 8930, 1420, 1404, 44, 2385, 3804, 3807, {8940, 8949, 8961, 8968, 8976, 8986, 8992}, {8999, 9003, 9007, 9011, 9015, 9020, 9024}, {9028, 9030, 9032, 1076, 9034, 9030, 1076}, {9037, 9047, 9056, 9064, 9072, 9080, 9087, 9094, 9102, 2192, 9108, 9116, 0}, {9125, 9135, 9144, 9152, 9160, 9168, 9175, 9182, 9191, 7584, 9197, 9207, 0}, {9216, 9220, 9225, 9230, 9234, 7618, 9238, 9242, 9246, 7635, 9250, 9254, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {8930,9258,6133,9266,9278,9288,9298,1328,0,0,0,0,0,0},{8916,9310,9325,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {1983, 9345, 1420, 1404, 2005, 55, 9356, 9367, {9378, 9386, 9395, 9402, 9409, 9418, 2075}, {2082, 2085, 9425, 2092, 9428, 9432, 2103}, {2106, 2108, 9435, 2113, 9437, 2108, 2113}, {5734, 5742, 9440, 6055, 9446, 6108, 6113, 2537, 2544, 5813, 2562, 2571, 0}, {9451, 9460, 7517, 9470, 9478, 9484, 9490, 9496, 9504, 9514, 9523, 9532, 0}, {2580, 2584, 2588, 2592, 9446, 6108, 6113, 2604, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 9541, 268, {9345,1996,9544,2926,2670,1363,1328,0,0,0,0,0,0,0},{1983,2637,0,0,0,0,0,0},{1404,301,2350,0,0,0,0,0,0,0,0,0},{1420,307,2366,0,0,0,0,0,0}},
-       {1328, 1328, 9553, 9564, 9572, 3796, 9580, 9583, {9586, 9593, 9602, 9611, 9623, 9631, 9640}, {9650, 9654, 3951, 9659, 9664, 9668, 9672}, {2775, 5718, 2486, 2486, 9676, 2108, 2113}, {9678, 9684, 4899, 9691, 2523, 9697, 9705, 9712, 9718, 9726, 9732, 9740, 0}, {9678, 9684, 4899, 9691, 2523, 9697, 9705, 9712, 9718, 9726, 9732, 9740, 0}, {2861, 9748, 3951, 9752, 9756, 9760, 9764, 9768, 9672, 9772, 9776, 9781, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 2624, 268, {1328,5894,0,0,0,0,0,0,0,0,0,0,0,0},{1328,0,0,0,0,0,0,0},{9564,301,0,0,0,0,0,0,0,0,0,0},{9553,307,0,0,0,0,0,0,0}},
-       {9785, 1328, 307, 301, 2005, 9803, 9816, 9819, {9822, 9830, 9838, 2426, 2433, 2441, 9845}, {9853, 9858, 9863, 2469, 2473, 2477, 9867}, {2113, 2486, 2488, 2490, 2488, 2492, 2494}, {7167, 7175, 4899, 2517, 2523, 2527, 2532, 9872, 2544, 2554, 2562, 2571, 0}, {7167, 7175, 4899, 2517, 2523, 2527, 2532, 9872, 2544, 2554, 2562, 2571, 0}, {2580, 2584, 2588, 2592, 2523, 2596, 2600, 2604, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 2624, 268, {1328,5894,0,0,0,0,0,0,0,0,0,0,0,0},{9785,9880,0,0,0,0,0,0},{301,1404,9903,0,0,0,0,0,0,0,0,0},{307,1420,9913,0,0,0,0,0,0}},
-       {3755, 3010, 1420, 1404, 2005, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3010,1347,14,270,9926,9937,1328,0,0,0,0,0,0,0},{3755,9949,9965,0,0,0,0,0},{1404,301,3030,35,0,0,0,0,0,0,0,0},{1420,307,3019,23,0,0,0,0,0}},
-       {10007, 2670, 307, 301, 2005, 55, 3804, 3807, {10025, 10031, 10041, 10047, 10058, 10068, 10073}, {10083, 10087, 10091, 10095, 10100, 10104, 10108}, {2108, 2108, 2113, 10112, 2108, 7409, 7409}, {10115, 10120, 10127, 10132, 10138, 10145, 10153, 10160, 10169, 10176, 10181, 10188, 0}, {10115, 10120, 10127, 10132, 10138, 10145, 10153, 10160, 10169, 10176, 10181, 10188, 0}, {10196, 10200, 3951, 10205, 3920, 10209, 10213, 10217, 10222, 10226, 10230, 10234, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1363,1328,0,0,0,0,0,0,0,0,0,0,0},{10007,5510,0,0,0,0,0,0},{301,0,0,0,0,0,0,0,0,0,0,0},{307,0,0,0,0,0,0,0,0}},
-       {4014, 270, 3019, 3030, 44, 55, 10238, 10243, {10250, 10261, 10268, 10277, 10284, 10297, 10306}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {10315, 10326, 10337, 10346, 10357, 10362, 10369, 10380, 10389, 10400, 10413, 10424, 0}, {10315, 10326, 10337, 10346, 10357, 10362, 10369, 10380, 10389, 10400, 10413, 10424, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {5510, 270, 1420, 1404, 2005, 55, 3804, 3807, {10435, 10442, 10448, 10455, 10460, 10466, 10472}, {10478, 10482, 10486, 10490, 10494, 10498, 10502}, {2486, 2113, 2113, 10506, 4442, 4155, 2113}, {10508, 10516, 10525, 2798, 10531, 2808, 2813, 10535, 2825, 2835, 2843, 10543, 0}, {10508, 10516, 10525, 2798, 10531, 2808, 2813, 10535, 2825, 2835, 2843, 10543, 0}, {2861, 2865, 3951, 2874, 10531, 2878, 2882, 10552, 2890, 2894, 2898, 10556, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {10560, 2670, 1420, 1404, 10578, 4788, 10594, 10599, {10604, 10617, 10636, 10653, 10666, 10679, 10696}, {10709, 8504, 8509, 8514, 8519, 8524, 8529}, {10714, 8537, 8534, 8540, 8543, 8537, 8540}, {10717, 10730, 10741, 10758, 10773, 10788, 10803, 10816, 10831, 10848, 10863, 10880, 0}, {10895, 10906, 10919, 10934, 10947, 10960, 10973, 10984, 10997, 11012, 11025, 11044, 0}, {11057, 11064, 11071, 11078, 11085, 11092, 11099, 11106, 11113, 11120, 11127, 11134, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1363,1328,0,0,0,0,0,0,0,0,0,0,0},{10560,0,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {3755, 2670, 1420, 1404, 2005, 4788, 11141, 11154, {11167, 11182, 11203, 11218, 11231, 11244, 11259}, {520, 525, 11272, 535, 11277, 545, 550}, {555, 558, 11282, 564, 567, 558, 564}, {11285, 11302, 11311, 11326, 11343, 11358, 11373, 11386, 11401, 11418, 11439, 11456, 0}, {11285, 11302, 11311, 11326, 620, 11358, 11373, 11386, 11401, 11418, 11439, 11456, 0}, {11471, 11478, 11485, 11492, 11499, 11506, 11513, 11520, 11527, 11534, 11541, 11548, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 790, 268, {2670,1363,1328,0,0,0,0,0,0,0,0,0,0,0},{3755,0,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {1983, 1996, 1420, 1404, 2005, 2385, 2015, 11555, {11560, 11568, 11579, 11585, 11591, 11600, 2075}, {8999, 9003, 2473, 11606, 9015, 9020, 11610}, {9028, 9030, 1068, 1076, 9034, 9030, 1076}, {2496, 2503, 9440, 2517, 2523, 11614, 11620, 11626, 2544, 2554, 2562, 2571, 0}, {2496, 2503, 9440, 2517, 2523, 11614, 11620, 11626, 2544, 2554, 2562, 2571, 0}, {2580, 2584, 2588, 2592, 2523, 2596, 2600, 11633, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {1996,2926,9345,2670,9544,1363,11637,1328,0,0,0,0,0,0},{1983,2637,2651,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {11648, 11667, 1420, 1404, 11677, 2385, 11693, 11698, {11703, 11714, 11725, 11736, 11747, 11758, 11764}, {2108, 9676, 2488, 4442, 2106, 10506, 2494}, {2108, 9676, 2488, 4442, 2106, 10506, 2494}, {11773, 11781, 11790, 11797, 4910, 11804, 11810, 2537, 2544, 11816, 2562, 11825, 0}, {11773, 11781, 11790, 11797, 4910, 11804, 11810, 2537, 2544, 11816, 2562, 11825, 0}, {11835, 11840, 11790, 2592, 4910, 11804, 11810, 2604, 11846, 2612, 2616, 11851, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {11667,2670,1363,1328,0,0,0,0,0,0,0,0,0,0},{11648,11856,2651,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {11876, 5620, 1420, 1404, 5632, 2385, 11903, 11920, {11934, 11945, 11955, 11964, 11975, 11987, 11998}, {12008, 12011, 12014, 12017, 12020, 12023, 12026}, {2113, 2108, 2490, 2488, 7409, 2108, 2113}, {12029, 12039, 2511, 12050, 12059, 12065, 12073, 12081, 12089, 12100, 12109, 12119, 0}, {12029, 12039, 2511, 12050, 12059, 12065, 12073, 12081, 12089, 12100, 12109, 12119, 0}, {4961, 1288, 2511, 8336, 12059, 12129, 12135, 5858, 4985, 5870, 1318, 5875, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {5620,12141,1328,0,0,0,0,0,0,0,0,0,0,0},{11876,0,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {12151, 1848, 307, 301, 12173, 12188, 12200, 11555, {12206, 12218, 12230, 12242, 12256, 12271, 12284}, {12298, 12011, 12301, 12017, 12304, 12307, 12310}, {2113, 2108, 12314, 2488, 4442, 2108, 9437}, {12316, 12323, 12331, 12337, 12346, 12355, 12365, 12371, 12382, 12392, 12399, 12409, 0}, {12417, 12424, 12432, 12438, 12447, 12456, 12466, 12472, 12483, 12493, 12500, 12510, 0}, {12518, 12524, 12529, 12534, 12539, 12544, 12549, 12555, 12561, 12567, 12573, 12580, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {1848,1328,0,0,0,0,0,0,0,0,0,0,0,0},{12151,0,0,0,0,0,0,0},{301,0,0,0,0,0,0,0,0,0,0,0},{307,0,0,0,0,0,0,0,0}},
-       {3755, 1363, 1420, 1404, 2005, 3796, 12587, 12599, {12611, 12626, 12641, 12656, 12673, 12692, 12703}, {12714, 12721, 12728, 12735, 12742, 12749, 12756}, {0, 0, 0, 0, 0, 0, 0}, {12763, 12774, 8574, 12787, 8596, 12798, 12805, 8621, 12812, 12827, 12840, 12851, 0}, {12763, 12774, 8574, 12787, 8596, 12798, 12805, 8621, 12812, 12827, 12840, 12851, 0}, {12864, 12871, 12878, 12885, 8596, 12798, 12805, 12892, 12899, 12906, 12913, 12920, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 790, 268, {1363,1328,0,0,0,0,0,0,0,0,0,0,0,0},{3755,0,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,0,0,0,0,0,0,0,0}},
-       {3767, 3979, 23, 35, 44, 3796, 12927, 12947, {12964, 12977, 12990, 13006, 13023, 13038, 13047}, {12964, 12977, 12990, 13006, 13023, 13038, 13047}, {13056, 13059, 13062, 13065, 13068, 13071, 13074}, {13077, 13090, 13101, 13110, 13121, 13126, 13135, 13146, 13153, 13168, 13179, 13192, 0}, {13205, 13220, 13101, 13110, 13233, 13126, 13240, 13146, 13153, 13168, 13179, 13192, 0}, {13077, 13090, 13101, 13110, 13121, 13126, 13135, 13146, 13153, 13168, 13179, 13192, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 266, 268, {3979,3970,0,0,0,0,0,0,0,0,0,0,0,0},{3767,4000,0,0,0,0,0,0},{35,301,0,0,0,0,0,0,0,0,0,0},{23,307,0,0,0,0,0,0,0}},
-       {5510, 270, 3019, 3030, 2005, 55, 13253, 13256, {13259, 13272, 13282, 13291, 13301, 13312, 13323}, {13335, 13338, 13343, 13348, 13353, 13358, 13363}, {13335, 13368, 13371, 13374, 13377, 13380, 13383}, {13386, 13399, 13410, 13420, 13431, 13443, 13455, 13468, 13480, 13493, 13508, 13529, 0}, {13386, 13399, 13410, 13420, 13431, 13443, 13455, 13468, 13480, 13493, 13508, 13529, 0}, {13548, 13554, 13560, 13566, 13572, 13578, 13584, 13590, 13596, 13602, 13609, 13616, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 266, 268, {270,14,1354,2374,1328,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {13623, 2670, 1420, 1404, 44, 4788, 13636, 13644, {13652, 13665, 13686, 13705, 13726, 13745, 13758}, {13769, 13776, 13783, 13790, 13797, 13804, 13811}, {0, 0, 0, 0, 0, 0, 0}, {13818, 13833, 13848, 13857, 13868, 13879, 13892, 13905, 13920, 13939, 13958, 13975, 0}, {13818, 13833, 13848, 13857, 13868, 13879, 13892, 13905, 13920, 13939, 13958, 13975, 0}, {13994, 14001, 14008, 14015, 14022, 14029, 14036, 14043, 14050, 14057, 14064, 14071, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1363,14078,270,14088,3743,1328,0,0,0,0,0,0,0},{13623,2992,14099,5510,14118,14129,14141,14158},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {3755, 2670, 1420, 1404, 2005, 4788, 0, 0, {14176, 14182, 14196, 14219, 14233, 14249, 14256}, {14265, 14268, 14273, 14279, 14283, 7409, 14288}, {251, 239, 241, 243, 245, 247, 249}, {14292, 14299, 10127, 14306, 3920, 14312, 14318, 14324, 14331, 14340, 14348, 14355, 0}, {14292, 14299, 10127, 14306, 3920, 14312, 14318, 14324, 14331, 14340, 14348, 14355, 0}, {14362, 7848, 2588, 2592, 14366, 14370, 14374, 14378, 14382, 2612, 14386, 14390, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 790, 268, {2670,1363,2926,14,1328,0,0,0,0,0,0,0,0,0},{3755,5510,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {14394, 1837, 1420, 301, 14421, 3796, 3804, 3807, {14437, 14445, 14456, 14466, 14477, 14486, 14495}, {14505, 14508, 14511, 14514, 14517, 14520, 14523}, {14526, 2486, 12314, 2494, 12314, 2490, 14526}, {14528, 14538, 14546, 14554, 14562, 14570, 14577, 14585, 14593, 14600, 14606, 14613, 0}, {14528, 14538, 14546, 14554, 14562, 14570, 14577, 14585, 14593, 14600, 14606, 14613, 0}, {14621, 14625, 2588, 14629, 4910, 14633, 14637, 14641, 14645, 14649, 14653, 14657, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {1837,1328,0,0,0,0,0,0,0,0,0,0,0,0},{14394,0,0,0,0,0,0,0},{301,0,0,0,0,0,0,0,0,0,0,0},{1420,307,1428,0,0,0,0,0,0}},
-       {14099, 2670, 307, 301, 2005, 55, 14661, 14682, {14699, 430, 451, 8443, 14712, 14729, 14740}, {14753, 14761, 14769, 14775, 14783, 14791, 14799}, {555, 558, 561, 564, 567, 558, 564}, {14807, 583, 600, 609, 14822, 14829, 14838, 641, 654, 673, 690, 705, 0}, {14807, 583, 600, 609, 14822, 14829, 14838, 641, 654, 673, 690, 705, 0}, {14847, 14855, 14863, 738, 14822, 14871, 14879, 746, 754, 764, 772, 14887, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1363,1328,0,0,0,0,0,0,0,0,0,0,0},{14099,0,0,0,0,0,0,0},{301,0,0,0,0,0,0,0,0,0,0,0},{307,0,0,0,0,0,0,0,0}},
-       {5510, 1837, 23, 35, 2005, 55, 0, 0, {14899, 14906, 14917, 14926, 14935, 14942, 14953}, {14963, 14967, 14971, 14975, 14979, 14982, 14986}, {0, 0, 0, 0, 0, 0, 0}, {14990, 15000, 15009, 15017, 15026, 15039, 15051, 15058, 15065, 15072, 15082, 15094, 0}, {14990, 15000, 15009, 15017, 15026, 15039, 15051, 15058, 15065, 15072, 15082, 15094, 0}, {15107, 15111, 15115, 15119, 15123, 15127, 15131, 15135, 15139, 15143, 15147, 15151, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1837,1880,1328,0,0,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{35,3030,301,0,0,0,0,0,0,0,0,0},{23,3019,307,0,0,0,0,0,0}},
-       {5510, 1837, 23, 35, 2005, 55, 0, 0, {15155, 15160, 15166, 15176, 15188, 15196, 15207}, {15216, 15220, 15224, 15228, 15232, 15236, 15240}, {0, 0, 0, 0, 0, 0, 0}, {15244, 15254, 15264, 15271, 15278, 2808, 15283, 15290, 15297, 15306, 15314, 15322, 0}, {15244, 15254, 15264, 15271, 15278, 2808, 15283, 15290, 15297, 15306, 15314, 15322, 0}, {2861, 2865, 14986, 15330, 15334, 2878, 2882, 15338, 2890, 2894, 2898, 15342, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1837,1880,1328,0,0,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{35,3030,301,0,0,0,0,0,0,0,0,0},{23,3019,307,0,0,0,0,0,0}},
-       {5510, 1837, 23, 35, 2005, 55, 3804, 3807, {15346, 15352, 15363, 15176, 15373, 15196, 15207}, {15382, 15386, 15390, 15228, 15232, 15236, 15240}, {2113, 2486, 15394, 2488, 2113, 5718, 2486}, {15396, 15406, 15417, 15424, 15433, 15439, 15445, 15453, 15461, 15472, 15482, 15491, 0}, {15500, 15254, 15509, 15515, 15278, 2808, 15283, 15290, 15522, 15306, 15314, 15322, 0}, {2861, 2865, 15532, 2874, 15334, 2878, 2882, 15338, 2890, 2894, 2898, 15342, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1837,1880,1328,0,0,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{35,3030,301,0,0,0,0,0,0,0,0,0},{23,3019,307,0,0,0,0,0,0}},
-       {5510, 1837, 23, 35, 2005, 55, 15536, 15540, {15544, 15551, 15559, 15567, 15576, 15586, 15593}, {2754, 8226, 2760, 15602, 2766, 15605, 2772}, {2113, 2486, 2775, 3895, 2775, 4157, 2113}, {15608, 15617, 15627, 2798, 10531, 15633, 15639, 15645, 2825, 2835, 2843, 10543, 0}, {15608, 15617, 15627, 2798, 10531, 15633, 15639, 15645, 2825, 2835, 2843, 10543, 0}, {2861, 2865, 3951, 2874, 10531, 2878, 2882, 2886, 2890, 2894, 2898, 10556, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1837,1880,1328,15654,0,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{35,3030,301,0,0,0,0,0,0,0,0,0},{23,3019,307,0,0,0,0,0,0}},
-       {15666, 2670, 1420, 1404, 2005, 15698, 15704, 15720, {15742, 15758, 15783, 15811, 15839, 15867, 15895}, {15914, 15924, 15934, 15944, 15954, 15964, 15974}, {15984, 15988, 15992, 15988, 15996, 16000, 16004}, {16008, 16030, 16058, 16074, 16093, 16109, 16128, 16144, 16166, 16197, 16225, 16250, 0}, {16008, 16030, 16058, 16074, 16093, 16109, 16128, 16144, 16166, 16197, 16225, 16250, 0}, {16278, 16288, 16298, 16308, 16318, 16328, 16338, 16348, 16358, 16368, 16378, 16388, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1363,2926,14,1328,0,0,0,0,0,0,0,0,0},{15666,0,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {1983, 2374, 307, 301, 2005, 2385, 16398, 16403, {5913, 16408, 16419, 16429, 16439, 16449, 16463}, {5999, 6003, 16475, 16480, 16484, 16489, 16494}, {2113, 2486, 2488, 2486, 5718, 2492, 2494}, {2496, 2503, 4899, 6055, 4910, 2527, 2532, 2537, 2544, 2554, 2562, 6099, 0}, {2496, 2503, 4899, 6055, 4910, 2527, 2532, 2537, 2544, 2554, 2562, 6099, 0}, {2580, 2584, 2588, 2592, 4910, 2596, 2600, 2604, 2608, 2612, 2616, 6129, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 2624, 268, {2374,1354,1328,0,0,0,0,0,0,0,0,0,0,0},{1983,0,0,0,0,0,0,0},{301,5006,0,0,0,0,0,0,0,0,0,0},{307,6460,0,0,0,0,0,0,0}},
-       {5510, 2374, 307, 301, 44, 55, 16498, 16526, {16548, 16567, 16586, 16608, 16627, 16661, 16686}, {16705, 16716, 16727, 16741, 16752, 16763, 16780}, {16791, 16795, 16802, 16809, 16816, 16823, 16830}, {16834, 16850, 16866, 16882, 16901, 16908, 16918, 16934, 16950, 16972, 16994, 17013, 0}, {16834, 16850, 16866, 16882, 16901, 16908, 16918, 16934, 16950, 16972, 16994, 17013, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {2374,1354,2335,2926,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,1951,1943,0,0,0,0,0,0,0,0},{307,1420,1971,1960,0,0,0,0,0}},
-       {17035, 270, 307, 301, 2005, 17059, 17072, 17075, {17078, 17087, 17096, 17106, 17116, 17126, 17138}, {17146, 17151, 17155, 17159, 17163, 17168, 17173}, {17177, 2488, 2488, 9676, 17177, 17180, 2113}, {17183, 17190, 17195, 2798, 17201, 17207, 17214, 17220, 17228, 17238, 17246, 17255, 0}, {17183, 17190, 17195, 2798, 17201, 17207, 17214, 17220, 17228, 17238, 17246, 17255, 0}, {2861, 17265, 3951, 2874, 17269, 17273, 17278, 17282, 17286, 17290, 2898, 17294, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,1328,17299,7079,3010,0,0,0,0,0,0,0,0,0},{17035,17308,9937,0,0,0,0,0},{301,3030,1404,35,0,0,0,0,0,0,0,0},{307,3019,1420,23,0,0,0,0,0}},
-       {17326, 2670, 307, 301, 2005, 17344, 17358, 17363, {17368, 17380, 17391, 17405, 17417, 17427, 17437}, {17448, 17453, 17458, 17463, 17468, 17473, 17478}, {2113, 4157, 2486, 6251, 2775, 15394, 2494}, {17483, 17500, 17513, 17527, 17540, 17553, 17566, 17580, 17592, 17606, 17620, 17634, 0}, {17483, 17500, 17513, 17527, 17540, 17553, 17566, 17580, 17592, 17606, 17620, 17634, 0}, {17647, 17654, 17659, 17664, 17668, 17673, 17678, 17683, 17688, 17695, 17700, 17706, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {2670,1363,2926,1328,0,0,0,0,0,0,0,0,0,0},{17326,0,0,0,0,0,0,0},{301,1404,5006,0,0,0,0,0,0,0,0,0},{307,1420,6460,0,0,0,0,0,0}},
-       {3755, 270, 307, 301, 2005, 55, 973, 978, {17711, 17725, 17735, 17746, 17760, 17771, 17782}, {17795, 17800, 17805, 17812, 17818, 17824, 17830}, {2775, 2494, 2486, 7409, 2775, 12314, 2113}, {17835, 17843, 17851, 17858, 17867, 17877, 17887, 17893, 17901, 17916, 17934, 17942, 0}, {17835, 17843, 17851, 17858, 17867, 17877, 17887, 17893, 17901, 17916, 17934, 17942, 0}, {17950, 17954, 17851, 17960, 17964, 17969, 17887, 17975, 17980, 17987, 17994, 17999, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,14,1347,2926,1328,0,0,0,0,0,0,0,0,0},{3755,5510,9937,9926,0,0,0,0},{301,1404,0,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {5510, 270, 1420, 1404, 2005, 55, 18004, 18007, {18011, 18016, 10448, 10455, 18022, 18029, 10472}, {18036, 18040, 10486, 10490, 18044, 10498, 10502}, {12314, 14526, 2113, 10506, 4442, 4155, 2113}, {10508, 10516, 18048, 2798, 10531, 2878, 18052, 18058, 2825, 2835, 2843, 18063, 0}, {10508, 10516, 18048, 2798, 10531, 2878, 18052, 18058, 2825, 2835, 2843, 18063, 0}, {2861, 2865, 18048, 2874, 10531, 2878, 2882, 18058, 2890, 2894, 2898, 15342, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {18072, 2670, 1420, 1404, 2005, 4788, 0, 0, {18090, 18105, 18122, 18139, 18154, 18171, 18180}, {18191, 18197, 18203, 18209, 18215, 18221, 18227}, {239, 0, 0, 245, 247, 249, 251}, {18233, 18246, 18257, 18270, 18281, 18292, 18305, 18316, 18327, 18344, 18355, 18368, 0}, {18233, 18387, 18257, 18270, 18281, 18292, 18305, 18316, 18327, 18344, 18355, 18368, 0}, {18398, 18406, 18414, 18422, 18430, 18438, 18446, 18454, 18462, 18470, 18478, 18486, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 790, 268, {2670,1363,2926,14,1328,0,0,0,0,0,0,0,0,0},{18072,18496,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {18515, 1363, 1420, 1404, 18535, 4788, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {1363,1328,0,0,0,0,0,0,0,0,0,0,0,0},{18515,0,0,0,0,0,0,0},{1404,0,0,0,0,0,0,0,0,0,0,0},{1420,0,0,0,0,0,0,0,0}},
-       {3767, 3787, 3019, 3030, 44, 3796, 18551, 18559, {18567, 18576, 18585, 18593, 18602, 18611, 18618}, {18627, 18630, 18633, 18636, 18639, 18643, 18646}, {241, 243, 245, 247, 12314, 14526, 239}, {10508, 10516, 18649, 18655, 10531, 2808, 18052, 18662, 15297, 18669, 15314, 18676, 0}, {10508, 10516, 18649, 18655, 10531, 2808, 18052, 18662, 15297, 18669, 15314, 18676, 0}, {2861, 2865, 18048, 2874, 10531, 2878, 2882, 18684, 2890, 2894, 2898, 10556, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3787,3963,3970,3979,1880,1328,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {18688, 18706, 307, 301, 2005, 18717, 0, 0, {18724, 18739, 18754, 18769, 18786, 18803, 18812}, {18823, 18830, 18837, 18844, 18851, 18858, 18865}, {18872, 18875, 8540, 8543, 8537, 18878, 18881}, {12763, 12774, 8574, 12787, 8596, 12798, 12805, 8621, 12812, 12827, 12840, 12851, 0}, {12763, 12774, 8574, 12787, 8596, 12798, 12805, 8621, 12812, 12827, 12840, 12851, 0}, {12864, 12871, 12878, 12885, 8596, 12798, 12805, 12892, 12899, 12906, 12913, 12920, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {18706,1363,2926,14,1328,0,0,0,0,0,0,0,0,0},{18688,3755,5510,0,0,0,0,0},{301,1404,0,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {5510, 1354, 6460, 5006, 44, 55, 18884, 18912, {18934, 18953, 18972, 18997, 19016, 19050, 19075}, {19094, 19104, 19114, 19130, 19140, 19165, 19181}, {19191, 19195, 19202, 19206, 19213, 19220, 19227}, {19231, 19259, 19293, 19309, 19328, 19335, 19345, 19361, 19377, 19408, 19430, 19452, 0}, {19231, 19259, 19293, 19309, 19328, 19335, 19345, 19361, 19377, 19408, 19430, 19452, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 2624, 268, {1354,2335,2926,2374,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{5006,2350,19477,19486,0,0,0,0,0,0,0,0},{6460,2366,19494,19506,0,0,0,0,0}},
-       {10007, 1354, 1971, 1951, 44, 55, 19517, 19549, {19581, 19597, 19616, 19638, 19657, 19676, 19704}, {19732, 19740, 19751, 19765, 19776, 19787, 19804}, {19818, 19822, 19829, 19836, 19846, 19853, 19866}, {19873, 19889, 19908, 19921, 19940, 19947, 19957, 19973, 19986, 20002, 20021, 20037, 0}, {19873, 19889, 19908, 19921, 19940, 19947, 19957, 19973, 19986, 20002, 20021, 20037, 0}, {239, 241, 243, 245, 19940, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {1354,2335,2926,2374,1328,0,0,0,0,0,0,0,0,0},{10007,3755,0,0,0,0,0,0},{1951,1943,1404,301,0,0,0,0,0,0,0,0},{1971,1960,1420,307,0,0,0,0,0}},
-       {5510, 1354, 307, 301, 44, 55, 20053, 20094, {20135, 20154, 20173, 20195, 20214, 20236, 20261}, {20280, 20290, 20300, 20313, 20323, 20336, 20352}, {20362, 20366, 20373, 20380, 20387, 20394, 20401}, {20405, 20433, 20461, 20477, 20496, 20503, 20513, 20529, 20545, 20573, 20595, 20617, 0}, {20405, 20433, 20461, 20477, 20496, 20503, 20513, 20529, 20545, 20573, 20595, 20617, 0}, {20642, 20661, 20461, 20477, 20496, 20503, 20513, 20529, 20680, 20696, 20712, 20722, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {1354,2335,2926,2374,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,1951,1943,0,0,0,0,0,0,0,0},{307,1420,1971,1960,0,0,0,0,0}},
-       {5510, 1354, 307, 301, 44, 55, 7860, 20735, {20738, 20757, 20776, 20801, 20820, 20842, 20867}, {20886, 20896, 20906, 20922, 20932, 20945, 20961}, {20971, 20975, 20982, 20986, 20993, 21000, 21007}, {21011, 21033, 21064, 21086, 21105, 21112, 21122, 21138, 21154, 21185, 21207, 21229, 0}, {21011, 21033, 21064, 21086, 21105, 21112, 21122, 21138, 21154, 21185, 21207, 21229, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {1354,2335,2926,2374,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,1951,1943,0,0,0,0,0,0,0,0},{307,1420,1971,1960,0,0,0,0,0}},
-       {5510, 2374, 307, 301, 2005, 55, 21254, 21279, {21304, 21323, 21345, 21370, 21386, 21408, 21427}, {21437, 21444, 21451, 21458, 21465, 21472, 21479}, {21437, 21444, 21451, 21458, 21465, 21472, 21479}, {21483, 21499, 21524, 21543, 21562, 21569, 21582, 21595, 21614, 21645, 21670, 21692, 0}, {21483, 21499, 21524, 21543, 21562, 21569, 21582, 21717, 21614, 21645, 21670, 21692, 0}, {21736, 21744, 21758, 21772, 21562, 21569, 21582, 21783, 21791, 21805, 21816, 21824, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {2374,1354,2335,2926,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,1951,1943,0,0,0,0,0,0,0,0},{307,1420,1971,1960,0,0,0,0,0}},
-       {5510, 1354, 307, 301, 44, 55, 21835, 21866, {21891, 21913, 21935, 21960, 21982, 22007, 22035}, {22057, 22067, 22077, 22090, 22100, 22113, 22129}, {22139, 22143, 22150, 22154, 22161, 22168, 22175}, {22179, 22195, 22220, 22239, 22261, 22268, 22281, 22294, 22313, 22344, 22369, 22388, 0}, {22179, 22195, 22220, 22239, 22261, 22268, 22281, 22294, 22313, 22344, 22369, 22388, 0}, {22413, 22420, 243, 22436, 22261, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {1354,2335,2926,2374,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,1951,1943,0,0,0,0,0,0,0,0},{307,1420,1971,1960,0,0,0,0,0}},
-       {5510, 1354, 307, 301, 44, 55, 3804, 3807, {22452, 22471, 22490, 22512, 22531, 22553, 22578}, {22597, 22602, 22610, 22618, 22626, 22634, 22642}, {22653, 22657, 22664, 22671, 22678, 22685, 22692}, {22696, 22712, 22737, 22756, 22778, 22785, 22798, 22811, 22830, 22858, 22883, 22905, 0}, {22696, 22712, 22737, 22756, 22778, 22785, 22798, 22811, 22830, 22858, 22883, 22905, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {1354,2335,2926,2374,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,1951,1943,0,0,0,0,0,0,0,0},{307,1420,1971,1960,0,0,0,0,0}},
-       {5510, 1354, 6460, 5006, 44, 55, 22930, 22949, {22980, 23005, 23036, 23064, 23089, 23117, 23151}, {23176, 23195, 23220, 23236, 23255, 23274, 23293}, {23303, 23310, 23317, 23324, 23331, 23344, 23351}, {23355, 23374, 23402, 23430, 23455, 23468, 23484, 23497, 23522, 23559, 23587, 23609, 0}, {23355, 23374, 23402, 23430, 23455, 23468, 23484, 23497, 23522, 23559, 23587, 23609, 0}, {23634, 23644, 23663, 23679, 23455, 23468, 23484, 23695, 23702, 23727, 23743, 23753, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {1354,2335,2926,2374,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{5006,2350,19477,19486,0,0,0,0,0,0,0,0},{6460,2366,19494,19506,0,0,0,0,0}},
-       {23766, 2374, 1960, 1943, 23785, 55, 23793, 23821, {23843, 23862, 23881, 23906, 23925, 23959, 23984}, {24003, 19104, 19114, 19130, 24013, 24038, 19181}, {0, 0, 0, 0, 0, 0, 0}, {24054, 24079, 24110, 24126, 19328, 19335, 19345, 24145, 24161, 24192, 24214, 24236, 0}, {24054, 24079, 24110, 24126, 19328, 19335, 19345, 24145, 24161, 24192, 24214, 24236, 0}, {24261, 24274, 24110, 24126, 19328, 19335, 19345, 24293, 24300, 24316, 24332, 24342, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {2374,0,0,0,0,0,0,0,0,0,0,0,0,0},{23766,0,0,0,0,0,0,0},{1943,1951,0,0,0,0,0,0,0,0,0,0},{1960,1971,0,0,0,0,0,0,0}},
-       {5510, 2374, 307, 301, 44, 55, 3804, 3807, {16548, 16567, 24355, 16608, 24377, 16661, 16686}, {24399, 24409, 24419, 24432, 24442, 24455, 24471}, {16791, 16795, 16802, 16809, 16816, 16823, 16830}, {24481, 24506, 16866, 24537, 24556, 16908, 24563, 24576, 24592, 24617, 24639, 24667, 0}, {24481, 24506, 16866, 24537, 24556, 16908, 24563, 24576, 24592, 24617, 24639, 24667, 0}, {24689, 24702, 16866, 24721, 24556, 16908, 24563, 24737, 24744, 257, 24766, 24788, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {2374,1354,2335,2926,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,1951,1943,0,0,0,0,0,0,0,0},{307,1420,1971,1960,0,0,0,0,0}},
-       {24804, 24825, 1420, 1404, 24834, 4788, 0, 0, {24851, 24858, 24869, 24882, 24895, 24906, 24919}, {24930, 24935, 24940, 24945, 24950, 24955, 24960}, {0, 0, 0, 0, 0, 0, 0}, {24965, 24980, 24989, 24996, 25009, 25016, 25027, 25036, 25045, 25052, 25063, 25074, 0}, {24965, 24980, 24989, 24996, 25009, 25016, 25027, 25036, 25045, 25052, 25063, 25074, 0}, {25085, 25092, 25099, 25106, 25113, 25120, 25127, 25134, 25141, 25148, 25155, 25162, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 790, 268, {24825,1328,0,0,0,0,0,0,0,0,0,0,0,0},{24804,0,0,0,0,0,0,0},{1404,0,0,0,0,0,0,0,0,0,0,0},{1420,0,0,0,0,0,0,0,0}},
-       {25169, 1467, 307, 301, 25212, 25219, 25245, 25267, {25292, 25320, 25348, 25385, 25416, 25450, 25475}, {25509, 25525, 25541, 25566, 25585, 25607, 25626}, {25648, 25655, 25662, 25669, 25676, 25683, 25687}, {25697, 25731, 25768, 25802, 25836, 25867, 25904, 25941, 25981, 26015, 26049, 26098, 0}, {25697, 25731, 25768, 25802, 25836, 25867, 25904, 25941, 25981, 26015, 26049, 26098, 0}, {26147, 26160, 26173, 26186, 26199, 26212, 26225, 26238, 26251, 26264, 26280, 26296, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1467,1819,1828,1848,1328,1837,1859,1866,1873,0,0,0,0,0},{25169,26312,0,0,0,0,0,0},{301,0,0,0,0,0,0,0,0,0,0,0},{307,0,0,0,0,0,0,0,0}},
-       {5510, 270, 307, 301, 2005, 55, 0, 0, {26360, 26369, 26379, 26391, 26404, 26413, 26425}, {26437, 26441, 26446, 26450, 26454, 26458, 26462}, {2113, 2494, 2486, 2486, 14526, 6251, 2113}, {26466, 26473, 26482, 26489, 2804, 26496, 26504, 26515, 26520, 26525, 26532, 26541, 0}, {26466, 26473, 26482, 26489, 2804, 26496, 26549, 26515, 26520, 26525, 26532, 26541, 0}, {26559, 26563, 26446, 26568, 2804, 26572, 26576, 26515, 26520, 26580, 26584, 26589, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 0, 266, 268, {270,14,1347,2926,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,35,3030,0,0,0,0,0,0,0,0},{307,1420,23,3019,0,0,0,0,0}},
-       {3755, 1328, 307, 26594, 26602, 26637, 26673, 26689, {26705, 26739, 26770, 26801, 26823, 26866, 26894}, {26919, 26926, 26930, 26934, 26941, 26951, 26958}, {0, 0, 0, 0, 0, 0, 0}, {26962, 26975, 26994, 27007, 27020, 27033, 27052, 27071, 27084, 27100, 27113, 27138, 0}, {26962, 26975, 26994, 27007, 27020, 27033, 27052, 27071, 27084, 27100, 27113, 27138, 0}, {27151, 27155, 27159, 27163, 27167, 27171, 27175, 27179, 27183, 27187, 27194, 27201, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {1328,0,0,0,0,0,0,0,0,0,0,0,0,0},{3755,9949,0,0,0,0,0,0},{26594,0,0,0,0,0,0,0,0,0,0,0},{307,0,0,0,0,0,0,0,0}},
-       {5510, 270, 307, 26594, 2005, 55, 27208, 27233, {27258, 27283, 27302, 27330, 27349, 27374, 27393}, {27415, 27423, 27428, 27433, 27438, 27446, 27454}, {0, 0, 0, 0, 0, 0, 0}, {27459, 27478, 27494, 27507, 27520, 27542, 27561, 27583, 27599, 27615, 27628, 27644, 0}, {27459, 27478, 27494, 27507, 27520, 27542, 27561, 27583, 27599, 27615, 27628, 27644, 0}, {27660, 27669, 27678, 27690, 27700, 27709, 27721, 27730, 27739, 27748, 27757, 27766, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,1328,0,0,0,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{26594,0,0,0,0,0,0,0,0,0,0,0},{307,0,0,0,0,0,0,0,0}},
-       {4028, 270, 1420, 1404, 4057, 55, 973, 978, {27775, 27783, 27788, 27795, 27805, 27811, 27818}, {27826, 27830, 3951, 27834, 27839, 27843, 27847}, {2775, 2494, 2486, 2486, 4153, 4157, 2113}, {27852, 27860, 6270, 27869, 27875, 27880, 27886, 6304, 27892, 27901, 27909, 27918, 0}, {27852, 27860, 6270, 27869, 27875, 27880, 27886, 6304, 27892, 27901, 27909, 27918, 0}, {27927, 2865, 3951, 27931, 2804, 27935, 27940, 18684, 17286, 27944, 2898, 3959, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,14,1339,1347,1354,1363,1328,0,0,0,0,0,0,0},{4028,4254,4281,0,0,0,0,0},{1404,301,35,1409,0,0,0,0,0,0,0,0},{1420,307,23,1428,0,0,0,0,0}},
-       {5510, 2374, 307, 301, 44, 55, 27948, 27960, {27972, 16567, 28000, 16608, 24377, 16661, 16686}, {24399, 24409, 24419, 24432, 24442, 24455, 24471}, {0, 0, 0, 0, 0, 0, 0}, {24481, 24506, 16866, 24537, 24556, 16908, 24563, 28019, 28035, 28063, 24639, 24667, 0}, {24481, 24506, 16866, 24537, 24556, 16908, 24563, 28019, 28035, 28063, 24639, 24667, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {2374,1354,2335,2926,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,1951,1943,0,0,0,0,0,0,0,0},{307,1420,1971,1960,0,0,0,0,0}},
-       {28085, 1328, 3019, 3030, 28133, 3796, 28143, 28155, {28164, 28180, 28196, 28224, 28240, 28283, 28308}, {28336, 28346, 28356, 28363, 28373, 28389, 28402}, {28412, 28416, 28420, 28424, 28428, 28441, 28448}, {28455, 28474, 28499, 28518, 28543, 28556, 28569, 28582, 28604, 28638, 28663, 28691, 0}, {28455, 28474, 28499, 28518, 28543, 28556, 28569, 28582, 28604, 28638, 28663, 28691, 0}, {28719, 28726, 28736, 28518, 28543, 28556, 28569, 28749, 28759, 28772, 28782, 28795, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 2624, 268, {1328,1837,1880,270,14,0,0,0,0,0,0,0,0,0},{28085,0,0,0,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {28808, 3010, 3019, 3030, 2005, 28840, 28854, 28864, {28877, 28887, 28894, 28907, 28917, 28927, 28937}, {28877, 28887, 28947, 28907, 28917, 28927, 28937}, {28957, 28961, 28965, 28969, 28973, 28977, 28981}, {28985, 29001, 29017, 29027, 29040, 29047, 29054, 29064, 29077, 29096, 29115, 29131, 0}, {28985, 29001, 29017, 29027, 29040, 29047, 29054, 29064, 29077, 29096, 29115, 29131, 0}, {29147, 29157, 29017, 29167, 29040, 29047, 29054, 29177, 29187, 29197, 29207, 29217, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3010,1328,0,0,0,0,0,0,0,0,0,0,0,0},{28808,0,0,0,0,0,0,0},{3030,0,0,0,0,0,0,0,0,0,0,0},{3019,0,0,0,0,0,0,0,0}},
-       {4014, 2374, 1420, 1404, 44, 55, 29227, 29237, {29250, 29257, 29263, 29270, 29276, 29282, 29290}, {29300, 29304, 29308, 29312, 29316, 29320, 29324}, {12314, 12314, 12314, 12314, 12314, 12314, 12314}, {29330, 29339, 29348, 29353, 29359, 29365, 29371, 29378, 29384, 29393, 29402, 29410, 0}, {29330, 29339, 29348, 29353, 29359, 29365, 29371, 29378, 29384, 29393, 29402, 29410, 0}, {29419, 29423, 3951, 29427, 3920, 29431, 29435, 29439, 29444, 29448, 29454, 29458, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {2374,1354,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{1404,301,29462,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {3767, 3787, 3019, 3030, 29468, 3796, 29478, 29519, {29560, 29579, 29598, 29623, 29642, 29664, 29689}, {29708, 24409, 29718, 24432, 29734, 24455, 24471}, {29747, 29751, 29755, 29759, 29763, 29767, 29771}, {16834, 29775, 16866, 29803, 24556, 29822, 16918, 16934, 29832, 29863, 29885, 29910, 0}, {16834, 29775, 16866, 29803, 24556, 29822, 16918, 16934, 29832, 29863, 29885, 29910, 0}, {29935, 29942, 16866, 29952, 24556, 29822, 29968, 29981, 29988, 30004, 30020, 30033, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3787,3963,3970,3979,1880,1328,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {270, 14, 3019, 3030, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {30046, 30053, 30062, 30077, 30088, 30097, 30104, 30111, 30118, 30129, 30142, 30155, 0}, {30046, 30053, 30062, 30077, 30088, 30097, 30104, 30111, 30118, 30129, 30142, 30155, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 266, 268, {14,270,0,0,0,0,0,0,0,0,0,0,0,0},{270,1,281,30160,0,0,0,0},{3030,1404,0,0,0,0,0,0,0,0,0,0},{3019,1420,0,0,0,0,0,0,0}},
-       {3767, 3787, 3019, 3030, 44, 3796, 3804, 3807, {30178, 30185, 27788, 30191, 30202, 30210, 30219}, {30226, 27830, 3951, 30230, 30234, 30238, 10502}, {2494, 2494, 2486, 2486, 5718, 15394, 2113}, {30242, 30248, 30256, 27869, 30262, 30267, 30273, 6304, 30279, 30289, 30297, 30307, 0}, {30242, 30248, 30256, 27869, 30262, 30267, 30273, 6304, 30279, 30289, 30297, 30307, 0}, {30317, 30321, 3951, 27931, 3920, 30325, 30329, 18684, 17286, 2894, 30333, 15342, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3787,3963,3970,3979,1880,1328,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {3767, 3010, 3019, 3030, 44, 3796, 0, 0, {30337, 30344, 30352, 30359, 30366, 30374, 30382}, {30389, 30392, 30395, 30398, 30401, 30404, 30407}, {2494, 2494, 2488, 2494, 12314, 4155, 12314}, {30410, 30418, 30428, 30434, 30442, 30447, 30452, 30457, 30464, 18669, 30472, 30480, 0}, {30410, 30418, 30428, 30434, 30442, 30447, 30452, 30457, 30464, 18669, 30472, 30480, 0}, {2861, 30488, 3951, 30492, 3920, 29431, 29435, 30496, 3891, 2894, 30500, 15342, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3010,1347,14,270,1880,1328,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {3767, 3010, 3019, 3030, 44, 3796, 30504, 30515, {30525, 30543, 30558, 30580, 30593, 30607, 30624}, {30648, 30656, 30661, 30580, 30593, 30673, 30680}, {0, 0, 0, 0, 0, 0, 0}, {30694, 30716, 30732, 30752, 30766, 30783, 30798, 30815, 30829, 30842, 30861, 30875, 0}, {30694, 30716, 30732, 30752, 30766, 30783, 30798, 30815, 30829, 30842, 30861, 30875, 0}, {30894, 30909, 30918, 30931, 30938, 30948, 30956, 30966, 30973, 30979, 30991, 30998, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3010,1347,14,270,1880,1328,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {5510, 1837, 23, 35, 2005, 55, 0, 0, {31010, 31018, 14917, 14926, 14935, 31029, 31039}, {15382, 14967, 14971, 14975, 14979, 15236, 31048}, {0, 0, 0, 0, 0, 0, 0}, {31052, 31061, 31071, 31079, 10531, 3924, 31087, 31093, 31102, 31111, 31120, 31129, 0}, {31052, 31061, 31071, 31079, 10531, 3924, 31087, 31093, 31102, 31111, 31120, 31129, 0}, {2861, 2865, 14986, 31138, 10531, 2878, 2882, 18684, 17286, 2894, 31142, 15342, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1837,1880,1328,0,0,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{35,3030,301,0,0,0,0,0,0,0,0,0},{23,3019,307,0,0,0,0,0,0}},
-       {1983, 2374, 307, 301, 2005, 2385, 31146, 31151, {31156, 31163, 31178, 31192, 31208, 31223, 31239}, {6247, 31254, 2588, 31258, 31262, 31266, 31270}, {2113, 12314, 2486, 2108, 2113, 2488, 12314}, {7167, 7175, 31274, 31281, 31288, 2527, 2532, 31293, 31303, 31314, 31323, 31333, 0}, {7167, 7175, 31274, 31281, 31288, 2527, 2532, 31293, 31303, 31314, 31323, 31333, 0}, {2580, 2584, 2588, 2592, 2523, 2596, 2600, 2604, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {2374,1354,1328,2626,0,0,0,0,0,0,0,0,0,0},{1983,2637,0,0,0,0,0,0},{301,1404,0,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {3767, 3010, 3019, 3030, 44, 3796, 31343, 31348, {31353, 31369, 31377, 31385, 31394, 31406, 31416}, {31426, 31432, 31438, 31442, 31446, 31454, 3891}, {0, 0, 0, 0, 0, 0, 0}, {31461, 31474, 31488, 31497, 31503, 31507, 31512, 31520, 15297, 31533, 15314, 15322, 0}, {31461, 31474, 31488, 31497, 31503, 31507, 31512, 31520, 15297, 31533, 15314, 15322, 0}, {31542, 2865, 31546, 15330, 31503, 31550, 2882, 31554, 2890, 31562, 2898, 15342, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3010,1347,14,270,1880,1328,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {31568, 1467, 1420, 1943, 31592, 31609, 31623, 31630, {31637, 31647, 31657, 31667, 31677, 31687, 31697}, {31707, 31714, 31721, 31728, 31735, 31742, 31749}, {31756, 31760, 31764, 31768, 31772, 31776, 31780}, {31784, 31791, 31798, 31805, 31812, 31819, 31826, 31833, 31840, 31847, 31854, 31864, 0}, {31784, 31791, 31798, 31805, 31812, 31819, 31826, 31833, 31840, 31847, 31854, 31864, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1467,1819,1828,1848,1328,1837,0,0,0,0,0,0,0,0},{31568,31874,31904,0,0,0,0,0},{1943,1404,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {4771, 270, 307, 301, 2005, 4788, 0, 0, {26437, 27830, 31934, 31941, 31951, 31956, 31963}, {31970, 4131, 31974, 4862, 31979, 31984, 31989}, {4421, 31994, 31997, 32000, 32003, 32006, 32009}, {32012, 32019, 31934, 32030, 32036, 32040, 32049, 32056, 32061, 32070, 8220, 32075, 0}, {32012, 32019, 31934, 32030, 32036, 32040, 32049, 32056, 32061, 32070, 8220, 32075, 0}, {32081, 32085, 32092, 26568, 32036, 32097, 32102, 32056, 32107, 32070, 8220, 32112, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,14,1363,1354,1328,0,0,0,0,0,0,0,0,0},{4771,4997,3755,0,0,0,0,0},{301,1404,5006,5012,5022,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {32116, 270, 307, 301, 2005, 4788, 0, 0, {32144, 32152, 32159, 32167, 32177, 32185, 1034}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {32196, 32204, 1091, 1097, 4910, 32213, 32218, 1120, 1126, 32225, 1143, 32234, 0}, {32196, 32204, 1091, 1097, 4910, 32213, 32218, 1120, 1126, 32225, 1143, 32234, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,14,1363,1354,1328,0,0,0,0,0,0,0,0,0},{32116,0,0,0,0,0,0,0},{301,1404,5006,5012,5022,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {4771, 270, 307, 301, 2005, 4788, 32243, 32248, {32253, 32261, 32271, 32281, 32290, 32300, 32308}, {32318, 32322, 32327, 32331, 32335, 32339, 32343}, {2113, 2486, 2775, 2486, 2775, 2492, 2113}, {2777, 2784, 2792, 2798, 2804, 2808, 2813, 32347, 32356, 32367, 32376, 32386, 0}, {2777, 2784, 2792, 2798, 2804, 2808, 2813, 32347, 32356, 32367, 32376, 32386, 0}, {2861, 2865, 2869, 2874, 2804, 2878, 2882, 2886, 2890, 2894, 2898, 2902, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,1363,1354,1328,0,0,0,0,0,0,0,0,0},{4771,4997,3755,0,0,0,0,0},{301,1404,5006,5012,5022,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {32396, 32414, 1420, 1404, 32425, 3796, 32441, 32446, {32451, 32476, 32505, 32530, 32543, 32558, 32575}, {32590, 32595, 32600, 32605, 32610, 32615, 8529}, {32620, 32620, 32623, 8540, 8543, 32620, 8540}, {32626, 32645, 32660, 32682, 32702, 32718, 32734, 32748, 32774, 32798, 32815, 32832, 0}, {32626, 32645, 32660, 32682, 32702, 32718, 32734, 32748, 32774, 32798, 32815, 32832, 0}, {32849, 32858, 32867, 32881, 32895, 32907, 32919, 32929, 32945, 32959, 32966, 32973, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {32414,32980,2926,3970,32989,0,0,0,0,0,0,0,0,0},{32396,33000,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {3767, 3787, 3019, 3030, 44, 3796, 0, 0, {33019, 33031, 33042, 33054, 33066, 33076, 33088}, {33103, 33108, 33113, 33118, 33123, 33128, 33133}, {0, 0, 0, 0, 0, 0, 0}, {33138, 33147, 33159, 33167, 33172, 33182, 33189, 33198, 33205, 33211, 33220, 33231, 0}, {33138, 33147, 33159, 33167, 33172, 33182, 33189, 33198, 33205, 33211, 33220, 33231, 0}, {33239, 33244, 33249, 33254, 33259, 33264, 33269, 33123, 33274, 33279, 33284, 33289, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3787,3963,3970,3979,1880,1328,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {5510, 270, 307, 301, 2005, 55, 6031, 6036, {33294, 33307, 33315, 33324, 33334, 33344, 33353}, {33365, 33369, 33373, 33377, 33381, 33385, 33389}, {2775, 2494, 2486, 7409, 12314, 5718, 2113}, {33393, 33407, 33418, 33427, 33438, 33450, 33464, 33476, 33489, 33502, 33514, 33527, 0}, {33393, 33407, 33418, 33427, 33438, 33450, 33464, 33476, 33489, 33502, 33514, 33527, 0}, {33541, 33546, 33552, 33558, 33563, 33569, 33575, 33580, 33586, 33591, 17994, 33597, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 0, 266, 268, {270,14,1347,2926,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,35,3030,0,0,0,0,0,0,0,0},{307,1420,23,3019,0,0,0,0,0}},
-       {1, 14, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 266, 268, {14,270,0,0,0,0,0,0,0,0,0,0,0,0},{1,281,0,0,0,0,0,0},{35,301,0,0,0,0,0,0,0,0,0,0},{23,307,0,0,0,0,0,0,0}},
-       {316, 335, 350, 365, 377, 55, 393, 405, {417, 430, 451, 466, 477, 496, 507}, {520, 525, 530, 535, 540, 545, 550}, {555, 558, 561, 564, 567, 558, 564}, {570, 583, 600, 609, 620, 627, 634, 641, 654, 673, 690, 705, 0}, {570, 583, 600, 609, 620, 627, 634, 641, 654, 673, 690, 705, 0}, {722, 728, 600, 738, 620, 627, 634, 746, 754, 764, 772, 782, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {335,792,808,824,0,0,0,0,0,0,0,0,0,0},{316,841,859,884,0,0,0,0},{365,908,0,0,0,0,0,0,0,0,0,0},{350,919,0,0,0,0,0,0,0}},
-       {933, 270, 307, 301, 959, 55, 973, 978, {983, 992, 1000, 1008, 1017, 1024, 1034}, {1043, 1046, 1049, 1052, 1055, 1058, 1061}, {1064, 1066, 1068, 1070, 1072, 1074, 1076}, {1078, 1084, 1091, 1097, 1103, 1108, 1113, 1120, 1126, 1135, 1143, 1152, 0}, {1161, 1170, 1180, 1189, 1199, 1207, 1215, 1225, 1235, 1247, 1259, 1271, 0}, {1283, 1288, 1091, 1294, 1103, 1108, 1299, 1304, 1308, 1313, 1318, 1323, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,14,1328,1339,1347,1354,1363,0,0,0,0,0,0,0},{933,1372,1388,0,0,0,0,0},{301,1404,1409,0,0,0,0,0,0,0,0,0},{307,1420,1428,0,0,0,0,0,0}},
-       {1445, 1467, 1971, 1951, 1476, 1492, 1505, 1512, {1519, 1529, 1539, 1549, 1559, 1569, 1579}, {33603, 33610, 33617, 33624, 33631, 33638, 33645}, {1638, 1642, 1646, 1650, 1654, 1658, 1662}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1467,1837,1328,0,0,0,0,0,0,0,0,0,0,0},{1445,6634,0,0,0,0,0,0},{1951,1943,301,1404,0,0,0,0,0,0,0,0},{1971,1960,307,1420,0,0,0,0,0}},
-       {1983, 1996, 1420, 1404, 2005, 55, 2015, 2020, {2025, 2033, 2043, 2051, 2059, 2068, 2075}, {2082, 2085, 2088, 2092, 2095, 2099, 2103}, {2106, 2108, 2110, 2113, 2115, 2108, 2113}, {2118, 2124, 2130, 2138, 2144, 2152, 2160, 2170, 2176, 2184, 2192, 2201, 0}, {2210, 2216, 2223, 2231, 2237, 2245, 2253, 2263, 2176, 2269, 2277, 2287, 0}, {2296, 2299, 2302, 2305, 2308, 2311, 2314, 2317, 2320, 2323, 2327, 2331, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {1996,2335,1328,1819,1859,0,0,0,0,0,0,0,0,0},{1983,0,0,0,0,0,0,0},{1404,301,2342,2350,0,0,0,0,0,0,0,0},{1420,307,2355,2366,0,0,0,0,0}},
-       {1983, 2374, 307, 301, 2005, 2385, 2393, 2398, {2403, 2411, 2418, 2426, 2433, 2441, 2448}, {2456, 2461, 2465, 2469, 2473, 2477, 2481}, {2113, 2486, 2488, 2490, 2488, 2492, 2494}, {2496, 2503, 2511, 2517, 2523, 2527, 2532, 2537, 2544, 2554, 2562, 2571, 0}, {2496, 2503, 2511, 2517, 2523, 2527, 2532, 2537, 2544, 2554, 2562, 2571, 0}, {2580, 2584, 2588, 2592, 2523, 2596, 2600, 2604, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 2624, 268, {2374,1354,1328,2626,0,0,0,0,0,0,0,0,0,0},{1983,2637,0,0,0,0,0,0},{301,1404,0,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {2651, 2670, 307, 301, 2005, 55, 2681, 2687, {2694, 2702, 2709, 2718, 2727, 2738, 2746}, {2754, 2757, 2760, 2763, 2766, 2769, 2772}, {2113, 2486, 2775, 2486, 2775, 2492, 2113}, {2777, 2784, 2792, 2798, 2804, 2808, 2813, 2818, 2825, 2835, 2843, 2852, 0}, {2777, 2784, 2792, 2798, 2804, 2808, 2813, 2818, 2825, 2835, 2843, 2852, 0}, {2861, 2865, 2869, 2874, 2804, 2878, 2882, 2886, 2890, 2894, 2898, 2902, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {2670,2906,1363,2918,2926,1996,1328,0,0,0,0,0,0,0},{2651,1983,2933,0,0,0,0,0},{301,1404,2350,2945,0,0,0,0,0,0,0,0},{307,2956,2970,2985,0,0,0,0,0}},
-       {2992, 3010, 3019, 3030, 2005, 55, 3038, 3045, {3052, 3067, 3082, 3093, 3108, 3121, 3140}, {3155, 3162, 3169, 3176, 3183, 3190, 3197}, {3204, 3207, 3210, 3210, 3213, 3213, 3216}, {3219, 3240, 3263, 3278, 3295, 3306, 3321, 3336, 3355, 3378, 3397, 3416, 0}, {3437, 3458, 3481, 3496, 3513, 3524, 3539, 3554, 3573, 3596, 3615, 3634, 0}, {3655, 3662, 3669, 3676, 3683, 3690, 3699, 3708, 3715, 3722, 3729, 3736, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {3010,270,1347,14,3743,1328,0,0,0,0,0,0,0,0},{2992,3755,0,0,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {3767, 3787, 3019, 3030, 44, 3796, 3804, 3807, {3810, 3817, 3824, 3832, 3842, 3851, 3858}, {3867, 3871, 3875, 3879, 3883, 3887, 3891}, {2113, 2486, 2488, 3895, 2488, 2492, 2113}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {2861, 2865, 3951, 2874, 3920, 2878, 2882, 2886, 2890, 3955, 2898, 3959, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3787,3963,3970,3979,1880,1328,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {4303, 1996, 1420, 1404, 2005, 4320, 4332, 4336, {4340, 4352, 4364, 4374, 4388, 4398, 4410}, {4421, 4424, 4427, 4430, 4433, 4436, 4439}, {2113, 2486, 2488, 4442, 2488, 2108, 2494}, {4444, 4453, 4462, 4472, 4481, 4490, 4499, 4509, 4516, 4524, 4532, 4542, 0}, {4551, 4562, 4573, 4585, 4596, 4607, 4618, 4630, 4639, 4649, 4659, 4671, 0}, {4682, 4688, 4694, 4701, 4707, 4713, 4719, 4726, 4730, 4735, 4740, 4747, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {1996,2670,2926,1328,0,0,0,0,0,0,0,0,0,0},{4303,4753,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {4771, 270, 307, 301, 2005, 4788, 3804, 3807, {4795, 4804, 4810, 4816, 4825, 4831, 4840}, {4847, 4852, 4857, 4862, 4867, 4872, 4877}, {2775, 2494, 2486, 2486, 4155, 4157, 2113}, {4882, 4890, 4899, 4904, 4910, 4914, 4919, 4927, 4933, 4943, 1143, 4951, 0}, {4882, 4890, 4899, 4904, 4910, 4914, 4919, 4927, 4933, 4943, 1143, 4951, 0}, {4961, 4967, 4899, 4974, 4910, 4914, 4979, 4927, 4985, 1313, 1318, 4991, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,14,1363,1354,1328,0,0,0,0,0,0,0,0,0},{4771,4997,3755,0,0,0,0,0},{301,1404,5006,5012,5022,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {5030, 270, 307, 301, 2005, 55, 5048, 5061, {5072, 5090, 5104, 5122, 5140, 5158, 5174}, {5188, 5200, 5212, 5224, 5236, 5248, 5260}, {5267, 5270, 5273, 5276, 5279, 5282, 5285}, {5288, 5299, 5312, 5319, 5330, 5337, 5346, 5355, 5368, 5381, 5396, 5409, 0}, {5288, 5299, 5312, 5319, 5330, 5337, 5346, 5355, 5368, 5381, 5396, 5409, 0}, {5420, 5429, 5312, 5438, 5330, 5447, 5456, 5465, 5474, 5483, 5492, 5501, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,5510,14,1,1354,2374,5523,1328,5536,5553,0,0,0,0},{5030,5510,5563,5585,5536,0,0,0},{301,35,0,0,0,0,0,0,0,0,0,0},{307,23,0,0,0,0,0,0,0}},
-       {5606, 5620, 1420, 1404, 5632, 5643, 5651, 5655, {5659, 5669, 5677, 5682, 5689, 5702, 5710}, {4157, 5718, 4442, 5720, 5724, 2108, 5727}, {4157, 5718, 4442, 5731, 5724, 2108, 5731}, {5734, 5742, 5751, 5760, 5769, 5776, 5784, 5792, 5802, 5813, 2562, 2571, 0}, {5734, 5742, 5751, 5760, 5769, 5776, 5784, 5792, 5802, 5813, 2562, 2571, 0}, {5822, 1288, 5827, 5834, 5840, 5846, 5852, 5858, 5863, 5870, 1318, 5875, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {5620,5880,1328,5894,0,0,0,0,0,0,0,0,0,0},{5606,0,0,0,0,0,0,0},{1404,301,3030,0,0,0,0,0,0,0,0,0},{1420,307,3019,0,0,0,0,0,0}},
-       {1983, 1996, 307, 301, 2005, 2385, 5903, 5908, {5913, 5924, 5935, 5949, 5963, 5975, 5987}, {5999, 6003, 6008, 6013, 6018, 6022, 6027}, {1076, 6031, 6033, 6031, 6036, 6036, 1066}, {6038, 6046, 4899, 6055, 6062, 6067, 6074, 6081, 2544, 5813, 6089, 6099, 0}, {6038, 6046, 4899, 6055, 6062, 6067, 6074, 6081, 2544, 5813, 6089, 6099, 0}, {2580, 2584, 2588, 2592, 6062, 6108, 6113, 6118, 2608, 2612, 6124, 6129, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {1996,1363,6133,6145,1328,6158,0,0,0,0,0,0,0,0},{1983,2637,0,0,0,0,0,0},{301,1404,0,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {4771, 270, 307, 301, 2005, 55, 6167, 6170, {6173, 6182, 6190, 6199, 6210, 6219, 6228}, {4127, 4131, 2588, 6235, 6239, 6243, 6247}, {2775, 2494, 2486, 2486, 6251, 4157, 2113}, {6253, 6261, 6270, 6276, 6283, 6290, 6297, 6304, 6311, 6321, 6329, 6338, 0}, {6347, 6355, 4173, 6364, 6371, 6378, 6385, 4196, 6392, 6402, 1143, 6410, 0}, {6419, 2584, 2588, 2592, 6423, 6427, 6431, 4242, 6435, 6439, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,3743,14,6443,1347,1328,0,0,0,0,0,0,0,0},{4771,6451,3755,0,0,0,0,0},{301,1404,2350,5006,0,0,0,0,0,0,0,0},{307,2366,6460,0,0,0,0,0,0}},
-       {1445, 1837, 1420, 1404, 1476, 1492, 6469, 6476, {6483, 6493, 6503, 6513, 6523, 6533, 6543}, {1638, 6553, 6557, 6561, 6565, 6569, 6573}, {1638, 6553, 6557, 6561, 6565, 6569, 6573}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1837,1880,1866,1467,6577,6596,6613,1328,0,0,0,0,0,0},{1445,6634,6658,6685,0,0,0,0},{1404,301,1943,1951,0,0,0,0,0,0,0,0},{1420,307,1960,1971,0,0,0,0,0}},
-       {6714, 1328, 1960, 1943, 6743, 6760, 6774, 6781, {6788, 6798, 6808, 6818, 6828, 6838, 6848}, {6858, 6862, 6866, 6870, 6874, 6878, 6882}, {6858, 6862, 6866, 6870, 6874, 6878, 6882}, {6886, 6891, 6896, 6901, 6906, 6911, 6916, 6921, 6926, 6931, 6937, 6943, 0}, {6886, 6891, 6896, 6901, 6906, 6911, 6916, 6921, 6926, 6931, 6937, 6943, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {1328,5894,1859,1819,0,0,0,0,0,0,0,0,0,0},{6714,6949,6973,7000,7022,7053,0,0},{1943,1951,1404,301,0,0,0,0,0,0,0,0},{1960,1971,1420,307,0,0,0,0,0}},
-       {4771, 7079, 1420, 1404, 2005, 55, 973, 978, {7088, 7095, 7103, 7111, 7120, 7130, 7138}, {7147, 4424, 7150, 7153, 7156, 7159, 7162}, {7165, 2486, 2775, 3895, 2775, 4157, 7165}, {7167, 7175, 7184, 2517, 7190, 2527, 2532, 7194, 2544, 2554, 2562, 2571, 0}, {7167, 7175, 7184, 2517, 7190, 2527, 2532, 7194, 2544, 2554, 2562, 2571, 0}, {2580, 2584, 7203, 2592, 7190, 2596, 2600, 2604, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 2624, 268, {7079,2335,1354,14,1363,2906,1328,0,0,0,0,0,0,0},{4771,6451,3755,4997,0,0,0,0},{1404,301,2350,7207,7219,0,0,0,0,0,0,0},{1420,307,7231,7246,0,0,0,0,0}},
-       {1983, 2670, 307, 301, 2005, 2385, 973, 978, {2403, 2411, 2418, 2426, 2433, 2441, 2448}, {7261, 7266, 7270, 7274, 7278, 7282, 7286}, {2113, 2486, 2488, 2490, 2488, 2492, 2494}, {2496, 2503, 4899, 2517, 4910, 2527, 2532, 2537, 2544, 2554, 2562, 6099, 0}, {2496, 2503, 4899, 2517, 4910, 2527, 2532, 2537, 2544, 2554, 2562, 6099, 0}, {2580, 2584, 2588, 2592, 4910, 2596, 2600, 2604, 2608, 2612, 2616, 6129, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {2670,1363,2926,1328,2906,0,0,0,0,0,0,0,0,0},{1983,2637,0,0,0,0,0,0},{301,1404,7291,5006,0,0,0,0,0,0,0,0},{307,1420,7302,6460,0,0,0,0,0}},
-       {3755, 1328, 307, 301, 2005, 4788, 3804, 3807, {7316, 7326, 7340, 7347, 7354, 7363, 2075}, {7371, 7378, 7383, 7387, 7392, 7397, 7401}, {2106, 2108, 3895, 7406, 7409, 2108, 2113}, {7411, 7420, 7425, 7432, 2523, 7442, 7451, 7458, 7468, 7478, 2192, 7491, 0}, {7501, 7510, 7517, 7523, 7532, 7537, 7545, 7551, 7560, 7570, 7584, 7594, 0}, {7602, 7606, 2588, 7610, 2523, 7614, 7618, 7622, 7626, 7630, 7635, 7639, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 2624, 268, {1328,5894,0,0,0,0,0,0,0,0,0,0,0,0},{3755,5510,0,0,0,0,0,0},{301,1404,0,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {7643, 270, 307, 301, 4057, 7671, 3804, 3807, {4072, 7684, 7698, 7711, 7724, 7737, 4119}, {4127, 7749, 7753, 7757, 7761, 7765, 4148}, {2775, 2113, 2488, 7769, 7769, 2113, 2113}, {7771, 7779, 7789, 1097, 7796, 7801, 7807, 4196, 7813, 7822, 7830, 7839, 0}, {7771, 7779, 7789, 1097, 7796, 7801, 7807, 4196, 7813, 7822, 7830, 7839, 0}, {2580, 7848, 2588, 4238, 4910, 2596, 2600, 4242, 6435, 7852, 2616, 7856, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,3010,1347,1354,2374,2335,7079,1363,2670,2906,2926,1996,1328},{7643,4281,0,0,0,0,0,0},{301,0,0,0,0,0,0,0,0,0,0,0},{307,0,0,0,0,0,0,0,0}},
-       {2992, 270, 307, 301, 2005, 55, 7860, 7863, {7866, 7875, 4810, 7885, 7893, 7901, 7910}, {7916, 7919, 4424, 7923, 7926, 7930, 2103}, {2775, 6251, 2486, 2486, 6251, 4157, 2113}, {7933, 7941, 4899, 7948, 7955, 7960, 7970, 7978, 7984, 7994, 2562, 2571, 0}, {7933, 7941, 4899, 7948, 7955, 7960, 7970, 7978, 7984, 7994, 2562, 2571, 0}, {8002, 8009, 4899, 4974, 7955, 8015, 8022, 7978, 8027, 1313, 1318, 5875, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,14,1339,8033,1347,270,1328,0,0,0,0,0,0,0},{2992,3755,4997,0,0,0,0,0},{301,1404,8041,8053,8064,8072,8082,8091,2945,8097,8105,8110},{307,1420,8113,8128,2970,2956,8142,8155,2985}},
-       {3755, 2670, 307, 301, 2005, 4788, 3804, 3807, {8167, 8177, 8182, 8189, 8198, 8202, 8209}, {8220, 8223, 8226, 2763, 8229, 8232, 8235}, {2775, 2494, 2486, 2486, 4155, 4157, 2113}, {8239, 8248, 8258, 8265, 4910, 8273, 8279, 2537, 8285, 8296, 8306, 8316, 0}, {8239, 8248, 8258, 8265, 4910, 8273, 8279, 2537, 8285, 8296, 8306, 8316, 0}, {8326, 8331, 4857, 8336, 4910, 8341, 8346, 5858, 4985, 1313, 1318, 5875, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1996,1328,0,0,0,0,0,0,0,0,0,0,0},{3755,0,0,0,0,0,0,0},{301,1404,0,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {841, 2670, 1420, 1404, 2005, 3796, 8351, 8371, {8397, 8420, 451, 8443, 8454, 8469, 8484}, {8499, 8504, 8509, 8514, 8519, 8524, 8529}, {8534, 8537, 8534, 8540, 8543, 8537, 8540}, {8546, 8559, 8574, 8583, 8596, 8603, 8612, 8621, 8634, 8651, 8666, 8679, 0}, {8694, 8707, 8722, 8733, 8746, 8753, 8762, 8771, 8786, 8803, 8818, 8831, 0}, {8846, 8854, 8574, 8864, 8596, 8603, 8612, 8872, 8880, 8890, 8898, 8908, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1363,2926,14,1328,0,0,0,0,0,0,0,0,0},{841,316,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {8916, 8930, 1420, 1404, 44, 2385, 3804, 3807, {8940, 8949, 8961, 8968, 8976, 8986, 8992}, {8999, 9003, 9007, 9011, 9015, 9020, 9024}, {9028, 9030, 9032, 1076, 9034, 9030, 1076}, {9037, 9047, 9056, 9064, 9072, 9080, 9087, 9094, 9102, 2192, 9108, 9116, 0}, {9125, 9135, 9144, 9152, 9160, 9168, 9175, 9182, 9191, 7584, 9197, 9207, 0}, {9216, 9220, 9225, 9230, 9234, 7618, 9238, 9242, 9246, 7635, 9250, 9254, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {8930,9258,6133,9266,9278,9288,9298,1328,0,0,0,0,0,0},{8916,9310,9325,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {1983, 9345, 1420, 1404, 2005, 55, 9356, 9367, {9378, 9386, 9395, 9402, 9409, 9418, 2075}, {2082, 2085, 9425, 2092, 9428, 9432, 2103}, {2106, 2108, 9435, 2113, 9437, 2108, 2113}, {5734, 5742, 9440, 6055, 9446, 6108, 6113, 2537, 2544, 5813, 2562, 2571, 0}, {9451, 9460, 7517, 9470, 9478, 9484, 9490, 9496, 9504, 9514, 9523, 9532, 0}, {2580, 2584, 2588, 2592, 9446, 6108, 6113, 2604, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 9541, 268, {9345,1996,9544,2926,2670,1363,1328,0,0,0,0,0,0,0},{1983,2637,0,0,0,0,0,0},{1404,301,2350,0,0,0,0,0,0,0,0,0},{1420,307,2366,0,0,0,0,0,0}},
-       {1328, 1328, 9553, 9564, 9572, 3796, 9580, 9583, {9586, 9593, 9602, 9611, 9623, 9631, 9640}, {9650, 9654, 3951, 9659, 9664, 9668, 9672}, {2775, 5718, 2486, 2486, 9676, 2108, 2113}, {9678, 9684, 4899, 9691, 2523, 9697, 9705, 9712, 9718, 9726, 9732, 9740, 0}, {9678, 9684, 4899, 9691, 2523, 9697, 9705, 9712, 9718, 9726, 9732, 9740, 0}, {2861, 9748, 3951, 9752, 9756, 9760, 9764, 9768, 9672, 9772, 9776, 9781, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 2624, 268, {1328,5894,0,0,0,0,0,0,0,0,0,0,0,0},{1328,0,0,0,0,0,0,0},{9564,301,0,0,0,0,0,0,0,0,0,0},{9553,307,0,0,0,0,0,0,0}},
-       {9785, 1328, 307, 301, 2005, 9803, 9816, 9819, {9822, 9830, 9838, 2426, 2433, 2441, 9845}, {9853, 9858, 9863, 2469, 2473, 2477, 9867}, {2113, 2486, 2488, 2490, 2488, 2492, 2494}, {7167, 7175, 4899, 2517, 2523, 2527, 2532, 9872, 2544, 2554, 2562, 2571, 0}, {7167, 7175, 4899, 2517, 2523, 2527, 2532, 9872, 2544, 2554, 2562, 2571, 0}, {2580, 2584, 2588, 2592, 2523, 2596, 2600, 2604, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 2624, 268, {1328,5894,0,0,0,0,0,0,0,0,0,0,0,0},{9785,9880,0,0,0,0,0,0},{301,1404,9903,0,0,0,0,0,0,0,0,0},{307,1420,9913,0,0,0,0,0,0}},
-       {3755, 3010, 1420, 1404, 2005, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3010,1347,14,270,9926,9937,1328,0,0,0,0,0,0,0},{3755,9949,9965,0,0,0,0,0},{1404,301,3030,35,0,0,0,0,0,0,0,0},{1420,307,3019,23,0,0,0,0,0}},
-       {10007, 2670, 307, 301, 2005, 55, 3804, 3807, {10025, 10031, 10041, 10047, 10058, 10068, 10073}, {10083, 10087, 10091, 10095, 10100, 10104, 10108}, {2108, 2108, 2113, 10112, 2108, 7409, 7409}, {10115, 10120, 10127, 10132, 10138, 10145, 10153, 10160, 10169, 10176, 10181, 10188, 0}, {10115, 10120, 10127, 10132, 10138, 10145, 10153, 10160, 10169, 10176, 10181, 10188, 0}, {10196, 10200, 3951, 10205, 3920, 10209, 10213, 10217, 10222, 10226, 10230, 10234, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1363,1328,0,0,0,0,0,0,0,0,0,0,0},{10007,5510,0,0,0,0,0,0},{301,0,0,0,0,0,0,0,0,0,0,0},{307,0,0,0,0,0,0,0,0}},
-       {4014, 270, 3019, 3030, 44, 55, 10238, 10243, {10250, 10261, 10268, 10277, 10284, 10297, 10306}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {10315, 10326, 10337, 10346, 10357, 10362, 10369, 10380, 10389, 10400, 10413, 10424, 0}, {10315, 10326, 10337, 10346, 10357, 10362, 10369, 10380, 10389, 10400, 10413, 10424, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {5510, 270, 1420, 1404, 2005, 55, 3804, 3807, {10435, 10442, 10448, 10455, 10460, 10466, 10472}, {10478, 10482, 10486, 10490, 10494, 10498, 10502}, {2486, 2113, 2113, 10506, 4442, 4155, 2113}, {10508, 10516, 10525, 2798, 10531, 2808, 2813, 10535, 2825, 2835, 2843, 10543, 0}, {10508, 10516, 10525, 2798, 10531, 2808, 2813, 10535, 2825, 2835, 2843, 10543, 0}, {2861, 2865, 3951, 2874, 10531, 2878, 2882, 10552, 2890, 2894, 2898, 10556, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {10560, 2670, 1420, 1404, 10578, 4788, 10594, 10599, {10604, 10617, 10636, 10653, 10666, 10679, 10696}, {10709, 8504, 8509, 8514, 8519, 8524, 8529}, {10714, 8537, 8534, 8540, 8543, 8537, 8540}, {10717, 10730, 10741, 10758, 10773, 10788, 10803, 10816, 10831, 10848, 10863, 10880, 0}, {10895, 10906, 10919, 10934, 10947, 10960, 10973, 10984, 10997, 11012, 11025, 11044, 0}, {11057, 11064, 11071, 11078, 11085, 11092, 11099, 11106, 11113, 11120, 11127, 11134, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1363,1328,0,0,0,0,0,0,0,0,0,0,0},{10560,0,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {3755, 2670, 1420, 1404, 2005, 4788, 11141, 11154, {11167, 11182, 11203, 11218, 11231, 11244, 11259}, {520, 525, 11272, 535, 11277, 545, 550}, {555, 558, 11282, 564, 567, 558, 564}, {11285, 11302, 11311, 11326, 11343, 11358, 11373, 11386, 11401, 11418, 11439, 11456, 0}, {11285, 11302, 11311, 11326, 620, 11358, 11373, 11386, 11401, 11418, 11439, 11456, 0}, {11471, 11478, 11485, 11492, 11499, 11506, 11513, 11520, 11527, 11534, 11541, 11548, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 790, 268, {2670,1363,1328,0,0,0,0,0,0,0,0,0,0,0},{3755,0,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {1983, 1996, 1420, 1404, 2005, 2385, 2015, 11555, {11560, 11568, 11579, 11585, 11591, 11600, 2075}, {8999, 9003, 2473, 11606, 9015, 9020, 11610}, {9028, 9030, 1068, 1076, 9034, 9030, 1076}, {2496, 2503, 9440, 2517, 2523, 11614, 11620, 11626, 2544, 2554, 2562, 2571, 0}, {2496, 2503, 9440, 2517, 2523, 11614, 11620, 11626, 2544, 2554, 2562, 2571, 0}, {2580, 2584, 2588, 2592, 2523, 2596, 2600, 11633, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {1996,2926,9345,2670,9544,1363,11637,1328,0,0,0,0,0,0},{1983,2637,2651,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {11648, 11667, 1420, 1404, 11677, 2385, 11693, 11698, {11703, 11714, 11725, 11736, 11747, 11758, 11764}, {2108, 9676, 2488, 4442, 2106, 10506, 2494}, {2108, 9676, 2488, 4442, 2106, 10506, 2494}, {11773, 11781, 11790, 11797, 4910, 11804, 11810, 2537, 2544, 11816, 2562, 11825, 0}, {11773, 11781, 11790, 11797, 4910, 11804, 11810, 2537, 2544, 11816, 2562, 11825, 0}, {11835, 11840, 11790, 2592, 4910, 11804, 11810, 2604, 11846, 2612, 2616, 11851, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {11667,2670,1363,1328,0,0,0,0,0,0,0,0,0,0},{11648,11856,2651,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {11876, 5620, 1420, 1404, 5632, 2385, 11903, 11920, {11934, 11945, 11955, 11964, 11975, 11987, 11998}, {12008, 12011, 12014, 12017, 12020, 12023, 12026}, {2113, 2108, 2490, 2488, 7409, 2108, 2113}, {12029, 12039, 2511, 12050, 12059, 12065, 12073, 12081, 12089, 12100, 12109, 12119, 0}, {12029, 12039, 2511, 12050, 12059, 12065, 12073, 12081, 12089, 12100, 12109, 12119, 0}, {4961, 1288, 2511, 8336, 12059, 12129, 12135, 5858, 4985, 5870, 1318, 5875, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {5620,12141,1328,0,0,0,0,0,0,0,0,0,0,0},{11876,0,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {12151, 1848, 307, 301, 12173, 12188, 12200, 11555, {12206, 12218, 12230, 12242, 12256, 12271, 12284}, {12298, 12011, 12301, 12017, 12304, 12307, 12310}, {2113, 2108, 12314, 2488, 4442, 2108, 9437}, {12316, 12323, 12331, 12337, 12346, 12355, 12365, 12371, 12382, 12392, 12399, 12409, 0}, {12417, 12424, 12432, 12438, 12447, 12456, 12466, 12472, 12483, 12493, 12500, 12510, 0}, {12518, 12524, 12529, 12534, 12539, 12544, 12549, 12555, 12561, 12567, 12573, 12580, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {1848,1328,0,0,0,0,0,0,0,0,0,0,0,0},{12151,0,0,0,0,0,0,0},{301,0,0,0,0,0,0,0,0,0,0,0},{307,0,0,0,0,0,0,0,0}},
-       {3755, 1363, 1420, 1404, 2005, 3796, 12587, 12599, {12611, 12626, 12641, 12656, 12673, 12692, 12703}, {12714, 12721, 12728, 12735, 12742, 12749, 12756}, {0, 0, 0, 0, 0, 0, 0}, {12763, 12774, 8574, 12787, 8596, 12798, 12805, 8621, 12812, 12827, 12840, 12851, 0}, {12763, 12774, 8574, 12787, 8596, 12798, 12805, 8621, 12812, 12827, 12840, 12851, 0}, {12864, 12871, 12878, 12885, 8596, 12798, 12805, 12892, 12899, 12906, 12913, 12920, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {1363,1328,0,0,0,0,0,0,0,0,0,0,0,0},{3755,0,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,0,0,0,0,0,0,0,0}},
-       {3767, 3979, 23, 35, 44, 3796, 12927, 12947, {12964, 12977, 12990, 13006, 13023, 13038, 13047}, {12964, 12977, 12990, 13006, 13023, 13038, 13047}, {13056, 13059, 13062, 13065, 13068, 13071, 13074}, {13077, 13090, 13101, 13110, 13121, 13126, 13135, 13146, 13153, 13168, 13179, 13192, 0}, {13205, 13220, 13101, 13110, 13233, 13126, 13240, 13146, 13153, 13168, 13179, 13192, 0}, {13077, 13090, 13101, 13110, 13121, 13126, 13135, 13146, 13153, 13168, 13179, 13192, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 266, 268, {3979,3970,0,0,0,0,0,0,0,0,0,0,0,0},{3767,4000,0,0,0,0,0,0},{35,301,0,0,0,0,0,0,0,0,0,0},{23,307,0,0,0,0,0,0,0}},
-       {5510, 270, 3019, 3030, 2005, 55, 13253, 13256, {13259, 13272, 13282, 13291, 13301, 13312, 13323}, {13335, 13338, 13343, 13348, 13353, 13358, 13363}, {13335, 13368, 13371, 13374, 13377, 13380, 13383}, {13386, 13399, 13410, 13420, 13431, 13443, 13455, 13468, 13480, 13493, 13508, 13529, 0}, {13386, 13399, 13410, 13420, 13431, 13443, 13455, 13468, 13480, 13493, 13508, 13529, 0}, {13548, 13554, 13560, 13566, 13572, 13578, 13584, 13590, 13596, 13602, 13609, 13616, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 266, 268, {270,14,1354,2374,1328,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {13623, 2670, 1420, 1404, 44, 4788, 13636, 13644, {13652, 13665, 13686, 13705, 13726, 13745, 13758}, {13769, 13776, 13783, 13790, 13797, 13804, 13811}, {0, 0, 0, 0, 0, 0, 0}, {13818, 13833, 13848, 13857, 13868, 13879, 13892, 13905, 13920, 13939, 13958, 13975, 0}, {13818, 13833, 13848, 13857, 13868, 13879, 13892, 13905, 13920, 13939, 13958, 13975, 0}, {13994, 14001, 14008, 14015, 14022, 14029, 14036, 14043, 14050, 14057, 14064, 14071, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1363,14078,270,14088,3743,1328,0,0,0,0,0,0,0},{13623,2992,14099,5510,14118,14129,14141,14158},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {3755, 2670, 1420, 1404, 2005, 4788, 0, 0, {14176, 14182, 14196, 14219, 14233, 14249, 14256}, {14265, 14268, 14273, 14279, 14283, 7409, 14288}, {251, 239, 241, 243, 245, 247, 249}, {14292, 14299, 10127, 14306, 3920, 14312, 14318, 14324, 14331, 14340, 14348, 14355, 0}, {14292, 14299, 10127, 14306, 3920, 14312, 14318, 14324, 14331, 14340, 14348, 14355, 0}, {14362, 7848, 2588, 2592, 14366, 14370, 14374, 14378, 14382, 2612, 14386, 14390, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1363,2926,14,1328,0,0,0,0,0,0,0,0,0},{3755,5510,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {14394, 1837, 1420, 301, 14421, 3796, 3804, 3807, {14437, 14445, 14456, 14466, 14477, 14486, 14495}, {14505, 14508, 14511, 14514, 14517, 14520, 14523}, {14526, 2486, 12314, 2494, 12314, 2490, 14526}, {14528, 14538, 14546, 14554, 14562, 14570, 14577, 14585, 14593, 14600, 14606, 14613, 0}, {14528, 14538, 14546, 14554, 14562, 14570, 14577, 14585, 14593, 14600, 14606, 14613, 0}, {14621, 14625, 2588, 14629, 4910, 14633, 14637, 14641, 14645, 14649, 14653, 14657, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {1837,1328,0,0,0,0,0,0,0,0,0,0,0,0},{14394,0,0,0,0,0,0,0},{301,0,0,0,0,0,0,0,0,0,0,0},{1420,307,1428,0,0,0,0,0,0}},
-       {14099, 2670, 307, 301, 2005, 55, 14661, 14682, {14699, 430, 451, 8443, 14712, 14729, 14740}, {14753, 14761, 14769, 14775, 14783, 14791, 14799}, {555, 558, 561, 564, 567, 558, 564}, {14807, 583, 600, 609, 14822, 14829, 14838, 641, 654, 673, 690, 705, 0}, {14807, 583, 600, 609, 14822, 14829, 14838, 641, 654, 673, 690, 705, 0}, {14847, 14855, 14863, 738, 14822, 14871, 14879, 746, 754, 764, 772, 14887, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1363,1328,0,0,0,0,0,0,0,0,0,0,0},{14099,0,0,0,0,0,0,0},{301,0,0,0,0,0,0,0,0,0,0,0},{307,0,0,0,0,0,0,0,0}},
-       {5510, 1837, 23, 35, 2005, 55, 0, 0, {14899, 14906, 14917, 14926, 14935, 14942, 14953}, {14963, 14967, 14971, 14975, 14979, 14982, 14986}, {0, 0, 0, 0, 0, 0, 0}, {14990, 15000, 15009, 15017, 15026, 15039, 15051, 15058, 15065, 15072, 15082, 15094, 0}, {14990, 15000, 15009, 15017, 15026, 15039, 15051, 15058, 15065, 15072, 15082, 15094, 0}, {15107, 15111, 15115, 15119, 15123, 15127, 15131, 15135, 15139, 15143, 15147, 15151, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1837,1880,1328,0,0,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{35,3030,301,0,0,0,0,0,0,0,0,0},{23,3019,307,0,0,0,0,0,0}},
-       {5510, 1837, 23, 35, 2005, 55, 0, 0, {15155, 15160, 15166, 15176, 15188, 15196, 15207}, {15216, 15220, 15224, 15228, 15232, 15236, 15240}, {0, 0, 0, 0, 0, 0, 0}, {15244, 15254, 15264, 15271, 15278, 2808, 15283, 15290, 15297, 15306, 15314, 15322, 0}, {15244, 15254, 15264, 15271, 15278, 2808, 15283, 15290, 15297, 15306, 15314, 15322, 0}, {2861, 2865, 14986, 15330, 15334, 2878, 2882, 15338, 2890, 2894, 2898, 15342, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1837,1880,1328,0,0,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{35,3030,301,0,0,0,0,0,0,0,0,0},{23,3019,307,0,0,0,0,0,0}},
-       {5510, 1837, 23, 35, 2005, 55, 3804, 3807, {15346, 15352, 15363, 15176, 15373, 15196, 15207}, {15382, 15386, 15390, 15228, 15232, 15236, 15240}, {2113, 2486, 15394, 2488, 2113, 5718, 2486}, {15396, 15406, 15417, 15424, 15433, 15439, 15445, 15453, 15461, 15472, 15482, 15491, 0}, {15500, 15254, 15509, 15515, 15278, 2808, 15283, 15290, 15522, 15306, 15314, 15322, 0}, {2861, 2865, 15532, 2874, 15334, 2878, 2882, 15338, 2890, 2894, 2898, 15342, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1837,1880,1328,0,0,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{35,3030,301,0,0,0,0,0,0,0,0,0},{23,3019,307,0,0,0,0,0,0}},
-       {5510, 1837, 23, 35, 2005, 55, 15536, 15540, {15544, 15551, 15559, 15567, 15576, 15586, 15593}, {2754, 8226, 2760, 15602, 2766, 15605, 2772}, {2113, 2486, 2775, 3895, 2775, 4157, 2113}, {15608, 15617, 15627, 2798, 10531, 15633, 15639, 15645, 2825, 2835, 2843, 10543, 0}, {15608, 15617, 15627, 2798, 10531, 15633, 15639, 15645, 2825, 2835, 2843, 10543, 0}, {2861, 2865, 3951, 2874, 10531, 2878, 2882, 2886, 2890, 2894, 2898, 10556, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1837,1880,1328,15654,0,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{35,3030,301,0,0,0,0,0,0,0,0,0},{23,3019,307,0,0,0,0,0,0}},
-       {15666, 2670, 1420, 1404, 2005, 15698, 15704, 15720, {15742, 15758, 15783, 15811, 15839, 15867, 15895}, {15914, 15924, 15934, 15944, 15954, 15964, 15974}, {15984, 15988, 15992, 15988, 15996, 16000, 16004}, {16008, 16030, 16058, 16074, 16093, 16109, 16128, 16144, 16166, 16197, 16225, 16250, 0}, {16008, 16030, 16058, 16074, 16093, 16109, 16128, 16144, 16166, 16197, 16225, 16250, 0}, {16278, 16288, 16298, 16308, 16318, 16328, 16338, 16348, 16358, 16368, 16378, 16388, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1363,2926,14,1328,0,0,0,0,0,0,0,0,0},{15666,0,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {1983, 2374, 307, 301, 2005, 2385, 16398, 16403, {5913, 16408, 16419, 16429, 16439, 16449, 16463}, {5999, 6003, 16475, 16480, 16484, 16489, 16494}, {2113, 2486, 2488, 2486, 5718, 2492, 2494}, {2496, 2503, 4899, 6055, 4910, 2527, 2532, 2537, 2544, 2554, 2562, 6099, 0}, {2496, 2503, 4899, 6055, 4910, 2527, 2532, 2537, 2544, 2554, 2562, 6099, 0}, {2580, 2584, 2588, 2592, 4910, 2596, 2600, 2604, 2608, 2612, 2616, 6129, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 2624, 268, {2374,1354,1328,0,0,0,0,0,0,0,0,0,0,0},{1983,0,0,0,0,0,0,0},{301,5006,0,0,0,0,0,0,0,0,0,0},{307,6460,0,0,0,0,0,0,0}},
-       {5510, 2374, 307, 301, 44, 55, 16498, 16526, {16548, 16567, 16586, 16608, 16627, 16661, 16686}, {16705, 16716, 16727, 16741, 16752, 16763, 16780}, {16791, 16795, 16802, 16809, 16816, 16823, 16830}, {16834, 16850, 16866, 16882, 16901, 16908, 16918, 16934, 16950, 16972, 16994, 17013, 0}, {16834, 16850, 16866, 16882, 16901, 16908, 16918, 16934, 16950, 16972, 16994, 17013, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {2374,1354,2335,2926,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,1951,1943,0,0,0,0,0,0,0,0},{307,1420,1971,1960,0,0,0,0,0}},
-       {17035, 270, 307, 301, 2005, 17059, 17072, 17075, {17078, 17087, 17096, 17106, 17116, 17126, 17138}, {17146, 17151, 17155, 17159, 17163, 17168, 17173}, {17177, 2488, 2488, 9676, 17177, 17180, 2113}, {17183, 17190, 17195, 2798, 17201, 17207, 17214, 17220, 17228, 17238, 17246, 17255, 0}, {17183, 17190, 17195, 2798, 17201, 17207, 17214, 17220, 17228, 17238, 17246, 17255, 0}, {2861, 17265, 3951, 2874, 17269, 17273, 17278, 17282, 17286, 17290, 2898, 17294, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,1328,17299,7079,3010,0,0,0,0,0,0,0,0,0},{17035,17308,9937,0,0,0,0,0},{301,3030,1404,35,0,0,0,0,0,0,0,0},{307,3019,1420,23,0,0,0,0,0}},
-       {17326, 2670, 307, 301, 2005, 17344, 17358, 17363, {17368, 17380, 17391, 17405, 17417, 17427, 17437}, {17448, 17453, 17458, 17463, 17468, 17473, 17478}, {2113, 4157, 2486, 6251, 2775, 15394, 2494}, {17483, 17500, 17513, 17527, 17540, 17553, 17566, 17580, 17592, 17606, 17620, 17634, 0}, {17483, 17500, 17513, 17527, 17540, 17553, 17566, 17580, 17592, 17606, 17620, 17634, 0}, {17647, 17654, 17659, 17664, 17668, 17673, 17678, 17683, 17688, 17695, 17700, 17706, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {2670,1363,2926,1328,0,0,0,0,0,0,0,0,0,0},{17326,0,0,0,0,0,0,0},{301,1404,5006,0,0,0,0,0,0,0,0,0},{307,1420,6460,0,0,0,0,0,0}},
-       {5510, 270, 1420, 1404, 2005, 55, 18004, 18007, {18011, 18016, 10448, 10455, 18022, 18029, 10472}, {18036, 18040, 10486, 10490, 18044, 10498, 10502}, {12314, 14526, 2113, 10506, 4442, 4155, 2113}, {10508, 10516, 18048, 2798, 10531, 2878, 18052, 18058, 2825, 2835, 2843, 18063, 0}, {10508, 10516, 18048, 2798, 10531, 2878, 18052, 18058, 2825, 2835, 2843, 18063, 0}, {2861, 2865, 18048, 2874, 10531, 2878, 2882, 18058, 2890, 2894, 2898, 15342, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {18515, 1363, 1420, 1404, 18535, 4788, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {1363,1328,0,0,0,0,0,0,0,0,0,0,0,0},{18515,0,0,0,0,0,0,0},{1404,0,0,0,0,0,0,0,0,0,0,0},{1420,0,0,0,0,0,0,0,0}},
-       {3767, 3787, 3019, 3030, 44, 3796, 18551, 18559, {18567, 18576, 18585, 18593, 18602, 18611, 18618}, {18627, 18630, 18633, 18636, 18639, 18643, 18646}, {241, 243, 245, 247, 12314, 14526, 239}, {10508, 10516, 18649, 18655, 10531, 2808, 18052, 18662, 15297, 18669, 15314, 18676, 0}, {10508, 10516, 18649, 18655, 10531, 2808, 18052, 18662, 15297, 18669, 15314, 18676, 0}, {2861, 2865, 18048, 2874, 10531, 2878, 2882, 18684, 2890, 2894, 2898, 10556, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3787,3963,3970,3979,1880,1328,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {18688, 18706, 307, 301, 2005, 18717, 0, 0, {33652, 33662, 33671, 33680, 33691, 33701, 33706}, {33713, 33719, 33724, 33729, 33734, 10104, 33738}, {33743, 2775, 2113, 7409, 2108, 7409, 2113}, {14292, 14299, 10127, 14306, 3920, 33745, 33750, 33755, 14331, 14340, 14348, 14355, 0}, {14292, 14299, 10127, 14306, 3920, 33745, 33750, 33755, 14331, 14340, 14348, 14355, 0}, {33762, 33767, 3951, 2874, 3920, 33745, 33750, 33771, 10482, 2894, 33775, 33780, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 266, 268, {18706,1363,2926,14,1328,0,0,0,0,0,0,0,0,0},{18688,3755,5510,0,0,0,0,0},{301,1404,0,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {5510, 1354, 6460, 5006, 44, 55, 18884, 18912, {18934, 18953, 18972, 18997, 19016, 19050, 19075}, {19094, 19104, 19114, 19130, 19140, 19165, 19181}, {19191, 19195, 19202, 19206, 19213, 19220, 19227}, {19231, 19259, 19293, 19309, 19328, 19335, 19345, 19361, 19377, 19408, 19430, 19452, 0}, {19231, 19259, 19293, 19309, 19328, 19335, 19345, 19361, 19377, 19408, 19430, 19452, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {1354,2335,2926,2374,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{5006,2350,19477,19486,0,0,0,0,0,0,0,0},{6460,2366,19494,19506,0,0,0,0,0}},
-       {5510, 1354, 307, 301, 44, 55, 20053, 20094, {20135, 20154, 20173, 20195, 20214, 20236, 20261}, {20280, 20290, 20300, 20313, 20323, 20336, 20352}, {20362, 20366, 20373, 20380, 20387, 20394, 20401}, {20405, 20433, 20461, 20477, 20496, 20503, 20513, 20529, 20545, 20573, 20595, 20617, 0}, {20405, 20433, 20461, 20477, 20496, 20503, 20513, 20529, 20545, 20573, 20595, 20617, 0}, {20642, 20661, 20461, 20477, 20496, 20503, 20513, 20529, 20680, 20696, 20712, 20722, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {1354,2335,2926,2374,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,1951,1943,0,0,0,0,0,0,0,0},{307,1420,1971,1960,0,0,0,0,0}},
-       {5510, 1354, 307, 301, 44, 55, 7860, 20735, {20738, 20757, 20776, 20801, 20820, 20842, 20867}, {20886, 20896, 20906, 20922, 20932, 20945, 20961}, {20971, 20975, 20982, 20986, 20993, 21000, 21007}, {21011, 21033, 21064, 21086, 21105, 21112, 21122, 21138, 21154, 21185, 21207, 21229, 0}, {21011, 21033, 21064, 21086, 21105, 21112, 21122, 21138, 21154, 21185, 21207, 21229, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {1354,2335,2926,2374,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,1951,1943,0,0,0,0,0,0,0,0},{307,1420,1971,1960,0,0,0,0,0}},
-       {5510, 2374, 307, 301, 2005, 55, 21254, 21279, {21304, 21323, 21345, 21370, 21386, 21408, 21427}, {21437, 21444, 21451, 21458, 21465, 21472, 21479}, {21437, 21444, 21451, 21458, 21465, 21472, 21479}, {21483, 21499, 21524, 21543, 21562, 21569, 21582, 21595, 21614, 21645, 21670, 21692, 0}, {21483, 21499, 21524, 21543, 21562, 21569, 21582, 21717, 21614, 21645, 21670, 21692, 0}, {21736, 21744, 21758, 21772, 21562, 21569, 21582, 21783, 21791, 21805, 21816, 21824, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {2374,1354,2335,2926,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,1951,1943,0,0,0,0,0,0,0,0},{307,1420,1971,1960,0,0,0,0,0}},
-       {5510, 1354, 307, 301, 44, 55, 21835, 21866, {21891, 21913, 21935, 21960, 21982, 22007, 22035}, {22057, 22067, 22077, 22090, 22100, 22113, 22129}, {22139, 22143, 22150, 22154, 22161, 22168, 22175}, {22179, 22195, 22220, 22239, 22261, 22268, 22281, 22294, 22313, 22344, 22369, 22388, 0}, {22179, 22195, 22220, 22239, 22261, 22268, 22281, 22294, 22313, 22344, 22369, 22388, 0}, {22413, 22420, 243, 22436, 22261, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {1354,2335,2926,2374,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,1951,1943,0,0,0,0,0,0,0,0},{307,1420,1971,1960,0,0,0,0,0}},
-       {5510, 1354, 307, 301, 44, 55, 3804, 3807, {22452, 22471, 22490, 22512, 22531, 22553, 22578}, {22597, 22602, 22610, 22618, 22626, 22634, 22642}, {22653, 22657, 22664, 22671, 22678, 22685, 22692}, {22696, 22712, 22737, 22756, 22778, 22785, 22798, 22811, 22830, 22858, 22883, 22905, 0}, {22696, 22712, 22737, 22756, 22778, 22785, 22798, 22811, 22830, 22858, 22883, 22905, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {1354,2335,2926,2374,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,1951,1943,0,0,0,0,0,0,0,0},{307,1420,1971,1960,0,0,0,0,0}},
-       {5510, 1354, 6460, 5006, 44, 55, 22930, 22949, {22980, 23005, 23036, 23064, 23089, 23117, 23151}, {23176, 23195, 23220, 23236, 23255, 23274, 23293}, {23303, 23310, 23317, 23324, 23331, 23344, 23351}, {23355, 23374, 23402, 23430, 23455, 23468, 23484, 23497, 23522, 23559, 23587, 23609, 0}, {23355, 23374, 23402, 23430, 23455, 23468, 23484, 23497, 23522, 23559, 23587, 23609, 0}, {23634, 23644, 23663, 23679, 23455, 23468, 23484, 23695, 23702, 23727, 23743, 23753, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {1354,2335,2926,2374,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{5006,2350,19477,19486,0,0,0,0,0,0,0,0},{6460,2366,19494,19506,0,0,0,0,0}},
-       {23766, 2374, 1960, 1943, 23785, 55, 23793, 23821, {23843, 23862, 23881, 23906, 23925, 23959, 23984}, {24003, 19104, 19114, 19130, 24013, 24038, 19181}, {0, 0, 0, 0, 0, 0, 0}, {24054, 24079, 24110, 24126, 19328, 19335, 19345, 24145, 24161, 24192, 24214, 24236, 0}, {24054, 24079, 24110, 24126, 19328, 19335, 19345, 24145, 24161, 24192, 24214, 24236, 0}, {24261, 24274, 24110, 24126, 19328, 19335, 19345, 24293, 24300, 24316, 24332, 24342, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {2374,0,0,0,0,0,0,0,0,0,0,0,0,0},{23766,0,0,0,0,0,0,0},{1943,1951,0,0,0,0,0,0,0,0,0,0},{1960,1971,0,0,0,0,0,0,0}},
-       {5510, 2374, 307, 301, 44, 55, 3804, 3807, {16548, 16567, 24355, 16608, 24377, 16661, 16686}, {24399, 24409, 24419, 24432, 24442, 24455, 24471}, {16791, 16795, 16802, 16809, 16816, 16823, 16830}, {24481, 24506, 16866, 24537, 24556, 16908, 24563, 24576, 24592, 24617, 24639, 24667, 0}, {24481, 24506, 16866, 24537, 24556, 16908, 24563, 24576, 24592, 24617, 24639, 24667, 0}, {24689, 24702, 16866, 24721, 24556, 16908, 24563, 24737, 24744, 257, 24766, 24788, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {2374,1354,2335,2926,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,1951,1943,0,0,0,0,0,0,0,0},{307,1420,1971,1960,0,0,0,0,0}},
-       {25169, 1467, 307, 301, 25212, 25219, 25245, 25267, {25292, 25320, 25348, 25385, 25416, 25450, 25475}, {25509, 25525, 25541, 25566, 25585, 25607, 25626}, {25648, 25655, 25662, 25669, 25676, 25683, 25687}, {25697, 25731, 25768, 25802, 25836, 25867, 25904, 25941, 25981, 26015, 26049, 26098, 0}, {25697, 25731, 25768, 25802, 25836, 25867, 25904, 25941, 25981, 26015, 26049, 26098, 0}, {26147, 26160, 26173, 26186, 26199, 26212, 26225, 26238, 26251, 26264, 26280, 26296, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1467,1819,1828,1848,1328,1837,1859,1866,1873,0,0,0,0,0},{25169,26312,0,0,0,0,0,0},{301,0,0,0,0,0,0,0,0,0,0,0},{307,0,0,0,0,0,0,0,0}},
-       {5510, 270, 307, 301, 2005, 55, 0, 0, {26360, 26369, 26379, 26391, 26404, 26413, 26425}, {26437, 26441, 26446, 26450, 26454, 26458, 26462}, {2113, 2494, 2486, 2486, 14526, 6251, 2113}, {26466, 26473, 26482, 26489, 2804, 26496, 26504, 26515, 26520, 26525, 26532, 26541, 0}, {26466, 26473, 26482, 26489, 2804, 26496, 26549, 26515, 26520, 26525, 26532, 26541, 0}, {26559, 26563, 26446, 26568, 2804, 26572, 26576, 26515, 26520, 26580, 26584, 26589, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 0, 266, 268, {270,14,1347,2926,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,35,3030,0,0,0,0,0,0,0,0},{307,1420,23,3019,0,0,0,0,0}},
-       {3755, 1328, 307, 26594, 26602, 26637, 26673, 26689, {26705, 26739, 26770, 26801, 26823, 26866, 26894}, {26919, 26926, 26930, 26934, 26941, 26951, 26958}, {0, 0, 0, 0, 0, 0, 0}, {26962, 26975, 26994, 27007, 27020, 27033, 27052, 27071, 27084, 27100, 27113, 27138, 0}, {26962, 26975, 26994, 27007, 27020, 27033, 27052, 27071, 27084, 27100, 27113, 27138, 0}, {27151, 27155, 27159, 27163, 27167, 27171, 27175, 27179, 27183, 27187, 27194, 27201, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {1328,0,0,0,0,0,0,0,0,0,0,0,0,0},{3755,9949,0,0,0,0,0,0},{26594,0,0,0,0,0,0,0,0,0,0,0},{307,0,0,0,0,0,0,0,0}},
-       {5510, 270, 307, 26594, 2005, 55, 27208, 27233, {27258, 27283, 27302, 27330, 27349, 27374, 27393}, {27415, 27423, 27428, 27433, 27438, 27446, 27454}, {0, 0, 0, 0, 0, 0, 0}, {27459, 27478, 27494, 27507, 27520, 27542, 27561, 27583, 27599, 27615, 27628, 27644, 0}, {27459, 27478, 27494, 27507, 27520, 27542, 27561, 27583, 27599, 27615, 27628, 27644, 0}, {27660, 27669, 27678, 27690, 27700, 27709, 27721, 27730, 27739, 27748, 27757, 27766, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,1328,0,0,0,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{26594,0,0,0,0,0,0,0,0,0,0,0},{307,0,0,0,0,0,0,0,0}},
-       {4028, 270, 1420, 1404, 4057, 55, 973, 978, {27775, 27783, 27788, 27795, 27805, 27811, 27818}, {27826, 27830, 3951, 27834, 27839, 27843, 27847}, {2775, 2494, 2486, 2486, 4153, 4157, 2113}, {27852, 27860, 6270, 27869, 27875, 27880, 27886, 6304, 27892, 27901, 27909, 27918, 0}, {27852, 27860, 6270, 27869, 27875, 27880, 27886, 6304, 27892, 27901, 27909, 27918, 0}, {27927, 2865, 3951, 27931, 2804, 27935, 27940, 18684, 17286, 27944, 2898, 3959, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,14,1339,1347,1354,1363,1328,0,0,0,0,0,0,0},{4028,4254,4281,0,0,0,0,0},{1404,301,35,1409,0,0,0,0,0,0,0,0},{1420,307,23,1428,0,0,0,0,0}},
-       {5510, 2374, 307, 301, 44, 55, 27948, 27960, {27972, 16567, 28000, 16608, 24377, 16661, 16686}, {24399, 24409, 24419, 24432, 24442, 24455, 24471}, {0, 0, 0, 0, 0, 0, 0}, {24481, 24506, 16866, 24537, 24556, 16908, 24563, 28019, 28035, 28063, 24639, 24667, 0}, {24481, 24506, 16866, 24537, 24556, 16908, 24563, 28019, 28035, 28063, 24639, 24667, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {2374,1354,2335,2926,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,1951,1943,0,0,0,0,0,0,0,0},{307,1420,1971,1960,0,0,0,0,0}},
-       {28085, 1328, 3019, 3030, 28133, 3796, 28143, 28155, {28164, 28180, 28196, 28224, 28240, 28283, 28308}, {28336, 28346, 28356, 28363, 28373, 28389, 28402}, {28412, 28416, 28420, 28424, 28428, 28441, 28448}, {28455, 28474, 28499, 28518, 28543, 28556, 28569, 28582, 28604, 28638, 28663, 28691, 0}, {28455, 28474, 28499, 28518, 28543, 28556, 28569, 28582, 28604, 28638, 28663, 28691, 0}, {28719, 28726, 28736, 28518, 28543, 28556, 28569, 28749, 28759, 28772, 28782, 28795, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 2624, 268, {1328,1837,1880,270,14,0,0,0,0,0,0,0,0,0},{28085,0,0,0,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {28808, 3010, 3019, 3030, 2005, 28840, 28854, 28864, {28877, 28887, 28894, 28907, 28917, 28927, 28937}, {28877, 28887, 28947, 28907, 28917, 28927, 28937}, {28957, 28961, 28965, 28969, 28973, 28977, 28981}, {28985, 29001, 29017, 29027, 29040, 29047, 29054, 29064, 29077, 29096, 29115, 29131, 0}, {28985, 29001, 29017, 29027, 29040, 29047, 29054, 29064, 29077, 29096, 29115, 29131, 0}, {29147, 29157, 29017, 29167, 29040, 29047, 29054, 29177, 29187, 29197, 29207, 29217, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3010,1328,0,0,0,0,0,0,0,0,0,0,0,0},{28808,0,0,0,0,0,0,0},{3030,0,0,0,0,0,0,0,0,0,0,0},{3019,0,0,0,0,0,0,0,0}},
-       {3767, 3787, 3019, 3030, 29468, 3796, 29478, 29519, {29560, 29579, 29598, 29623, 29642, 29664, 29689}, {29708, 24409, 29718, 24432, 29734, 24455, 24471}, {29747, 29751, 29755, 29759, 29763, 29767, 29771}, {16834, 29775, 16866, 29803, 24556, 29822, 16918, 16934, 29832, 29863, 29885, 29910, 0}, {16834, 29775, 16866, 29803, 24556, 29822, 16918, 16934, 29832, 29863, 29885, 29910, 0}, {29935, 29942, 16866, 29952, 24556, 29822, 29968, 29981, 29988, 30004, 30020, 30033, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3787,3963,3970,3979,1880,1328,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {270, 14, 3019, 3030, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {30046, 30053, 30062, 30077, 30088, 30097, 30104, 30111, 30118, 30129, 30142, 30155, 0}, {30046, 30053, 30062, 30077, 30088, 30097, 30104, 30111, 30118, 30129, 30142, 30155, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 266, 268, {14,270,0,0,0,0,0,0,0,0,0,0,0,0},{270,1,281,30160,0,0,0,0},{3030,1404,0,0,0,0,0,0,0,0,0,0},{3019,1420,0,0,0,0,0,0,0}},
-       {3767, 3787, 3019, 3030, 44, 3796, 3804, 3807, {30178, 30185, 27788, 30191, 30202, 30210, 30219}, {30226, 27830, 3951, 30230, 30234, 30238, 10502}, {2494, 2494, 2486, 2486, 5718, 15394, 2113}, {30242, 30248, 30256, 27869, 30262, 30267, 30273, 6304, 30279, 30289, 30297, 30307, 0}, {30242, 30248, 30256, 27869, 30262, 30267, 30273, 6304, 30279, 30289, 30297, 30307, 0}, {30317, 30321, 3951, 27931, 3920, 30325, 30329, 18684, 17286, 2894, 30333, 15342, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3787,3963,3970,3979,1880,1328,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {3767, 3010, 3019, 3030, 44, 3796, 0, 0, {30337, 30344, 30352, 30359, 30366, 30374, 30382}, {30389, 30392, 30395, 30398, 30401, 30404, 30407}, {2494, 2494, 2488, 2494, 12314, 4155, 12314}, {30410, 30418, 30428, 30434, 30442, 30447, 30452, 30457, 30464, 18669, 30472, 30480, 0}, {30410, 30418, 30428, 30434, 30442, 30447, 30452, 30457, 30464, 18669, 30472, 30480, 0}, {2861, 30488, 3951, 30492, 3920, 29431, 29435, 30496, 3891, 2894, 30500, 15342, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3010,1347,14,270,1880,1328,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {3767, 3010, 3019, 3030, 44, 3796, 30504, 30515, {30525, 30543, 30558, 30580, 30593, 30607, 30624}, {30648, 30656, 30661, 30580, 30593, 30673, 30680}, {0, 0, 0, 0, 0, 0, 0}, {30694, 30716, 30732, 30752, 30766, 30783, 30798, 30815, 30829, 30842, 30861, 30875, 0}, {30694, 30716, 30732, 30752, 30766, 30783, 30798, 30815, 30829, 30842, 30861, 30875, 0}, {30894, 30909, 30918, 30931, 30938, 30948, 30956, 30966, 30973, 30979, 30991, 30998, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3010,1347,14,270,1880,1328,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {5510, 1837, 23, 35, 2005, 55, 0, 0, {31010, 31018, 14917, 14926, 14935, 31029, 31039}, {15382, 14967, 14971, 14975, 14979, 15236, 31048}, {0, 0, 0, 0, 0, 0, 0}, {31052, 31061, 31071, 31079, 10531, 3924, 31087, 31093, 31102, 31111, 31120, 31129, 0}, {31052, 31061, 31071, 31079, 10531, 3924, 31087, 31093, 31102, 31111, 31120, 31129, 0}, {2861, 2865, 14986, 31138, 10531, 2878, 2882, 18684, 17286, 2894, 31142, 15342, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1837,1880,1328,0,0,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{35,3030,301,0,0,0,0,0,0,0,0,0},{23,3019,307,0,0,0,0,0,0}},
-       {1983, 2374, 307, 301, 2005, 2385, 31146, 31151, {31156, 31163, 31178, 31192, 31208, 31223, 31239}, {6247, 31254, 2588, 31258, 31262, 31266, 31270}, {2113, 12314, 2486, 2108, 2113, 2488, 12314}, {7167, 7175, 31274, 31281, 31288, 2527, 2532, 31293, 31303, 31314, 31323, 31333, 0}, {7167, 7175, 31274, 31281, 31288, 2527, 2532, 31293, 31303, 31314, 31323, 31333, 0}, {2580, 2584, 2588, 2592, 2523, 2596, 2600, 2604, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {2374,1354,1328,2626,0,0,0,0,0,0,0,0,0,0},{1983,2637,0,0,0,0,0,0},{301,1404,0,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {3767, 3010, 3019, 3030, 44, 3796, 31343, 31348, {31353, 31369, 31377, 31385, 31394, 31406, 31416}, {31426, 31432, 31438, 31442, 31446, 31454, 3891}, {0, 0, 0, 0, 0, 0, 0}, {31461, 31474, 31488, 31497, 31503, 31507, 31512, 31520, 15297, 31533, 15314, 15322, 0}, {31461, 31474, 31488, 31497, 31503, 31507, 31512, 31520, 15297, 31533, 15314, 15322, 0}, {31542, 2865, 31546, 15330, 31503, 31550, 2882, 31554, 2890, 31562, 2898, 15342, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3010,1347,14,270,1880,1328,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {31568, 1467, 1420, 1943, 31592, 31609, 31623, 31630, {31637, 31647, 31657, 31667, 31677, 31687, 31697}, {31707, 31714, 31721, 31728, 31735, 31742, 31749}, {31756, 31760, 31764, 31768, 31772, 31776, 31780}, {31784, 31791, 31798, 31805, 31812, 31819, 31826, 31833, 31840, 31847, 31854, 31864, 0}, {31784, 31791, 31798, 31805, 31812, 31819, 31826, 31833, 31840, 31847, 31854, 31864, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1467,1819,1828,1848,1328,1837,0,0,0,0,0,0,0,0},{31568,31874,31904,0,0,0,0,0},{1943,1404,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {4771, 270, 307, 301, 2005, 4788, 0, 0, {26437, 27830, 31934, 31941, 31951, 31956, 31963}, {31970, 4131, 31974, 4862, 31979, 31984, 31989}, {4421, 31994, 31997, 32000, 32003, 32006, 32009}, {32012, 32019, 31934, 32030, 32036, 32040, 32049, 32056, 32061, 32070, 8220, 32075, 0}, {32012, 32019, 31934, 32030, 32036, 32040, 32049, 32056, 32061, 32070, 8220, 32075, 0}, {32081, 32085, 32092, 26568, 32036, 32097, 32102, 32056, 32107, 32070, 8220, 32112, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,14,1363,1354,1328,0,0,0,0,0,0,0,0,0},{4771,4997,3755,0,0,0,0,0},{301,1404,5006,5012,5022,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {32116, 270, 307, 301, 2005, 4788, 0, 0, {32144, 32152, 32159, 32167, 32177, 32185, 1034}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {32196, 32204, 1091, 1097, 4910, 32213, 32218, 1120, 1126, 32225, 1143, 32234, 0}, {32196, 32204, 1091, 1097, 4910, 32213, 32218, 1120, 1126, 32225, 1143, 32234, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,14,1363,1354,1328,0,0,0,0,0,0,0,0,0},{32116,0,0,0,0,0,0,0},{301,1404,5006,5012,5022,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {32396, 32414, 1420, 1404, 32425, 3796, 32441, 32446, {32451, 32476, 32505, 32530, 32543, 32558, 32575}, {32590, 32595, 32600, 32605, 32610, 32615, 8529}, {32620, 32620, 32623, 8540, 8543, 32620, 8540}, {32626, 32645, 32660, 32682, 32702, 32718, 32734, 32748, 32774, 32798, 32815, 32832, 0}, {32626, 32645, 32660, 32682, 32702, 32718, 32734, 32748, 32774, 32798, 32815, 32832, 0}, {32849, 32858, 32867, 32881, 32895, 32907, 32919, 32929, 32945, 32959, 32966, 32973, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {32414,32980,2926,3970,32989,0,0,0,0,0,0,0,0,0},{32396,33000,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {3767, 3787, 3019, 3030, 44, 3796, 0, 0, {33019, 33031, 33042, 33054, 33066, 33076, 33088}, {33103, 33108, 33113, 33118, 33123, 33128, 33133}, {0, 0, 0, 0, 0, 0, 0}, {33138, 33147, 33159, 33167, 33172, 33182, 33189, 33198, 33205, 33211, 33220, 33231, 0}, {33138, 33147, 33159, 33167, 33172, 33182, 33189, 33198, 33205, 33211, 33220, 33231, 0}, {33239, 33244, 33249, 33254, 33259, 33264, 33269, 33123, 33274, 33279, 33284, 33289, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3787,3963,3970,3979,1880,1328,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {5510, 270, 307, 301, 2005, 55, 6031, 6036, {33294, 33307, 33315, 33324, 33334, 33344, 33353}, {33365, 33369, 33373, 33377, 33381, 33385, 33389}, {2775, 2494, 2486, 7409, 12314, 5718, 2113}, {33393, 33407, 33418, 33427, 33438, 33450, 33464, 33476, 33489, 33502, 33514, 33527, 0}, {33393, 33407, 33418, 33427, 33438, 33450, 33464, 33476, 33489, 33502, 33514, 33527, 0}, {33541, 33546, 33552, 33558, 33563, 33569, 33575, 33580, 33586, 33591, 17994, 33597, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 0, 266, 268, {270,14,1347,2926,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,35,3030,0,0,0,0,0,0,0,0},{307,1420,23,3019,0,0,0,0,0}},
-       {4014, 270, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{35,301,0,0,0,0,0,0,0,0,0,0},{23,307,0,0,0,0,0,0,0}},
-       {1445, 1467, 1420, 1404, 1476, 1492, 1505, 1512, {1519, 1529, 1539, 1549, 1559, 1569, 1579}, {1589, 1596, 1603, 1610, 1617, 1624, 1631}, {1638, 1642, 1646, 1650, 1654, 1658, 1662}, {1666, 1673, 1680, 1687, 1694, 1701, 1708, 1715, 1722, 1729, 1736, 1746, 0}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {1666, 1673, 1680, 1687, 1694, 1701, 1708, 1715, 1722, 1729, 1736, 1746, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1467,1819,1828,1328,1837,1848,1859,1866,1873,1880,0,0,0,0},{1445,1889,1916,0,0,0,0,0},{1404,301,1943,1951,0,0,0,0,0,0,0,0},{1420,307,1960,1971,0,0,0,0,0}},
-       {2651, 2670, 307, 301, 2005, 55, 2681, 2687, {2694, 2702, 2709, 2718, 2727, 2738, 2746}, {2754, 2757, 2760, 2763, 2766, 2769, 2772}, {2113, 2486, 2775, 2486, 2775, 2492, 2113}, {2777, 2784, 2792, 2798, 2804, 2808, 2813, 2818, 2825, 2835, 2843, 2852, 0}, {2777, 2784, 2792, 2798, 2804, 2808, 2813, 2818, 2825, 2835, 2843, 2852, 0}, {2861, 2865, 2869, 2874, 2804, 2878, 2882, 2886, 2890, 2894, 2898, 2902, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {2670,1363,2918,33784,2926,1328,0,0,0,0,0,0,0,0},{2651,1983,33794,0,0,0,0,0},{301,1404,8082,8072,2945,8105,8110,8091,8097,0,0,0},{307,1420,8142,8155,2970,2956,2985,0,0}},
-       {5510, 270, 307, 301, 2005, 55, 3804, 3807, {3810, 3817, 3824, 3832, 3842, 3851, 3858}, {3867, 3871, 3875, 3879, 3883, 3887, 3891}, {2113, 2486, 2488, 3895, 2488, 2492, 2113}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {2861, 2865, 3951, 2874, 3920, 2878, 2882, 2886, 2890, 3955, 2898, 3959, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 0, 266, 268, {270,14,1347,2926,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,35,3030,0,0,0,0,0,0,0,0},{307,1420,23,3019,0,0,0,0,0}},
-       {4028, 270, 23, 35, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,3743,14,1339,1347,1354,1328,0,0,0,0,0,0,0},{4028,4254,4281,0,0,0,0,0},{35,3030,1404,301,0,0,0,0,0,0,0,0},{23,3019,1420,307,0,0,0,0,0}},
-       {4771, 14078, 307, 301, 2005, 4788, 3804, 3807, {4795, 4804, 4810, 4816, 4825, 4831, 4840}, {4847, 4852, 4857, 4862, 4867, 4872, 4877}, {2775, 2494, 2486, 2486, 4155, 4157, 2113}, {4882, 4890, 4899, 4904, 4910, 4914, 4919, 4927, 4933, 4943, 1143, 4951, 0}, {4882, 4890, 4899, 4904, 4910, 4914, 4919, 4927, 4933, 4943, 1143, 4951, 0}, {4961, 4967, 4899, 4974, 4910, 4914, 4979, 4927, 4985, 1313, 1318, 4991, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {14078,1339,1363,1880,1354,270,1328,0,0,0,0,0,0,0},{4771,3755,3990,0,0,0,0,0},{301,1404,5006,5012,5022,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {2651, 2670, 307, 301, 2005, 2385, 6167, 6170, {6173, 6182, 6190, 6199, 6210, 6219, 6228}, {4127, 4131, 2588, 6235, 6239, 6243, 6247}, {2775, 2494, 2486, 2486, 6251, 4157, 2113}, {6253, 6261, 6270, 6276, 6283, 6290, 6297, 6304, 6311, 6321, 6329, 6338, 0}, {6347, 6355, 4173, 6364, 6371, 6378, 6385, 4196, 6392, 6402, 1143, 6410, 0}, {6419, 2584, 2588, 2592, 6423, 6427, 6431, 4242, 6435, 6439, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {2670,1363,11637,1347,6443,1328,0,0,0,0,0,0,0,0},{2651,6451,3755,0,0,0,0,0},{301,1404,8082,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {4771, 14078, 1420, 1404, 2005, 55, 973, 978, {7088, 7095, 7103, 7111, 7120, 7130, 7138}, {7147, 4424, 7150, 7153, 7156, 7159, 7162}, {7165, 2486, 2775, 3895, 2775, 4157, 7165}, {7167, 7175, 7184, 2517, 7190, 2527, 2532, 7194, 2544, 2554, 2562, 2571, 0}, {7167, 7175, 7184, 2517, 7190, 2527, 2532, 7194, 2544, 2554, 2562, 2571, 0}, {2580, 2584, 7203, 2592, 7190, 2596, 2600, 2604, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {14078,1339,1354,1363,2906,1328,0,0,0,0,0,0,0,0},{4771,3990,3755,5553,0,0,0,0},{1404,301,33804,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {1983, 2670, 307, 301, 2005, 2385, 2393, 2398, {2403, 9830, 33814, 2426, 2433, 2441, 33821}, {2456, 9858, 33829, 2469, 2473, 2477, 6027}, {2113, 2486, 2488, 2490, 2488, 2492, 2494}, {2496, 2503, 4899, 2517, 4910, 2527, 2532, 2537, 2544, 2554, 2562, 6099, 0}, {2496, 2503, 4899, 2517, 4910, 2527, 2532, 2537, 2544, 2554, 2562, 6099, 0}, {2580, 2584, 2588, 2592, 4910, 2596, 2600, 2604, 2608, 2612, 2616, 6129, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {2670,1363,2926,1328,2906,0,0,0,0,0,0,0,0,0},{1983,2637,0,0,0,0,0,0},{301,1404,7291,5006,0,0,0,0,0,0,0,0},{307,1420,7302,6460,0,0,0,0,0}},
-       {7643, 2374, 307, 301, 4057, 33833, 973, 978, {27775, 33837, 33851, 33864, 33877, 33890, 27818}, {4127, 7749, 7753, 7757, 7761, 7765, 4148}, {2775, 2113, 2488, 7769, 7769, 2113, 2113}, {33902, 33910, 33920, 27869, 27875, 33927, 33933, 6304, 27892, 27901, 27909, 33939, 0}, {33902, 33910, 33920, 27869, 27875, 33927, 33933, 6304, 27892, 27901, 27909, 33939, 0}, {2861, 33767, 3951, 27931, 2804, 2878, 2882, 18684, 17286, 27944, 2898, 2902, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 2624, 268, {2374,14129,24825,2926,14,1328,0,0,0,0,0,0,0,0},{7643,4281,33948,33957,0,0,0,0},{301,33966,0,0,0,0,0,0,0,0,0,0},{307,0,0,0,0,0,0,0,0}},
-       {9785, 1996, 307, 301, 2005, 9803, 9816, 9819, {9822, 9830, 9838, 2426, 2433, 2441, 9845}, {9853, 9858, 9863, 2469, 2473, 2477, 9867}, {2113, 2486, 2488, 2490, 2488, 2492, 2494}, {7167, 7175, 4899, 2517, 2523, 2527, 2532, 9872, 2544, 2554, 2562, 2571, 0}, {7167, 7175, 4899, 2517, 2523, 2527, 2532, 9872, 2544, 2554, 2562, 2571, 0}, {2580, 2584, 2588, 2592, 2523, 2596, 2600, 2604, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {1996,2670,2926,1328,0,0,0,0,0,0,0,0,0,0},{9785,9880,0,0,0,0,0,0},{301,1404,9903,0,0,0,0,0,0,0,0,0},{307,1420,9913,0,0,0,0,0,0}},
-       {3755, 2670, 1420, 1404, 2005, 4788, 0, 0, {33977, 33988, 34012, 34042, 34059, 34081, 34090}, {14265, 14268, 14273, 14279, 14283, 7409, 14288}, {251, 239, 241, 243, 245, 247, 249}, {34101, 34114, 600, 34127, 620, 34138, 34147, 641, 34156, 34173, 34188, 34201, 0}, {34101, 34114, 600, 34127, 620, 34138, 34147, 641, 34156, 34173, 34188, 34201, 0}, {14362, 7848, 2588, 2592, 14366, 14370, 14374, 14378, 14382, 2612, 14386, 14390, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1363,2926,14,1328,0,0,0,0,0,0,0,0,0},{3755,5510,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {3755, 270, 307, 301, 2005, 55, 973, 978, {17711, 17725, 17735, 17746, 17760, 17771, 17782}, {17795, 17800, 17805, 17812, 17818, 17824, 17830}, {2775, 2494, 2486, 7409, 2775, 12314, 2113}, {17835, 17843, 17851, 17858, 17867, 17877, 17887, 17893, 17901, 17916, 17934, 17942, 0}, {17835, 17843, 17851, 17858, 17867, 17877, 17887, 17893, 17901, 17916, 17934, 17942, 0}, {17950, 17954, 17851, 17960, 17964, 17969, 17887, 17975, 17980, 17987, 17994, 17999, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,14,1347,2926,1328,0,0,0,0,0,0,0,0,0},{3755,5510,9937,9926,0,0,0,0},{301,1404,0,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {5510, 270, 1420, 1404, 2005, 55, 18004, 18007, {18011, 18016, 10448, 10455, 18022, 18029, 10472}, {18036, 18040, 10486, 10490, 18044, 10498, 10502}, {12314, 14526, 2113, 10506, 4442, 4155, 2113}, {10508, 10516, 18048, 2798, 10531, 2878, 18052, 18058, 2825, 2835, 2843, 18063, 0}, {10508, 10516, 18048, 2798, 10531, 2878, 18052, 18058, 2825, 2835, 2843, 18063, 0}, {2861, 2865, 18048, 2874, 10531, 2878, 2882, 18058, 2890, 2894, 2898, 15342, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {34214, 2670, 307, 301, 2005, 18717, 0, 0, {18724, 18739, 18754, 18769, 18786, 18803, 18812}, {18823, 18830, 18837, 18844, 18851, 18858, 18865}, {18872, 18875, 8540, 8543, 8537, 18878, 18881}, {12763, 12774, 8574, 12787, 8596, 12798, 12805, 8621, 12812, 12827, 12840, 12851, 0}, {12763, 12774, 8574, 12787, 8596, 12798, 12805, 8621, 12812, 12827, 12840, 12851, 0}, {12864, 12871, 12878, 12885, 8596, 12798, 12805, 12892, 12899, 12906, 12913, 12920, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1363,18706,2926,14,1328,0,0,0,0,0,0,0,0},{34214,3755,5510,0,0,0,0,0},{301,1404,0,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {5510, 1354, 6460, 5006, 44, 55, 18884, 18912, {18934, 18953, 18972, 18997, 19016, 19050, 19075}, {19094, 19104, 19114, 19130, 19140, 19165, 19181}, {19191, 19195, 19202, 19206, 19213, 19220, 19227}, {19231, 19259, 19293, 19309, 19328, 19335, 19345, 19361, 19377, 19408, 19430, 19452, 0}, {19231, 19259, 19293, 19309, 19328, 19335, 19345, 19361, 19377, 19408, 19430, 19452, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 5, 2624, 268, {1354,2335,2926,2374,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{5006,2350,19477,19486,0,0,0,0,0,0,0,0},{6460,2366,19494,19506,0,0,0,0,0}},
-       {34235, 1467, 1420, 1404, 34311, 34343, 0, 0, {24851, 24858, 24869, 24882, 24895, 24906, 24919}, {24930, 24935, 24940, 24945, 24950, 24955, 24960}, {0, 0, 0, 0, 0, 0, 0}, {24965, 24980, 24989, 24996, 25009, 25016, 25027, 25036, 25045, 25052, 25063, 25074, 0}, {24965, 24980, 24989, 24996, 25009, 25016, 25027, 25036, 25045, 25052, 25063, 25074, 0}, {25085, 25092, 25099, 25106, 25113, 25120, 25127, 25134, 25141, 25148, 25155, 25162, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1467,1819,1828,1848,1328,1837,1859,1866,1873,1880,0,0,0,0},{34235,34378,0,0,0,0,0,0},{1404,0,0,0,0,0,0,0,0,0,0,0},{1420,0,0,0,0,0,0,0,0}},
-       {4014, 270, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{35,301,0,0,0,0,0,0,0,0,0,0},{23,307,0,0,0,0,0,0,0}},
-       {1445, 3010, 1420, 1404, 1476, 1492, 1505, 1512, {1519, 1529, 1539, 1549, 1559, 1569, 1579}, {33603, 33610, 33617, 33624, 33631, 33638, 33645}, {1638, 1642, 1646, 1650, 1654, 1658, 1662}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3010,1347,14,1866,1880,1467,1837,1328,0,0,0,0,0,0},{1445,6634,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {34462, 2670, 307, 301, 2005, 55, 2681, 2687, {2694, 2702, 2709, 2718, 2727, 2738, 2746}, {2754, 2757, 2760, 2763, 2766, 2769, 2772}, {2113, 2486, 2775, 2486, 2775, 2492, 2113}, {34482, 2784, 2792, 2798, 2804, 2808, 2813, 2818, 2825, 2835, 2843, 2852, 0}, {34482, 2784, 2792, 2798, 2804, 2808, 2813, 2818, 2825, 2835, 2843, 2852, 0}, {34490, 2865, 2869, 2874, 2804, 2878, 2882, 2886, 2890, 2894, 2898, 2902, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {2670,1363,34495,1328,0,0,0,0,0,0,0,0,0,0},{34462,34505,34517,9926,0,0,0,0},{301,1404,34527,34539,8105,8110,8097,0,0,0,0,0},{307,1420,2970,2956,2985,0,0,0,0}},
-       {2992, 14078, 3019, 3030, 2005, 55, 3804, 3807, {3810, 3817, 3824, 3832, 3842, 3851, 3858}, {3867, 3871, 3875, 3879, 3883, 3887, 3891}, {2113, 2486, 2488, 3895, 2488, 2492, 2113}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {2861, 2865, 3951, 2874, 3920, 2878, 2882, 2886, 2890, 3955, 2898, 3959, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {14078,1339,1347,3010,14,270,3990,5523,1328,1880,1837,0,0,0},{2992,3755,0,0,0,0,0,0},{3030,1404,301,0,0,0,0,0,0,0,0,0},{3019,1420,307,0,0,0,0,0,0}},
-       {4028, 270, 1420, 1404, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,14,1339,1347,1354,1363,1328,2906,0,0,0,0,0,0},{4028,4254,4281,0,0,0,0,0},{1404,301,1409,0,0,0,0,0,0,0,0,0},{1420,307,1428,0,0,0,0,0,0}},
-       {3755, 1328, 307, 301, 44, 4788, 3804, 3807, {4795, 4804, 4810, 4816, 4825, 4831, 4840}, {4847, 4852, 4857, 4862, 4867, 4872, 4877}, {2775, 2494, 2486, 2486, 4155, 4157, 2113}, {4882, 4890, 4899, 4904, 4910, 4914, 4919, 4927, 4933, 4943, 1143, 4951, 0}, {4882, 4890, 4899, 4904, 4910, 4914, 4919, 4927, 4933, 4943, 1143, 4951, 0}, {4961, 4967, 4899, 4974, 4910, 4914, 4979, 4927, 4985, 1313, 1318, 4991, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {1328,5894,1354,6158,14,3743,0,0,0,0,0,0,0,0},{3755,9926,0,0,0,0,0,0},{301,1404,5006,5012,5022,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {17326, 1996, 1420, 1404, 2005, 17344, 17358, 17363, {34550, 34558, 34566, 34574, 34586, 34595, 34607}, {17448, 17453, 17458, 17463, 17468, 17473, 17478}, {2113, 2486, 2775, 6251, 2775, 15394, 2494}, {17483, 17500, 17513, 17527, 17540, 17553, 17566, 17580, 17592, 17606, 17620, 17634, 0}, {17483, 17500, 17513, 17527, 17540, 17553, 17566, 17580, 17592, 17606, 17620, 17634, 0}, {34618, 34629, 34636, 34644, 34651, 34658, 34665, 34673, 34679, 34687, 34695, 34703, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {1996,2670,2926,1328,0,0,0,0,0,0,0,0,0,0},{17326,0,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {4014, 270, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{35,301,0,0,0,0,0,0,0,0,0,0},{23,307,0,0,0,0,0,0,0}},
-       {1445, 3010, 1960, 1943, 1476, 1492, 1505, 1512, {1519, 1529, 1539, 1549, 1559, 1569, 1579}, {1589, 1596, 1603, 1610, 1617, 1624, 1631}, {1638, 1642, 1646, 1650, 1654, 1658, 1662}, {1666, 1673, 1680, 1687, 1694, 1701, 1708, 1715, 1722, 1729, 1736, 1746, 0}, {1666, 1673, 1680, 1687, 1694, 1701, 1708, 1715, 1722, 1729, 1736, 1746, 0}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3010,1347,14,1866,1880,1467,1837,1328,0,0,0,0,0,0},{1445,6634,0,0,0,0,0,0},{1943,1951,1404,301,0,0,0,0,0,0,0,0},{1960,1971,1420,307,0,0,0,0,0}},
-       {2651, 2670, 307, 301, 2005, 55, 2681, 2687, {2694, 2702, 2709, 2718, 2727, 2738, 2746}, {2754, 2757, 2760, 2763, 2766, 2769, 2772}, {2113, 2486, 2775, 2486, 2775, 2492, 2113}, {2777, 2784, 2792, 2798, 2804, 2808, 2813, 2818, 2825, 2835, 2843, 2852, 0}, {2777, 2784, 2792, 2798, 2804, 2808, 2813, 2818, 2825, 2835, 2843, 2852, 0}, {2861, 2865, 2869, 2874, 2804, 2878, 2882, 2886, 2890, 2894, 2898, 2902, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {2670,1363,2918,2926,1996,1328,0,0,0,0,0,0,0,0},{2651,1983,2933,0,0,0,0,0},{301,1404,2350,2945,0,0,0,0,0,0,0,0},{307,2956,2970,2985,0,0,0,0,0}},
-       {34710, 270, 3019, 3030, 44, 3796, 3804, 3807, {3810, 3817, 3824, 3832, 3842, 3851, 3858}, {3867, 3871, 3875, 3879, 3883, 3887, 3891}, {2113, 2486, 2488, 3895, 2488, 2492, 2113}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {2861, 2865, 3951, 2874, 3920, 2878, 2882, 2886, 2890, 3955, 2898, 3959, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,1347,1328,5894,34721,3990,14129,0,0,0,0,0,0},{34710,34729,6451,3767,0,0,0,0},{3030,35,301,1404,0,0,0,0,0,0,0,0},{3019,23,307,1420,0,0,0,0,0}},
-       {4028, 270, 23, 35, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,14078,1347,1354,1328,0,0,0,0,0,0,0,0},{4028,4254,4281,0,0,0,0,0},{35,3030,1404,301,0,0,0,0,0,0,0,0},{23,3019,1420,307,0,0,0,0,0}},
-       {4771, 2670, 307, 301, 2005, 4788, 3804, 3807, {4795, 4804, 4810, 4816, 4825, 4831, 4840}, {4847, 4852, 4857, 4862, 4867, 4872, 4877}, {2775, 2494, 2486, 2486, 4155, 4157, 2113}, {4882, 4890, 4899, 4904, 4910, 4914, 4919, 4927, 4933, 4943, 1143, 4951, 0}, {4882, 4890, 4899, 4904, 4910, 4914, 4919, 4927, 4933, 4943, 1143, 4951, 0}, {4961, 4967, 4899, 4974, 4910, 4914, 4979, 4927, 4985, 1313, 1318, 4991, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {2670,1363,33784,2926,1328,0,0,0,0,0,0,0,0,0},{4771,3755,4997,0,0,0,0,0},{301,1404,5006,5012,5022,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {4014, 2374, 1420, 1404, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 2624, 268, {2374,1354,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{1404,301,35,0,0,0,0,0,0,0,0,0},{1420,307,23,0,0,0,0,0,0}},
-       {1445, 3010, 1420, 1404, 1476, 1492, 1505, 1512, {1519, 1529, 1539, 1549, 1559, 1569, 1579}, {33603, 33610, 33617, 33624, 33631, 33638, 33645}, {1638, 1642, 1646, 1650, 1654, 1658, 1662}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3010,1347,14,1866,1880,1467,1837,1328,0,0,0,0,0,0},{1445,34742,34769,2626,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {2651, 2670, 307, 301, 2005, 55, 2681, 2687, {2694, 2702, 2709, 2718, 2727, 2738, 2746}, {2754, 2757, 2760, 2763, 2766, 2769, 2772}, {2113, 2486, 2775, 2486, 2775, 2492, 2113}, {2777, 2784, 2792, 2798, 2804, 2808, 2813, 2818, 2825, 2835, 2843, 2852, 0}, {2777, 2784, 2792, 2798, 2804, 2808, 2813, 2818, 2825, 2835, 2843, 2852, 0}, {2861, 2865, 2869, 2874, 2804, 2878, 2882, 2886, 2890, 2894, 2898, 2902, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {2670,1363,2918,33784,2926,1328,0,0,0,0,0,0,0,0},{2651,1983,33794,0,0,0,0,0},{301,1404,8082,8072,2945,8105,8110,8091,8097,0,0,0},{307,1420,8142,8155,2970,2956,2985,0,0}},
-       {2992, 14078, 3019, 3030, 2005, 55, 3804, 3807, {3810, 3817, 3824, 3832, 3842, 3851, 3858}, {3867, 3871, 3875, 3879, 3883, 3887, 3891}, {2113, 2486, 2488, 3895, 2488, 2492, 2113}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {2861, 2865, 3951, 2874, 3920, 2878, 2882, 2886, 2890, 3955, 2898, 3959, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {14078,1339,14,2918,1328,0,0,0,0,0,0,0,0,0},{2992,3755,0,0,0,0,0,0},{3030,35,301,1404,0,0,0,0,0,0,0,0},{3019,23,307,1420,0,0,0,0,0}},
-       {4028, 270, 23, 35, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 266, 268, {270,14,1347,1354,1328,0,0,0,0,0,0,0,0,0},{4028,4254,4281,0,0,0,0,0},{35,3030,1404,301,0,0,0,0,0,0,0,0},{23,3019,1420,307,0,0,0,0,0}},
-       {4771, 270, 307, 301, 2005, 4788, 3804, 3807, {4795, 4804, 4810, 4816, 4825, 4831, 4840}, {4847, 4852, 4857, 4862, 4867, 4872, 4877}, {2775, 2494, 2486, 2486, 4155, 4157, 2113}, {4882, 4890, 4899, 4904, 4910, 4914, 4919, 4927, 4933, 4943, 1143, 4951, 0}, {4882, 4890, 4899, 4904, 4910, 4914, 4919, 4927, 4933, 4943, 1143, 4951, 0}, {4961, 4967, 4899, 4974, 4910, 4914, 4979, 4927, 4985, 1313, 1318, 4991, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,14,1363,1354,1328,0,0,0,0,0,0,0,0,0},{4771,4997,3755,0,0,0,0,0},{301,1404,5006,5012,5022,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {4014, 2374, 1420, 1404, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 2624, 268, {2374,1354,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{1404,301,35,0,0,0,0,0,0,0,0,0},{1420,307,23,0,0,0,0,0,0}},
-       {5510, 270, 307, 301, 2005, 55, 973, 978, {3810, 3817, 3824, 3832, 3842, 3851, 3858}, {3867, 3871, 3875, 3879, 3883, 3887, 3891}, {2113, 2486, 2488, 3895, 2488, 2492, 2113}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {2861, 2865, 3951, 2874, 3920, 2878, 2882, 2886, 2890, 3955, 2898, 3959, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,14,1347,2926,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,0,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {4028, 3979, 23, 35, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3979,3970,1347,14,1354,1328,0,0,0,0,0,0,0,0},{4028,4254,4281,0,0,0,0,0},{35,3030,1404,301,0,0,0,0,0,0,0,0},{23,3019,1420,307,0,0,0,0,0}},
-       {4771, 270, 307, 301, 2005, 4788, 3804, 3807, {4795, 4804, 4810, 4816, 4825, 4831, 4840}, {4847, 4852, 4857, 4862, 4867, 4872, 4877}, {2775, 2494, 2486, 2486, 4155, 4157, 2113}, {4882, 4890, 4899, 4904, 4910, 4914, 4919, 4927, 4933, 4943, 1143, 4951, 0}, {4882, 4890, 4899, 4904, 4910, 4914, 4919, 4927, 4933, 4943, 1143, 4951, 0}, {4961, 4967, 4899, 4974, 4910, 4914, 4979, 4927, 4985, 1313, 1318, 4991, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 266, 268, {270,14,1363,1354,1328,0,0,0,0,0,0,0,0,0},{4771,4997,3755,0,0,0,0,0},{301,1404,5006,5012,5022,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {1983, 1996, 1420, 1404, 2005, 2385, 34785, 34795, {11560, 34803, 8961, 11585, 8976, 8986, 8992}, {8999, 9003, 9007, 11606, 9015, 9020, 9024}, {9028, 9030, 9032, 1076, 9034, 9030, 1076}, {2496, 2503, 34814, 2517, 2523, 2596, 2600, 11626, 34819, 34829, 34837, 34846, 0}, {2496, 2503, 34814, 2517, 2523, 2596, 2600, 11626, 34819, 34829, 34837, 34846, 0}, {2580, 2584, 2588, 2592, 2523, 2596, 2600, 11633, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {1996,2926,9345,2670,9544,1363,11637,1328,0,0,0,0,0,0},{1983,2637,2651,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {4014, 2374, 1420, 1404, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {2374,1354,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{1404,301,35,0,0,0,0,0,0,0,0,0},{1420,307,23,0,0,0,0,0,0}},
-       {5510, 1837, 23, 35, 2005, 55, 3804, 3807, {3810, 3817, 3824, 3832, 3842, 3851, 3858}, {3867, 3871, 3875, 3879, 3883, 3887, 3891}, {2113, 2486, 2488, 3895, 2488, 2492, 2113}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {2861, 2865, 3951, 2874, 3920, 2878, 2882, 2886, 2890, 3955, 2898, 3959, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1837,1880,1328,0,0,0,0,0,0,0,0,0,0,0},{5510,0,0,0,0,0,0,0},{35,301,0,0,0,0,0,0,0,0,0,0},{23,307,0,0,0,0,0,0,0}},
-       {4028, 270, 23, 35, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,3979,1347,1354,1328,0,0,0,0,0,0,0,0},{4028,4254,4281,0,0,0,0,0},{35,3030,1404,301,0,0,0,0,0,0,0,0},{23,3019,1420,307,0,0,0,0,0}},
-       {1983, 1996, 1420, 1404, 44, 2385, 34855, 34873, {34888, 34901, 34920, 34933, 34948, 34965, 11259}, {34976, 34983, 34990, 34997, 35004, 35011, 35018}, {555, 558, 35025, 564, 567, 558, 564}, {35028, 35041, 600, 609, 14822, 14829, 14838, 641, 35056, 35075, 35090, 35107, 0}, {35028, 35041, 600, 609, 14822, 14829, 14838, 641, 35056, 35075, 35090, 35107, 0}, {35124, 35131, 35138, 35145, 14822, 35152, 35159, 35166, 35173, 35180, 35187, 35194, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {1996,2926,9345,2670,9544,1363,11637,1328,0,0,0,0,0,0},{1983,2637,2651,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {4014, 270, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{35,301,1404,0,0,0,0,0,0,0,0,0},{23,307,1420,0,0,0,0,0,0}},
-       {3767, 270, 23, 35, 44, 3796, 3804, 3807, {3810, 3817, 3824, 3832, 3842, 3851, 3858}, {3867, 3871, 3875, 3879, 3883, 3887, 3891}, {2113, 2486, 2488, 3895, 2488, 2492, 2113}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {2861, 2865, 3951, 2874, 3920, 2878, 2882, 2886, 2890, 3955, 2898, 3959, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,1328,0,0,0,0,0,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{35,3030,1404,301,0,0,0,0,0,0,0,0},{23,3019,1420,307,0,0,0,0,0}},
-       {4028, 270, 23, 35, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,1347,1354,1328,0,0,0,0,0,0,0,0,0},{4028,4254,4281,0,0,0,0,0},{35,3030,1404,301,0,0,0,0,0,0,0,0},{23,3019,1420,307,0,0,0,0,0}},
-       {4014, 270, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{35,301,1404,0,0,0,0,0,0,0,0,0},{23,307,1420,0,0,0,0,0,0}},
-       {4028, 270, 23, 35, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,14078,1347,1354,1328,0,0,0,0,0,0,0,0},{4028,4254,4281,0,0,0,0,0},{35,3030,1404,301,0,0,0,0,0,0,0,0},{23,3019,1420,307,0,0,0,0,0}},
-       {1983, 1996, 1420, 1404, 2005, 2385, 34785, 34795, {11560, 34803, 8961, 11585, 8976, 8986, 8992}, {8999, 9003, 9007, 11606, 9015, 9020, 9024}, {9028, 9030, 9032, 1076, 9034, 9030, 1076}, {2496, 2503, 34814, 2517, 2523, 2596, 2600, 11626, 34819, 34829, 34837, 34846, 0}, {2496, 2503, 34814, 2517, 2523, 2596, 2600, 11626, 34819, 34829, 34837, 34846, 0}, {2580, 2584, 2588, 2592, 2523, 2596, 2600, 11633, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {1996,2926,9345,2670,9544,1363,11637,1328,0,0,0,0,0,0},{1983,2637,2651,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {4014, 270, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {35201, 35225, 35234, 35243, 35254, 35263, 35276, 35285, 35290, 35301, 35323, 35347, 0}, {35201, 35225, 35234, 35243, 35254, 35263, 35276, 35285, 35290, 35301, 35323, 35347, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{35,301,1404,0,0,0,0,0,0,0,0,0},{23,307,1420,0,0,0,0,0,0}},
-       {14099, 270, 23, 35, 2005, 55, 3804, 3807, {3810, 3817, 3824, 3832, 3842, 3851, 3858}, {3867, 3871, 3875, 3879, 3883, 3887, 3891}, {2113, 2486, 2488, 3895, 2488, 2492, 2113}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {2861, 2865, 3951, 2874, 3920, 2878, 2882, 2886, 2890, 3955, 2898, 3959, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,1328,0,0,0,0,0,0,0,0,0,0,0,0},{14099,0,0,0,0,0,0,0},{35,301,0,0,0,0,0,0,0,0,0,0},{23,307,0,0,0,0,0,0,0}},
-       {4028, 270, 23, 35, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,1347,1354,1328,0,0,0,0,0,0,0,0,0},{4028,4254,4281,0,0,0,0,0},{35,3030,1404,301,0,0,0,0,0,0,0,0},{23,3019,1420,307,0,0,0,0,0}},
-       {1983, 1996, 1420, 1404, 2005, 2385, 34855, 34873, {34888, 34901, 34920, 8443, 34948, 34965, 11259}, {34976, 34983, 34990, 35369, 35004, 35011, 35018}, {555, 558, 35025, 564, 567, 558, 564}, {35028, 35041, 600, 609, 14822, 35152, 35159, 641, 35056, 35075, 35090, 35107, 0}, {35028, 35041, 600, 609, 14822, 35152, 35159, 641, 35056, 35075, 35090, 35107, 0}, {35124, 35131, 35138, 35145, 14822, 35152, 35159, 35166, 35173, 35180, 35187, 35194, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {1996,2926,9345,2670,9544,1363,11637,1328,0,0,0,0,0,0},{1983,2637,2651,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {4014, 270, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {35201, 35225, 35234, 35243, 35254, 35263, 35276, 35285, 35290, 35301, 35323, 35347, 0}, {35201, 35225, 35234, 35243, 35254, 35263, 35276, 35285, 35290, 35301, 35323, 35347, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{35,301,1404,0,0,0,0,0,0,0,0,0},{23,307,1420,0,0,0,0,0,0}},
-       {14099, 270, 23, 35, 2005, 55, 3804, 3807, {3810, 3817, 3824, 3832, 3842, 3851, 3858}, {3867, 3871, 3875, 3879, 3883, 3887, 3891}, {2113, 2486, 2488, 3895, 2488, 2492, 2113}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {2861, 2865, 3951, 2874, 3920, 2878, 2882, 2886, 2890, 3955, 2898, 3959, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,1328,0,0,0,0,0,0,0,0,0,0,0,0},{14099,0,0,0,0,0,0,0},{35,301,0,0,0,0,0,0,0,0,0,0},{23,307,0,0,0,0,0,0,0}},
-       {4028, 270, 23, 35, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,1347,1354,1328,0,0,0,0,0,0,0,0,0},{4028,4254,4281,0,0,0,0,0},{35,3030,301,1404,0,0,0,0,0,0,0,0},{23,3019,307,1420,0,0,0,0,0}},
-       {1983, 1996, 1420, 1404, 2005, 2385, 34785, 34795, {11560, 34803, 8961, 11585, 8976, 8986, 8992}, {8999, 9003, 9007, 11606, 9015, 9020, 9024}, {9028, 9030, 9032, 1076, 9034, 9030, 1076}, {2496, 2503, 34814, 2517, 2523, 2596, 2600, 11626, 34819, 34829, 34837, 34846, 0}, {2496, 2503, 34814, 2517, 2523, 2596, 2600, 11626, 34819, 34829, 34837, 34846, 0}, {2580, 2584, 2588, 2592, 2523, 2596, 2600, 11633, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {1996,2926,9345,2670,9544,1363,11637,1328,0,0,0,0,0,0},{1983,2637,2651,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {4014, 270, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {35201, 35225, 35234, 35243, 35254, 35263, 35276, 35285, 35290, 35301, 35323, 35347, 0}, {35201, 35225, 35234, 35243, 35254, 35263, 35276, 35285, 35290, 35301, 35323, 35347, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{35,301,1404,0,0,0,0,0,0,0,0,0},{23,307,1420,0,0,0,0,0,0}},
-       {3767, 3787, 3019, 3030, 44, 3796, 3804, 3807, {3810, 3817, 3824, 3832, 3842, 3851, 3858}, {3867, 3871, 3875, 3879, 3883, 3887, 3891}, {2113, 2486, 2488, 3895, 2488, 2492, 2113}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {2861, 2865, 3951, 2874, 3920, 2878, 2882, 2886, 2890, 3955, 2898, 3959, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3787,3963,3970,3979,1328,1880,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {4028, 270, 1420, 1404, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 266, 268, {270,14,1347,1354,1328,0,0,0,0,0,0,0,0,0},{4028,4254,4281,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {1983, 1996, 1420, 1404, 2005, 2385, 34855, 34873, {34888, 34901, 34920, 8443, 34948, 34965, 11259}, {34976, 34983, 34990, 35369, 35004, 35011, 35018}, {555, 558, 35025, 564, 567, 558, 564}, {35028, 35041, 600, 609, 14822, 35152, 35159, 641, 35056, 35075, 35090, 35107, 0}, {35028, 35041, 600, 609, 14822, 35152, 35159, 641, 35056, 35075, 35090, 35107, 0}, {35124, 35131, 35138, 35145, 14822, 35152, 35159, 35166, 35173, 35180, 35187, 35194, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {1996,2926,9345,2670,9544,1363,11637,1328,0,0,0,0,0,0},{1983,2637,2651,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {4014, 270, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{35,301,1404,0,0,0,0,0,0,0,0,0},{23,307,1420,0,0,0,0,0,0}},
-       {3767, 3787, 3019, 3030, 44, 3796, 3804, 3807, {3810, 3817, 3824, 3832, 3842, 3851, 3858}, {3867, 3871, 3875, 3879, 3883, 3887, 3891}, {2113, 2486, 2488, 3895, 2488, 2492, 2113}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {2861, 2865, 3951, 2874, 3920, 2878, 2882, 2886, 2890, 3955, 2898, 3959, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3787,3963,3970,3979,1328,1880,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {4028, 2374, 1420, 1404, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 2624, 268, {2374,1354,14,1347,1328,0,0,0,0,0,0,0,0,0},{4028,4254,4281,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {4014, 270, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{35,301,1404,0,0,0,0,0,0,0,0,0},{23,307,1420,0,0,0,0,0,0}},
-       {4028, 270, 23, 35, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 266, 268, {270,14,1347,1354,1328,0,0,0,0,0,0,0,0,0},{4028,4254,4281,0,0,0,0,0},{35,3030,1404,301,0,0,0,0,0,0,0,0},{23,3019,1420,307,0,0,0,0,0}},
-       {4014, 270, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{35,301,1404,0,0,0,0,0,0,0,0,0},{23,307,1420,0,0,0,0,0,0}},
-       {4028, 270, 23, 35, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,1347,1354,1328,0,0,0,0,0,0,0,0,0},{4028,4254,4281,0,0,0,0,0},{35,3030,1404,301,0,0,0,0,0,0,0,0},{23,3019,1420,307,0,0,0,0,0}},
-       {4014, 270, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 6, 266, 268, {270,14,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{35,301,1404,0,0,0,0,0,0,0,0,0},{23,307,1420,0,0,0,0,0,0}},
-       {5510, 2374, 307, 301, 44, 55, 3804, 3807, {3810, 3817, 3824, 3832, 3842, 3851, 3858}, {3867, 3871, 3875, 3879, 3883, 3887, 3891}, {2113, 2486, 2488, 3895, 2488, 2492, 2113}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {2861, 2865, 3951, 2874, 3920, 2878, 2882, 2886, 2890, 3955, 2898, 3959, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {2374,1354,2335,2926,1328,0,0,0,0,0,0,0,0,0},{5510,3755,0,0,0,0,0,0},{301,1404,1951,0,0,0,0,0,0,0,0,0},{307,1420,1971,1960,0,0,0,0,0}},
-       {4028, 270, 23, 35, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,1347,1354,1328,0,0,0,0,0,0,0,0,0},{4028,4254,4281,0,0,0,0,0},{35,3030,1404,301,0,0,0,0,0,0,0,0},{23,3019,1420,307,0,0,0,0,0}},
-       {4028, 270, 23, 35, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,32989,1328,0,0,0,0,0,0,0,0,0,0},{4028,0,0,0,0,0,0,0},{35,301,0,0,0,0,0,0,0,0,0,0},{23,307,0,0,0,0,0,0,0}},
-       {35376, 3010, 3019, 3030, 44, 4788, 3804, 3807, {3810, 3817, 3824, 3832, 3842, 3851, 3858}, {3867, 3871, 3875, 3879, 3883, 3887, 3891}, {2113, 2486, 2488, 3895, 2488, 2492, 2113}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {3897, 3905, 3914, 2798, 3920, 3924, 3929, 2818, 2825, 3934, 2843, 3942, 0}, {2861, 2865, 3951, 2874, 3920, 2878, 2882, 2886, 2890, 3955, 2898, 3959, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3010,1347,270,14,1328,0,0,0,0,0,0,0,0,0},{35376,13623,0,0,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {4028, 270, 23, 35, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,32989,1328,0,0,0,0,0,0,0,0,0,0},{4028,0,0,0,0,0,0,0},{35,301,0,0,0,0,0,0,0,0,0,0},{23,307,0,0,0,0,0,0,0}},
-       {4028, 270, 23, 35, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,32989,1328,0,0,0,0,0,0,0,0,0,0},{4028,0,0,0,0,0,0,0},{35,301,0,0,0,0,0,0,0,0,0,0},{23,307,0,0,0,0,0,0,0}},
-       {4028, 270, 23, 35, 4057, 55, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {270,14,32989,1328,0,0,0,0,0,0,0,0,0,0},{4028,0,0,0,0,0,0,0},{35,301,0,0,0,0,0,0,0,0,0,0},{23,307,0,0,0,0,0,0,0}},
-       {3767, 3787, 3019, 3030, 4057, 7671, 973, 978, {4072, 4080, 4086, 4093, 4104, 4111, 4119}, {4127, 4131, 2588, 4135, 4140, 4144, 4148}, {2775, 2494, 2486, 4153, 4155, 4157, 2113}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4159, 4165, 4173, 1097, 4179, 4184, 4190, 4196, 4203, 1135, 4214, 4224, 0}, {4234, 2584, 2588, 4238, 4179, 2596, 2600, 4242, 2608, 4246, 2616, 4250, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3787,3963,3970,3979,1880,1328,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}},
-       {1983, 1996, 1420, 1404, 2005, 2385, 34855, 34873, {34888, 34901, 34920, 8443, 34948, 34965, 11259}, {34976, 34983, 34990, 35369, 35004, 35011, 35018}, {555, 558, 35025, 564, 567, 558, 564}, {35028, 35041, 600, 609, 14822, 35152, 35159, 641, 35056, 35075, 35090, 35107, 0}, {35028, 35041, 600, 609, 14822, 35152, 35159, 641, 35056, 35075, 35090, 35107, 0}, {35124, 35131, 35138, 35145, 14822, 35152, 35159, 35166, 35173, 35180, 35187, 35194, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {1996,2926,9345,2670,9544,1363,11637,1328,0,0,0,0,0,0},{1983,2637,2651,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {1983, 1996, 1420, 1404, 2005, 2385, 34785, 34795, {11560, 34803, 8961, 11585, 8976, 8986, 8992}, {8999, 9003, 9007, 11606, 9015, 9020, 9024}, {9028, 9030, 9032, 1076, 9034, 9030, 1076}, {2496, 2503, 34814, 2517, 2523, 2596, 2600, 11626, 34819, 34829, 34837, 34846, 0}, {2496, 2503, 34814, 2517, 2523, 2596, 2600, 11626, 34819, 34829, 34837, 34846, 0}, {2580, 2584, 2588, 2592, 2523, 2596, 2600, 11633, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {1996,2926,9345,2670,9544,1363,11637,1328,0,0,0,0,0,0},{1983,2637,2651,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {3755, 2670, 1420, 1404, 2005, 4788, 0, 0, {33977, 33988, 34012, 34042, 34059, 34081, 34090}, {14265, 14268, 14273, 14279, 14283, 7409, 14288}, {251, 239, 241, 243, 245, 247, 249}, {34101, 34114, 600, 34127, 620, 34138, 34147, 641, 34156, 34173, 34188, 34201, 0}, {34101, 34114, 600, 34127, 620, 34138, 34147, 641, 34156, 34173, 34188, 34201, 0}, {14362, 7848, 2588, 2592, 14366, 14370, 14374, 14378, 14382, 2612, 14386, 14390, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1363,2926,14,1328,0,0,0,0,0,0,0,0,0},{3755,5510,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {1445, 1467, 1420, 1404, 1476, 1492, 1505, 1512, {1519, 1529, 1539, 1549, 1559, 1569, 1579}, {1589, 1596, 1603, 1610, 1617, 1624, 1631}, {1638, 1642, 1646, 1650, 1654, 1658, 1662}, {1666, 1673, 1680, 1687, 1694, 1701, 1708, 1715, 1722, 1729, 1736, 1746, 0}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {1666, 1673, 1680, 1687, 1694, 1701, 1708, 1715, 1722, 1729, 1736, 1746, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1467,1819,1828,1328,1837,1848,1859,1866,1873,1880,0,0,0,0},{1445,1889,1916,0,0,0,0,0},{1404,301,1943,1951,0,0,0,0,0,0,0,0},{1420,307,1960,1971,0,0,0,0,0}},
-       {1983, 2670, 307, 301, 2005, 2385, 2393, 2398, {2403, 9830, 33814, 2426, 2433, 2441, 33821}, {2456, 9858, 33829, 2469, 2473, 2477, 6027}, {2113, 2486, 2488, 2490, 2488, 2492, 2494}, {2496, 2503, 4899, 2517, 4910, 2527, 2532, 2537, 2544, 2554, 2562, 6099, 0}, {2496, 2503, 4899, 2517, 4910, 2527, 2532, 2537, 2544, 2554, 2562, 6099, 0}, {2580, 2584, 2588, 2592, 4910, 2596, 2600, 2604, 2608, 2612, 2616, 6129, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {2670,1363,2926,1328,2906,0,0,0,0,0,0,0,0,0},{1983,2637,0,0,0,0,0,0},{301,1404,7291,5006,0,0,0,0,0,0,0,0},{307,1420,7302,6460,0,0,0,0,0}},
-       {1983, 1996, 1420, 1404, 2005, 2385, 34785, 34795, {8940, 8949, 8961, 8968, 8976, 8986, 8992}, {8999, 9003, 9007, 9011, 9015, 9020, 9024}, {0, 0, 0, 0, 0, 0, 0}, {2496, 2503, 34814, 2517, 2523, 2527, 2532, 11626, 34819, 34829, 34837, 34846, 0}, {2496, 2503, 34814, 2517, 2523, 2527, 2532, 11626, 34819, 34829, 34837, 34846, 0}, {2580, 2584, 2588, 2592, 2523, 2596, 2600, 11633, 2608, 2612, 2616, 2620, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 790, 268, {1996,2926,9345,2670,9544,1363,11637,1328,0,0,0,0,0,0},{1983,2637,2651,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {3755, 2670, 1420, 1404, 2005, 4788, 0, 0, {14176, 14182, 14196, 14219, 14233, 14249, 14256}, {14265, 14268, 14273, 14279, 14283, 7409, 14288}, {251, 239, 241, 243, 245, 247, 249}, {14292, 14299, 10127, 14306, 3920, 14312, 14318, 14324, 14331, 14340, 14348, 14355, 0}, {14292, 14299, 10127, 14306, 3920, 14312, 14318, 14324, 14331, 14340, 14348, 14355, 0}, {14362, 7848, 2588, 2592, 14366, 14370, 14374, 14378, 14382, 2612, 14386, 14390, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1363,2926,14,1328,0,0,0,0,0,0,0,0,0},{3755,5510,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {34214, 2670, 307, 301, 2005, 18717, 0, 0, {18724, 18739, 18754, 18769, 18786, 18803, 18812}, {18823, 18830, 18837, 18844, 18851, 18858, 18865}, {18872, 18875, 8540, 8543, 8537, 18878, 18881}, {12763, 12774, 8574, 12787, 8596, 12798, 12805, 8621, 12812, 12827, 12840, 12851, 0}, {12763, 12774, 8574, 12787, 8596, 12798, 12805, 8621, 12812, 12827, 12840, 12851, 0}, {12864, 12871, 12878, 12885, 8596, 12798, 12805, 12892, 12899, 12906, 12913, 12920, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {2670,1363,18706,2926,14,1328,0,0,0,0,0,0,0,0},{34214,3755,5510,0,0,0,0,0},{301,1404,0,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {24804, 24825, 1420, 1404, 24834, 4788, 0, 0, {24851, 24858, 24869, 24882, 24895, 24906, 24919}, {24930, 24935, 24940, 24945, 24950, 24955, 24960}, {0, 0, 0, 0, 0, 0, 0}, {24965, 24980, 24989, 24996, 25009, 25016, 25027, 25036, 25045, 25052, 25063, 25074, 0}, {24965, 24980, 24989, 24996, 25009, 25016, 25027, 25036, 25045, 25052, 25063, 25074, 0}, {25085, 25092, 25099, 25106, 25113, 25120, 25127, 25134, 25141, 25148, 25155, 25162, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 790, 268, {24825,1328,0,0,0,0,0,0,0,0,0,0,0,0},{24804,0,0,0,0,0,0,0},{1404,0,0,0,0,0,0,0,0,0,0,0},{1420,0,0,0,0,0,0,0,0}},
-       {1445, 3010, 1420, 1404, 1476, 1492, 1505, 1512, {1519, 1529, 1539, 1549, 1559, 1569, 1579}, {33603, 33610, 33617, 33624, 33631, 33638, 33645}, {1638, 1642, 1646, 1650, 1654, 1658, 1662}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3010,1347,14,1866,1880,1467,1837,1328,0,0,0,0,0,0},{1445,6634,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {1445, 3010, 1420, 1404, 1476, 1492, 1505, 1512, {1519, 1529, 1539, 1549, 1559, 1569, 1579}, {33603, 33610, 33617, 33624, 33631, 33638, 33645}, {1638, 1642, 1646, 1650, 1654, 1658, 1662}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {1756, 1761, 1766, 1771, 1776, 1781, 1786, 1791, 1796, 1801, 1807, 1813, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3010,1347,14,1866,1880,1467,1837,1328,0,0,0,0,0,0},{1445,6634,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {1983, 2670, 307, 301, 2005, 2385, 973, 978, {2403, 2411, 2418, 2426, 2433, 2441, 2448}, {7261, 7266, 7270, 7274, 7278, 7282, 7286}, {2113, 2486, 2488, 2490, 2488, 2492, 2494}, {2496, 2503, 4899, 2517, 4910, 2527, 2532, 2537, 2544, 2554, 2562, 6099, 0}, {2496, 2503, 4899, 2517, 4910, 2527, 2532, 2537, 2544, 2554, 2562, 6099, 0}, {2580, 2584, 2588, 2592, 4910, 2596, 2600, 2604, 2608, 2612, 2616, 6129, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 2, 1, 790, 268, {2670,1363,2926,1328,2906,0,0,0,0,0,0,0,0,0},{1983,2637,0,0,0,0,0,0},{301,1404,7291,5006,0,0,0,0,0,0,0,0},{307,1420,7302,6460,0,0,0,0,0}},
-       {1983, 1996, 1420, 1404, 2005, 2385, 34855, 34873, {34888, 34901, 34920, 8443, 34948, 34965, 11259}, {34976, 34983, 34990, 35369, 35004, 35011, 35018}, {555, 558, 35025, 564, 567, 558, 564}, {35028, 35041, 600, 609, 14822, 35152, 35159, 641, 35056, 35075, 35090, 35107, 0}, {35028, 35041, 600, 609, 14822, 35152, 35159, 641, 35056, 35075, 35090, 35107, 0}, {35124, 35131, 35138, 35145, 14822, 35152, 35159, 35166, 35173, 35180, 35187, 35194, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {1996,2926,9345,2670,9544,1363,11637,1328,0,0,0,0,0,0},{1983,2637,2651,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {3755, 1363, 1420, 1404, 2005, 3796, 12587, 12599, {12611, 12626, 12641, 12656, 12673, 12692, 12703}, {12714, 12721, 12728, 12735, 12742, 12749, 12756}, {0, 0, 0, 0, 0, 0, 0}, {12763, 12774, 8574, 12787, 8596, 12798, 12805, 8621, 12812, 12827, 12840, 12851, 0}, {12763, 12774, 8574, 12787, 8596, 12798, 12805, 8621, 12812, 12827, 12840, 12851, 0}, {12864, 12871, 12878, 12885, 8596, 12798, 12805, 12892, 12899, 12906, 12913, 12920, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 790, 268, {1363,1328,0,0,0,0,0,0,0,0,0,0,0,0},{3755,0,0,0,0,0,0,0},{1404,301,0,0,0,0,0,0,0,0,0,0},{1420,0,0,0,0,0,0,0,0}},
-       {18688, 18706, 307, 301, 2005, 18717, 0, 0, {33652, 33662, 33671, 33680, 33691, 33701, 33706}, {33713, 33719, 33724, 33729, 33734, 10104, 33738}, {33743, 2775, 2113, 7409, 2108, 7409, 2113}, {14292, 14299, 10127, 14306, 3920, 33745, 33750, 33755, 14331, 14340, 14348, 14355, 0}, {14292, 14299, 10127, 14306, 3920, 33745, 33750, 33755, 14331, 14340, 14348, 14355, 0}, {33762, 33767, 3951, 2874, 3920, 33745, 33750, 33771, 10482, 2894, 33775, 33780, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 1, 266, 268, {18706,1363,2926,14,1328,0,0,0,0,0,0,0,0,0},{18688,3755,5510,0,0,0,0,0},{301,1404,0,0,0,0,0,0,0,0,0,0},{307,1420,0,0,0,0,0,0,0}},
-       {34235, 1467, 1420, 1404, 34311, 34343, 0, 0, {24851, 24858, 24869, 24882, 24895, 24906, 24919}, {24930, 24935, 24940, 24945, 24950, 24955, 24960}, {0, 0, 0, 0, 0, 0, 0}, {24965, 24980, 24989, 24996, 25009, 25016, 25027, 25036, 25045, 25052, 25063, 25074, 0}, {24965, 24980, 24989, 24996, 25009, 25016, 25027, 25036, 25045, 25052, 25063, 25074, 0}, {25085, 25092, 25099, 25106, 25113, 25120, 25127, 25134, 25141, 25148, 25155, 25162, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {1467,1819,1828,1848,1328,1837,1859,1866,1873,1880,0,0,0,0},{34235,34378,0,0,0,0,0,0},{1404,0,0,0,0,0,0,0,0,0,0,0},{1420,0,0,0,0,0,0,0,0}},
-       {4014, 2374, 1420, 1404, 44, 55, 29227, 29237, {29250, 29257, 29263, 29270, 29276, 29282, 29290}, {29300, 29304, 29308, 29312, 29316, 29320, 29324}, {12314, 12314, 12314, 12314, 12314, 12314, 12314}, {29330, 29339, 29348, 29353, 29359, 29365, 29371, 29378, 29384, 29393, 29402, 29410, 0}, {29330, 29339, 29348, 29353, 29359, 29365, 29371, 29378, 29384, 29393, 29402, 29410, 0}, {29419, 29423, 3951, 29427, 3920, 29431, 29435, 29439, 29444, 29448, 29454, 29458, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 2624, 268, {2374,1354,1328,0,0,0,0,0,0,0,0,0,0,0},{4014,281,0,0,0,0,0,0},{1404,301,29462,0,0,0,0,0,0,0,0,0},{1420,307,0,0,0,0,0,0,0}},
-       {3767, 3010, 3019, 3030, 44, 3796, 0, 0, {30337, 30344, 30352, 30359, 30366, 30374, 30382}, {30389, 30392, 30395, 30398, 30401, 30404, 30407}, {2494, 2494, 2488, 2494, 12314, 4155, 12314}, {30410, 30418, 30428, 30434, 30442, 30447, 30452, 30457, 30464, 18669, 30472, 30480, 0}, {30410, 30418, 30428, 30434, 30442, 30447, 30452, 30457, 30464, 18669, 30472, 30480, 0}, {2861, 30488, 3951, 30492, 3920, 29431, 29435, 30496, 3891, 2894, 30500, 15342, 0}, {239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 260, 263, 0}, 0, 0, 266, 268, {3010,1347,14,270,1880,1328,3990,0,0,0,0,0,0,0},{3767,4000,281,4014,0,0,0,0},{3030,35,1404,301,0,0,0,0,0,0,0,0},{3019,23,1420,307,0,0,0,0,0}}
+       {1, 14, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {14,243,0,0,0,0,0,0,0,0,0,0,0,0},{1,254,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+       {289, 308, 323, 338, 350, 55, 366, 378, {390, 403, 424, 439, 450, 469, 480}, {493, 498, 503, 508, 513, 518, 523}, {528, 531, 534, 537, 540, 531, 537}, {543, 556, 573, 582, 593, 600, 607, 614, 627, 646, 663, 678, 0}, {543, 556, 573, 582, 593, 600, 607, 614, 627, 646, 663, 678, 0}, {695, 701, 573, 711, 593, 600, 607, 719, 727, 737, 745, 755, 0}, {695, 701, 573, 711, 593, 600, 607, 719, 727, 737, 745, 755, 0}, 2, 1, 763, 241, {308,765,781,797,0,0,0,0,0,0,0,0,0,0},{289,814,832,857,0,0,0,0},{338,881,0,0,0,0,0,0,0,0,0,0},{323,892,0,0,0,0,0,0,0}},
+       {906, 243, 280, 274, 932, 55, 946, 951, {956, 965, 973, 981, 990, 997, 1007}, {1016, 1019, 1022, 1025, 1028, 1031, 1034}, {1037, 1039, 1041, 1043, 1045, 1047, 1049}, {1051, 1057, 1064, 1070, 1076, 1081, 1086, 1093, 1099, 1108, 1116, 1125, 0}, {1134, 1143, 1153, 1162, 1172, 1180, 1188, 1198, 1208, 1220, 1232, 1244, 0}, {1256, 1261, 1064, 1267, 1076, 1081, 1272, 1277, 1281, 1286, 1291, 1296, 0}, {1256, 1261, 1064, 1267, 1076, 1081, 1272, 1277, 1281, 1286, 1291, 1296, 0}, 2, 1, 239, 241, {243,14,1301,1312,1320,1327,1336,0,0,0,0,0,0,0},{906,1345,1361,0,0,0,0,0},{274,1377,1382,0,0,0,0,0,0,0,0,0},{280,1394,1402,0,0,0,0,0,0}},
+       {1422, 1444, 1394, 1377, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {1566, 1573, 1580, 1587, 1594, 1601, 1608}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, 0, 0, 239, 241, {1444,1796,1805,1301,1814,1825,1836,1843,1850,1857,0,0,0,0},{1422,1866,1893,0,0,0,0,0},{1377,274,1920,1928,0,0,0,0,0,0,0,0},{1394,280,1937,1948,0,0,0,0,0}},
+       {1422, 1444, 1394, 1377, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {1566, 1573, 1580, 1587, 1594, 1601, 1608}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, 0, 0, 239, 241, {1444,1796,1805,1301,1814,1825,1836,1843,1850,1857,0,0,0,0},{1422,1866,1893,0,0,0,0,0},{1377,274,1920,1928,0,0,0,0,0,0,0,0},{1394,280,1937,1948,0,0,0,0,0}},
+       {1960, 1973, 1394, 1377, 1982, 55, 1992, 1997, {2002, 2010, 2020, 2028, 2036, 2045, 2052}, {2059, 2062, 2065, 2069, 2072, 2076, 2080}, {2083, 2085, 2087, 2090, 2092, 2085, 2090}, {2095, 2101, 2107, 2115, 2121, 2129, 2137, 2147, 2153, 2161, 2169, 2178, 0}, {2187, 2193, 2200, 2208, 2214, 2222, 2230, 2240, 2153, 2246, 2254, 2264, 0}, {2273, 2276, 2279, 2282, 2285, 2288, 2291, 2294, 2297, 2300, 2304, 2308, 0}, {2273, 2276, 2279, 2282, 2285, 2288, 2291, 2294, 2297, 2300, 2304, 2308, 0}, 2, 1, 763, 241, {1973,2312,1301,1796,1836,0,0,0,0,0,0,0,0,0},{1960,0,0,0,0,0,0,0},{1377,274,2319,2327,0,0,0,0,0,0,0,0},{1394,280,2332,2343,0,0,0,0,0}},
+       {1960, 2351, 280, 274, 1982, 2362, 2370, 2375, {2380, 2388, 2395, 2403, 2410, 2418, 2425}, {2433, 2438, 2442, 2446, 2450, 2454, 2458}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {2473, 2480, 2488, 2494, 2500, 2504, 2509, 2514, 2521, 2531, 2539, 2548, 0}, {2473, 2480, 2488, 2494, 2500, 2504, 2509, 2514, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 2601, 241, {2351,1327,1301,2603,0,0,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {2628, 2647, 280, 274, 1982, 55, 2658, 2664, {2671, 2679, 2686, 2695, 2704, 2715, 2723}, {2731, 2734, 2737, 2740, 2743, 2746, 2749}, {2090, 2463, 2752, 2463, 2752, 2469, 2090}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, 2, 1, 763, 241, {2647,2883,1336,2895,2903,1973,1301,0,0,0,0,0,0,0},{2628,1960,2910,0,0,0,0,0},{274,1377,2327,2922,0,0,0,0,0,0,0,0},{280,2933,2947,2962,0,0,0,0,0}},
+       {2969, 2987, 2996, 3007, 1982, 55, 3015, 3022, {3029, 3044, 3059, 3070, 3085, 3098, 3117}, {3132, 3139, 3146, 3153, 3160, 3167, 3174}, {3181, 3184, 3187, 3187, 3190, 3190, 3193}, {3196, 3217, 3240, 3255, 3272, 3283, 3298, 3313, 3332, 3355, 3374, 3393, 0}, {3414, 3435, 3458, 3473, 3490, 3501, 3516, 3531, 3550, 3573, 3592, 3611, 0}, {3632, 3639, 3646, 3653, 3660, 3667, 3676, 3685, 3692, 3699, 3706, 3713, 0}, {3632, 3639, 3646, 3653, 3660, 3667, 3676, 3685, 3692, 3699, 3706, 3713, 0}, 2, 1, 239, 241, {2987,243,1320,14,3720,1301,0,0,0,0,0,0,0,0},{2969,3732,0,0,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {3744, 3764, 2996, 3007, 44, 3773, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {4005, 243, 1394, 1377, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 4130, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 1, 239, 241, {243,14,1312,1320,1327,1336,1301,2883,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{1377,274,1382,0,0,0,0,0,0,0,0,0},{1394,280,1402,0,0,0,0,0,0}},
+       {4280, 1973, 1394, 1377, 1982, 4297, 4309, 4313, {4317, 4329, 4341, 4351, 4365, 4375, 4387}, {4398, 4401, 4404, 4407, 4410, 4413, 4416}, {2090, 2463, 2465, 4419, 2465, 2085, 2471}, {4421, 4430, 4439, 4449, 4458, 4467, 4476, 4486, 4493, 4501, 4509, 4519, 0}, {4528, 4539, 4550, 4562, 4573, 4584, 4595, 4607, 4616, 4626, 4636, 4648, 0}, {4659, 4665, 4671, 4678, 4684, 4690, 4696, 4703, 4707, 4712, 4717, 4724, 0}, {4659, 4665, 4671, 4678, 4684, 4690, 4696, 4703, 4707, 4712, 4717, 4724, 0}, 2, 1, 763, 241, {1973,2647,2903,1301,0,0,0,0,0,0,0,0,0,0},{4280,4730,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {4748, 243, 280, 274, 1982, 4765, 3781, 3784, {4772, 4781, 4787, 4793, 4802, 4808, 4817}, {4824, 4829, 4834, 4839, 4844, 4849, 4854}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, 0, 1, 239, 241, {243,14,1336,1327,1301,0,0,0,0,0,0,0,0,0},{4748,4974,3732,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {5007, 243, 280, 274, 1982, 55, 5025, 5038, {5049, 5067, 5081, 5099, 5117, 5135, 5151}, {5165, 5177, 5189, 5201, 5213, 5225, 5237}, {5244, 5247, 5250, 5253, 5256, 5259, 5262}, {5265, 5276, 5289, 5296, 5307, 5314, 5323, 5332, 5345, 5358, 5373, 5386, 0}, {5265, 5276, 5289, 5296, 5307, 5314, 5323, 5332, 5345, 5358, 5373, 5386, 0}, {5397, 5406, 5289, 5415, 5307, 5424, 5433, 5442, 5451, 5460, 5469, 5478, 0}, {5397, 5406, 5289, 5415, 5307, 5424, 5433, 5442, 5451, 5460, 5469, 5478, 0}, 0, 0, 239, 241, {243,5487,14,1,1327,2351,5500,1301,5513,5530,0,0,0,0},{5007,5487,5540,5562,5513,0,0,0},{274,35,0,0,0,0,0,0,0,0,0,0},{280,23,0,0,0,0,0,0,0}},
+       {5583, 5597, 1394, 1377, 5609, 5620, 5628, 5632, {5636, 5646, 5654, 5659, 5666, 5679, 5687}, {4134, 5695, 4419, 5697, 5701, 2085, 5704}, {4134, 5695, 4419, 5708, 5701, 2085, 5708}, {5711, 5719, 5728, 5737, 5746, 5753, 5761, 5769, 5779, 5790, 2539, 2548, 0}, {5711, 5719, 5728, 5737, 5746, 5753, 5761, 5769, 5779, 5790, 2539, 2548, 0}, {5799, 1261, 5804, 5811, 5817, 5823, 5829, 5835, 5840, 5847, 1291, 5852, 0}, {5799, 1261, 5804, 5811, 5817, 5823, 5829, 5835, 5840, 5847, 1291, 5852, 0}, 0, 1, 763, 241, {5597,5857,1301,5871,0,0,0,0,0,0,0,0,0,0},{5583,0,0,0,0,0,0,0},{1377,274,3007,0,0,0,0,0,0,0,0,0},{1394,280,2996,0,0,0,0,0,0}},
+       {1960, 1973, 280, 274, 1982, 2362, 5880, 5885, {5890, 5901, 5912, 5926, 5940, 5952, 5964}, {5976, 5980, 5985, 5990, 5995, 5999, 6004}, {1049, 6008, 6010, 6008, 6013, 6013, 1039}, {6015, 6023, 4876, 6032, 6039, 6044, 6051, 6058, 2521, 5790, 6066, 6076, 0}, {6015, 6023, 4876, 6032, 6039, 6044, 6051, 6058, 2521, 5790, 6066, 6076, 0}, {2557, 2561, 2565, 2569, 6039, 6085, 6090, 6095, 2585, 2589, 6101, 6106, 0}, {2557, 2561, 2565, 2569, 6039, 6085, 6090, 6095, 2585, 2589, 6101, 6106, 0}, 2, 1, 763, 241, {1973,1336,6110,6122,1301,6136,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {4748, 243, 280, 274, 1982, 55, 6145, 6148, {6151, 6160, 6168, 6177, 6188, 6197, 6206}, {4104, 4108, 2565, 6213, 6217, 6221, 6225}, {2752, 2471, 2463, 2463, 6229, 4134, 2090}, {6231, 6239, 6248, 6254, 6261, 6268, 6275, 6282, 6289, 6299, 6307, 6316, 0}, {6325, 6333, 4150, 6342, 6349, 6356, 6363, 4173, 6370, 6380, 1116, 6388, 0}, {6397, 2561, 2565, 2569, 6401, 6405, 6409, 4219, 6413, 6417, 2593, 4227, 0}, {6397, 2561, 2565, 2569, 6401, 6405, 6409, 4219, 6413, 6417, 2593, 4227, 0}, 2, 1, 239, 241, {243,3720,14,6421,1320,1301,0,0,0,0,0,0,0,0},{4748,6429,3732,0,0,0,0,0},{274,1377,2327,4983,0,0,0,0,0,0,0,0},{280,2343,6438,0,0,0,0,0,0}},
+       {1422, 1814, 1394, 1377, 1453, 1469, 6447, 6454, {6461, 6471, 6481, 6491, 6501, 6511, 6521}, {1615, 6531, 6535, 6539, 6543, 6547, 6551}, {1615, 6531, 6535, 6539, 6543, 6547, 6551}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 239, 241, {1814,1857,1843,1444,6582,6601,6618,1301,0,0,0,0,0,0},{1422,6639,6663,6690,0,0,0,0},{1377,274,1920,1928,0,0,0,0,0,0,0,0},{1394,280,1937,1948,0,0,0,0,0}},
+       {6719, 1301, 1937, 1920, 6748, 6765, 6779, 6786, {6793, 6803, 6813, 6823, 6833, 6843, 6853}, {6863, 6867, 6871, 6875, 6879, 6883, 6887}, {6863, 6867, 6871, 6875, 6879, 6883, 6887}, {6891, 6896, 6901, 6906, 6911, 6916, 6921, 6926, 6931, 6936, 6942, 6948, 0}, {6891, 6896, 6901, 6906, 6911, 6916, 6921, 6926, 6931, 6936, 6942, 6948, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1301,5871,1836,1796,0,0,0,0,0,0,0,0,0,0},{6719,6954,6978,7005,7027,7058,0,0},{1920,1928,1377,274,0,0,0,0,0,0,0,0},{1937,1948,1394,280,0,0,0,0,0}},
+       {4748, 7084, 1394, 1377, 1982, 55, 946, 951, {7093, 7100, 7108, 7116, 7125, 7135, 7143}, {7152, 4401, 7155, 7158, 7161, 7164, 7167}, {7170, 2463, 2752, 3872, 2752, 4134, 7170}, {7172, 7180, 7189, 2494, 7195, 2504, 2509, 7199, 2521, 2531, 2539, 2548, 0}, {7172, 7180, 7189, 2494, 7195, 2504, 2509, 7199, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 7208, 2569, 7195, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 7208, 2569, 7195, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 2601, 241, {7084,2312,1327,14,1336,2883,1301,0,0,0,0,0,0,0},{4748,6429,3732,4974,0,0,0,0},{1377,274,2327,7212,7224,0,0,0,0,0,0,0},{1394,280,7236,7251,0,0,0,0,0}},
+       {1960, 2647, 280, 274, 1982, 2362, 946, 951, {2380, 2388, 2395, 2403, 2410, 2418, 2425}, {7266, 7271, 7275, 7279, 7283, 7287, 7291}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, 0, 0, 763, 241, {2647,1336,2903,1301,2883,0,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,7296,4983,0,0,0,0,0,0,0,0},{280,1394,7307,6438,0,0,0,0,0}},
+       {3732, 1301, 280, 274, 1982, 4765, 3781, 3784, {7321, 7331, 7345, 7352, 7359, 7368, 2052}, {7376, 7383, 7388, 7392, 7397, 7402, 7406}, {2083, 2085, 3872, 7411, 7414, 2085, 2090}, {7416, 7425, 7430, 7437, 2500, 7447, 7456, 7463, 7473, 7483, 2169, 7496, 0}, {7506, 7515, 7522, 7528, 7537, 7542, 7550, 7556, 7565, 7575, 7589, 7599, 0}, {7607, 7611, 2565, 7615, 2500, 7619, 7623, 7627, 7631, 7635, 7640, 7644, 0}, {7607, 7611, 2565, 7615, 2500, 7619, 7623, 7627, 7631, 7635, 7640, 7644, 0}, 2, 1, 2601, 241, {1301,5871,0,0,0,0,0,0,0,0,0,0,0,0},{3732,5487,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {7648, 243, 280, 274, 4034, 7676, 3781, 3784, {4049, 7689, 7703, 7716, 7729, 7742, 4096}, {4104, 7754, 7758, 7762, 7766, 7770, 4125}, {2752, 2090, 2465, 7774, 7774, 2090, 2090}, {7776, 7784, 7794, 1070, 7801, 7806, 7812, 4173, 7818, 7827, 7835, 7844, 0}, {7776, 7784, 7794, 1070, 7801, 7806, 7812, 4173, 7818, 7827, 7835, 7844, 0}, {2557, 7853, 2565, 4215, 4887, 2573, 2577, 4219, 6413, 7857, 2593, 7861, 0}, {2557, 7853, 2565, 4215, 4887, 2573, 2577, 4219, 6413, 7857, 2593, 7861, 0}, 0, 0, 239, 241, {243,14,2987,1320,1327,2351,2312,7084,1336,2647,2883,2903,1973,1301},{7648,4258,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+       {2969, 243, 280, 274, 1982, 55, 7865, 7868, {7871, 7880, 4787, 7890, 7898, 7906, 7915}, {7921, 7924, 4401, 7928, 7931, 7935, 2080}, {2752, 6229, 2463, 2463, 6229, 4134, 2090}, {7938, 7946, 4876, 7953, 7960, 7965, 7975, 7983, 7989, 7999, 2539, 2548, 0}, {7938, 7946, 4876, 7953, 7960, 7965, 7975, 7983, 7989, 7999, 2539, 2548, 0}, {8007, 8014, 4876, 4951, 7960, 8020, 8027, 7983, 8032, 1286, 1291, 5852, 0}, {8007, 8014, 4876, 4951, 7960, 8020, 8027, 7983, 8032, 1286, 1291, 5852, 0}, 2, 1, 239, 241, {243,14,1312,8038,1320,243,1301,0,0,0,0,0,0,0},{2969,3732,4974,0,0,0,0,0},{274,1377,8046,8058,8069,8077,8087,8096,2922,8102,8110,8115},{280,1394,8118,8133,2947,2933,8147,8160,2962}},
+       {3732, 2647, 280, 274, 1982, 4765, 3781, 3784, {8172, 8182, 8187, 8194, 8203, 8207, 8214}, {8225, 8228, 8231, 2740, 8234, 8237, 8240}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {8244, 8253, 8263, 8270, 4887, 8278, 8284, 2514, 8290, 8301, 8311, 8321, 0}, {8244, 8253, 8263, 8270, 4887, 8278, 8284, 2514, 8290, 8301, 8311, 8321, 0}, {8331, 8336, 4834, 8341, 4887, 8346, 8351, 5835, 4962, 1286, 1291, 5852, 0}, {8331, 8336, 4834, 8341, 4887, 8346, 8351, 5835, 4962, 1286, 1291, 5852, 0}, 0, 1, 763, 241, {2647,1973,1301,0,0,0,0,0,0,0,0,0,0,0},{3732,0,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {814, 2647, 1394, 1377, 1982, 3773, 8356, 8376, {8402, 8425, 424, 8448, 8459, 8474, 8489}, {8504, 8509, 8514, 8519, 8524, 8529, 8534}, {8539, 8542, 8539, 8545, 8548, 8542, 8545}, {8551, 8564, 8579, 8588, 8601, 8608, 8617, 8626, 8639, 8656, 8671, 8684, 0}, {8699, 8712, 8727, 8738, 8751, 8758, 8767, 8776, 8791, 8808, 8823, 8836, 0}, {8851, 8859, 8579, 8869, 8601, 8608, 8617, 8877, 8885, 8895, 8903, 8913, 0}, {8851, 8859, 8579, 8869, 8601, 8608, 8617, 8877, 8885, 8895, 8903, 8913, 0}, 0, 1, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{814,289,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {8921, 8935, 1394, 1377, 44, 2362, 3781, 3784, {8945, 8954, 8966, 8973, 8981, 8991, 8997}, {9004, 9008, 9012, 9016, 9020, 9025, 9029}, {9033, 9035, 9037, 1049, 9039, 9035, 1049}, {9042, 9052, 9061, 9069, 9077, 9085, 9092, 9099, 9107, 2169, 9113, 9121, 0}, {9130, 9140, 9149, 9157, 9165, 9173, 9180, 9187, 9196, 7589, 9202, 9212, 0}, {9221, 9225, 9230, 9235, 9239, 7623, 9243, 9247, 9251, 7640, 9255, 9259, 0}, {9221, 9225, 9230, 9235, 9239, 7623, 9243, 9247, 9251, 7640, 9255, 9259, 0}, 0, 1, 763, 241, {8935,9263,6110,9271,9283,9293,9303,1301,0,0,0,0,0,0},{8921,9315,9330,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {1960, 9350, 1394, 1377, 1982, 55, 9361, 9372, {9383, 9391, 9400, 9407, 9414, 9423, 2052}, {2059, 2062, 9430, 2069, 9433, 9437, 2080}, {2083, 2085, 9440, 2090, 9442, 2085, 2090}, {5711, 5719, 9445, 6032, 9451, 6085, 6090, 2514, 2521, 5790, 2539, 2548, 0}, {9456, 9465, 7522, 9475, 9483, 9489, 9495, 9501, 9509, 9519, 9528, 9537, 0}, {2557, 2561, 2565, 2569, 9451, 6085, 6090, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 9451, 6085, 6090, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 9546, 241, {9350,1973,9549,2903,2647,1336,1301,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{1377,274,2327,0,0,0,0,0,0,0,0,0},{1394,280,2343,0,0,0,0,0,0}},
+       {1301, 1301, 9558, 9569, 9577, 3773, 9585, 9588, {9591, 9598, 9607, 9616, 9628, 9636, 9645}, {9655, 9659, 3928, 9664, 9669, 9673, 9677}, {2752, 5695, 2463, 2463, 9681, 2085, 2090}, {9683, 9689, 4876, 9696, 2500, 9702, 9710, 9717, 9723, 9731, 9737, 9745, 0}, {9683, 9689, 4876, 9696, 2500, 9702, 9710, 9717, 9723, 9731, 9737, 9745, 0}, {2838, 9753, 3928, 9757, 9761, 9765, 9769, 9773, 9677, 9777, 9781, 9786, 0}, {2838, 9753, 3928, 9757, 9761, 9765, 9769, 9773, 9677, 9777, 9781, 9786, 0}, 0, 1, 2601, 241, {1301,5871,0,0,0,0,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0},{9569,274,0,0,0,0,0,0,0,0,0,0},{9558,280,0,0,0,0,0,0,0}},
+       {9790, 1301, 280, 274, 1982, 9808, 9821, 9824, {9827, 9835, 9843, 2403, 2410, 2418, 9850}, {9858, 9863, 9868, 2446, 2450, 2454, 9872}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {7172, 7180, 4876, 2494, 2500, 2504, 2509, 9877, 2521, 2531, 2539, 2548, 0}, {7172, 7180, 4876, 2494, 2500, 2504, 2509, 9877, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 2601, 241, {1301,5871,0,0,0,0,0,0,0,0,0,0,0,0},{9790,9885,0,0,0,0,0,0},{274,1377,9908,0,0,0,0,0,0,0,0,0},{280,1394,9918,0,0,0,0,0,0}},
+       {3732, 2987, 1394, 1377, 1982, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 239, 241, {2987,1320,14,243,9931,9942,1301,0,0,0,0,0,0,0},{3732,9954,9970,0,0,0,0,0},{1377,274,3007,35,0,0,0,0,0,0,0,0},{1394,280,2996,23,0,0,0,0,0}},
+       {10012, 2647, 280, 274, 1982, 55, 3781, 3784, {10030, 10036, 10046, 10052, 10063, 10073, 10078}, {10088, 10092, 10096, 10100, 10105, 10109, 10113}, {2085, 2085, 2090, 10117, 2085, 7414, 7414}, {10120, 10125, 10132, 10137, 10143, 10150, 10158, 10165, 10174, 10181, 10186, 10193, 0}, {10120, 10125, 10132, 10137, 10143, 10150, 10158, 10165, 10174, 10181, 10186, 10193, 0}, {10201, 10205, 3928, 10210, 3897, 10214, 10218, 10222, 10227, 10231, 10235, 10239, 0}, {10201, 10205, 3928, 10210, 3897, 10214, 10218, 10222, 10227, 10231, 10235, 10239, 0}, 0, 1, 763, 241, {2647,1336,1301,0,0,0,0,0,0,0,0,0,0,0},{10012,5487,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+       {3991, 243, 2996, 3007, 44, 55, 10243, 10248, {10255, 10266, 10273, 10282, 10289, 10302, 10311}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {10320, 10331, 10342, 10351, 10362, 10367, 10374, 10385, 10394, 10405, 10418, 10429, 0}, {10320, 10331, 10342, 10351, 10362, 10367, 10374, 10385, 10394, 10405, 10418, 10429, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {5487, 243, 1394, 1377, 1982, 55, 3781, 3784, {10440, 10447, 10453, 10460, 10465, 10471, 10477}, {10483, 10487, 10491, 10495, 10499, 10503, 10507}, {2463, 2090, 2090, 10511, 4419, 4132, 2090}, {10513, 10521, 10530, 2775, 10536, 2785, 2790, 10540, 2802, 2812, 2820, 10548, 0}, {10513, 10521, 10530, 2775, 10536, 2785, 2790, 10540, 2802, 2812, 2820, 10548, 0}, {2838, 2842, 3928, 2851, 10536, 2855, 2859, 10557, 2867, 2871, 2875, 10561, 0}, {2838, 2842, 3928, 2851, 10536, 2855, 2859, 10557, 2867, 2871, 2875, 10561, 0}, 0, 0, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {10565, 2647, 1394, 1377, 10583, 4765, 10599, 10604, {10609, 10622, 10641, 10658, 10671, 10684, 10701}, {10714, 8509, 8514, 8519, 8524, 8529, 8534}, {10719, 8542, 8539, 8545, 8548, 8542, 8545}, {10722, 10735, 10746, 10763, 10778, 10793, 10808, 10821, 10836, 10853, 10868, 10885, 0}, {10900, 10911, 10924, 10939, 10952, 10965, 10978, 10989, 11002, 11017, 11030, 11049, 0}, {11062, 11069, 11076, 11083, 11090, 11097, 11104, 11111, 11118, 11125, 11132, 11139, 0}, {11062, 11069, 11076, 11083, 11090, 11097, 11104, 11111, 11118, 11125, 11132, 11139, 0}, 0, 1, 763, 241, {2647,1336,1301,0,0,0,0,0,0,0,0,0,0,0},{10565,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3732, 2647, 1394, 1377, 1982, 4765, 11146, 11159, {11172, 11187, 11208, 11223, 11236, 11249, 11264}, {493, 498, 11277, 508, 11282, 518, 523}, {528, 531, 11287, 537, 540, 531, 537}, {11290, 11307, 11316, 11331, 11348, 11363, 11378, 11391, 11406, 11423, 11444, 11461, 0}, {11290, 11307, 11316, 11331, 593, 11363, 11378, 11391, 11406, 11423, 11444, 11461, 0}, {11476, 11483, 11490, 11497, 11504, 11511, 11518, 11525, 11532, 11539, 11546, 11553, 0}, {11476, 11483, 11490, 11497, 11504, 11511, 11518, 11525, 11532, 11539, 11546, 11553, 0}, 0, 0, 763, 241, {2647,1336,1301,0,0,0,0,0,0,0,0,0,0,0},{3732,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {1960, 1973, 1394, 1377, 1982, 2362, 1992, 11560, {11565, 11573, 11584, 11590, 11596, 11605, 2052}, {9004, 9008, 2450, 11611, 9020, 9025, 11615}, {9033, 9035, 1041, 1049, 9039, 9035, 1049}, {2473, 2480, 9445, 2494, 2500, 11619, 11625, 11631, 2521, 2531, 2539, 2548, 0}, {2473, 2480, 9445, 2494, 2500, 11619, 11625, 11631, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {11653, 11672, 1394, 1377, 11682, 2362, 11698, 11703, {11708, 11719, 11730, 11741, 11752, 11763, 11769}, {2085, 9681, 2465, 4419, 2083, 10511, 2471}, {2085, 9681, 2465, 4419, 2083, 10511, 2471}, {11778, 11786, 11795, 11802, 4887, 11809, 11815, 2514, 2521, 11821, 2539, 11830, 0}, {11778, 11786, 11795, 11802, 4887, 11809, 11815, 2514, 2521, 11821, 2539, 11830, 0}, {11840, 11845, 11795, 2569, 4887, 11809, 11815, 2581, 11851, 2589, 2593, 11856, 0}, {11840, 11845, 11795, 2569, 4887, 11809, 11815, 2581, 11851, 2589, 2593, 11856, 0}, 2, 1, 763, 241, {11672,2647,1336,1301,0,0,0,0,0,0,0,0,0,0},{11653,11861,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {11881, 5597, 1394, 1377, 5609, 2362, 11908, 11925, {11939, 11950, 11960, 11969, 11980, 11992, 12003}, {12013, 12016, 12019, 12022, 12025, 12028, 12031}, {2090, 2085, 2467, 2465, 7414, 2085, 2090}, {12034, 12044, 2488, 12055, 12064, 12070, 12078, 12086, 12094, 12105, 12114, 12124, 0}, {12034, 12044, 2488, 12055, 12064, 12070, 12078, 12086, 12094, 12105, 12114, 12124, 0}, {4938, 1261, 2488, 8341, 12064, 12134, 12140, 5835, 4962, 5847, 1291, 5852, 0}, {4938, 1261, 2488, 8341, 12064, 12134, 12140, 5835, 4962, 5847, 1291, 5852, 0}, 0, 1, 763, 241, {5597,12146,1301,0,0,0,0,0,0,0,0,0,0,0},{11881,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {12156, 1825, 280, 274, 12178, 12193, 12205, 11560, {12211, 12223, 12235, 12247, 12261, 12276, 12289}, {12303, 12016, 12306, 12022, 12309, 12312, 12315}, {2090, 2085, 12319, 2465, 4419, 2085, 9442}, {12321, 12328, 12336, 12342, 12351, 12360, 12370, 12376, 12387, 12397, 12404, 12414, 0}, {12422, 12429, 12437, 12443, 12452, 12461, 12471, 12477, 12488, 12498, 12505, 12515, 0}, {12523, 12529, 12534, 12539, 12544, 12549, 12554, 12560, 12566, 12572, 12578, 12585, 0}, {12523, 12529, 12534, 12539, 12544, 12549, 12554, 12560, 12566, 12572, 12578, 12585, 0}, 2, 1, 763, 241, {1825,1301,0,0,0,0,0,0,0,0,0,0,0,0},{12156,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+       {3732, 1336, 1394, 1377, 1982, 3773, 12592, 12604, {12616, 12631, 12646, 12661, 12678, 12697, 12708}, {12719, 12726, 12733, 12740, 12747, 12754, 12761}, {0, 0, 0, 0, 0, 0, 0}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, 0, 0, 763, 241, {1336,1301,0,0,0,0,0,0,0,0,0,0,0,0},{3732,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,0,0,0,0,0,0,0,0}},
+       {3744, 3956, 23, 35, 44, 3773, 12932, 12952, {12969, 12982, 12995, 13011, 13028, 13043, 13052}, {12969, 12982, 12995, 13011, 13028, 13043, 13052}, {13061, 13064, 13067, 13070, 13073, 13076, 13079}, {13082, 13095, 13106, 13115, 13126, 13131, 13140, 13151, 13158, 13173, 13184, 13197, 0}, {13210, 13225, 13106, 13115, 13238, 13131, 13245, 13151, 13158, 13173, 13184, 13197, 0}, {13082, 13095, 13106, 13115, 13126, 13131, 13140, 13151, 13158, 13173, 13184, 13197, 0}, {13082, 13095, 13106, 13115, 13126, 13131, 13140, 13151, 13158, 13173, 13184, 13197, 0}, 0, 6, 239, 241, {3956,3947,0,0,0,0,0,0,0,0,0,0,0,0},{3744,3977,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+       {5487, 243, 2996, 3007, 1982, 55, 13258, 13261, {13264, 13277, 13287, 13296, 13306, 13317, 13328}, {13340, 13343, 13348, 13353, 13358, 13363, 13368}, {13340, 13373, 13376, 13379, 13382, 13385, 13388}, {13391, 13404, 13415, 13425, 13436, 13448, 13460, 13473, 13485, 13498, 13513, 13534, 0}, {13391, 13404, 13415, 13425, 13436, 13448, 13460, 13473, 13485, 13498, 13513, 13534, 0}, {13553, 13559, 13565, 13571, 13577, 13583, 13589, 13595, 13601, 13607, 13614, 13621, 0}, {13553, 13559, 13565, 13571, 13577, 13583, 13589, 13595, 13601, 13607, 13614, 13621, 0}, 0, 1, 239, 241, {243,14,1327,2351,1301,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {13628, 2647, 1394, 1377, 44, 4765, 13641, 13649, {13657, 13670, 13691, 13710, 13731, 13750, 13763}, {13774, 13781, 13788, 13795, 13802, 13809, 13816}, {0, 0, 0, 0, 0, 0, 0}, {13823, 13838, 13853, 13862, 13873, 13884, 13897, 13910, 13925, 13944, 13963, 13980, 0}, {13823, 13838, 13853, 13862, 13873, 13884, 13897, 13910, 13925, 13944, 13963, 13980, 0}, {13999, 14006, 14013, 14020, 14027, 14034, 14041, 14048, 14055, 14062, 14069, 14076, 0}, {13999, 14006, 14013, 14020, 14027, 14034, 14041, 14048, 14055, 14062, 14069, 14076, 0}, 0, 1, 763, 241, {2647,1336,14083,243,14093,3720,1301,0,0,0,0,0,0,0},{13628,2969,14104,5487,14123,14134,14146,14163},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3732, 2647, 1394, 1377, 1982, 4765, 0, 0, {14181, 14187, 14201, 14224, 14238, 14254, 14261}, {14270, 14273, 14278, 14284, 14288, 7414, 14293}, {6567, 6555, 6557, 6559, 6561, 6563, 6565}, {14297, 14304, 10132, 14311, 3897, 14317, 14323, 14329, 14336, 14345, 14353, 14360, 0}, {14297, 14304, 10132, 14311, 3897, 14317, 14323, 14329, 14336, 14345, 14353, 14360, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, 0, 0, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{3732,5487,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {14399, 1814, 1394, 274, 14426, 3773, 3781, 3784, {14442, 14450, 14461, 14471, 14482, 14491, 14500}, {14510, 14513, 14516, 14519, 14522, 14525, 14528}, {14531, 2463, 12319, 2471, 12319, 2467, 14531}, {14533, 14543, 14551, 14559, 14567, 14575, 14582, 14590, 14598, 14605, 14611, 14618, 0}, {14533, 14543, 14551, 14559, 14567, 14575, 14582, 14590, 14598, 14605, 14611, 14618, 0}, {14626, 14630, 2565, 14634, 4887, 14638, 14642, 14646, 14650, 14654, 14658, 14662, 0}, {14626, 14630, 2565, 14634, 4887, 14638, 14642, 14646, 14650, 14654, 14658, 14662, 0}, 2, 1, 239, 241, {1814,1301,0,0,0,0,0,0,0,0,0,0,0,0},{14399,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{1394,280,1402,0,0,0,0,0,0}},
+       {14104, 2647, 280, 274, 1982, 55, 14666, 14687, {14704, 403, 424, 8448, 14717, 14734, 14745}, {14758, 14766, 14774, 14780, 14788, 14796, 14804}, {528, 531, 534, 537, 540, 531, 537}, {14812, 556, 573, 582, 14827, 14834, 14843, 614, 627, 646, 663, 678, 0}, {14812, 556, 573, 582, 14827, 14834, 14843, 614, 627, 646, 663, 678, 0}, {14852, 14860, 14868, 711, 14827, 14876, 14884, 719, 727, 737, 745, 14892, 0}, {14852, 14860, 14868, 711, 14827, 14876, 14884, 719, 727, 737, 745, 14892, 0}, 0, 1, 763, 241, {2647,1336,1301,0,0,0,0,0,0,0,0,0,0,0},{14104,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+       {5487, 1814, 23, 35, 1982, 55, 0, 0, {14904, 14911, 14922, 14931, 14940, 14947, 14958}, {14968, 14972, 14976, 14980, 14984, 14987, 14991}, {0, 0, 0, 0, 0, 0, 0}, {14995, 15005, 15014, 15022, 15031, 15044, 15056, 15063, 15070, 15077, 15087, 15099, 0}, {14995, 15005, 15014, 15022, 15031, 15044, 15056, 15063, 15070, 15077, 15087, 15099, 0}, {15112, 15116, 15120, 15124, 15128, 15132, 15136, 15140, 15144, 15148, 15152, 15156, 0}, {15112, 15116, 15120, 15124, 15128, 15132, 15136, 15140, 15144, 15148, 15152, 15156, 0}, 0, 0, 239, 241, {1814,1857,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
+       {5487, 1814, 23, 35, 1982, 55, 0, 0, {15160, 15165, 15171, 15181, 15193, 15201, 15212}, {15221, 15225, 15229, 15233, 15237, 15241, 15245}, {0, 0, 0, 0, 0, 0, 0}, {15249, 15259, 15269, 15276, 15283, 2785, 15288, 15295, 15302, 15311, 15319, 15327, 0}, {15249, 15259, 15269, 15276, 15283, 2785, 15288, 15295, 15302, 15311, 15319, 15327, 0}, {2838, 2842, 14991, 15335, 15339, 2855, 2859, 15343, 2867, 2871, 2875, 15347, 0}, {2838, 2842, 14991, 15335, 15339, 2855, 2859, 15343, 2867, 2871, 2875, 15347, 0}, 0, 0, 239, 241, {1814,1857,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
+       {5487, 1814, 23, 35, 1982, 55, 3781, 3784, {15351, 15357, 15368, 15181, 15378, 15201, 15212}, {15387, 15391, 15395, 15233, 15237, 15241, 15245}, {2090, 2463, 15399, 2465, 2090, 5695, 2463}, {15401, 15411, 15422, 15429, 15438, 15444, 15450, 15458, 15466, 15477, 15487, 15496, 0}, {15505, 15259, 15514, 15520, 15283, 2785, 15288, 15295, 15527, 15311, 15319, 15327, 0}, {2838, 2842, 15537, 2851, 15339, 2855, 2859, 15343, 2867, 2871, 2875, 15347, 0}, {2838, 2842, 15537, 2851, 15339, 2855, 2859, 15343, 2867, 2871, 2875, 15347, 0}, 0, 0, 239, 241, {1814,1857,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
+       {5487, 1814, 23, 35, 1982, 55, 15541, 15545, {15549, 15556, 15564, 15572, 15581, 15591, 15598}, {2731, 8231, 2737, 15607, 2743, 15610, 2749}, {2090, 2463, 2752, 3872, 2752, 4134, 2090}, {15613, 15622, 15632, 2775, 10536, 15638, 15644, 15650, 2802, 2812, 2820, 10548, 0}, {15613, 15622, 15632, 2775, 10536, 15638, 15644, 15650, 2802, 2812, 2820, 10548, 0}, {2838, 2842, 3928, 2851, 10536, 2855, 2859, 2863, 2867, 2871, 2875, 10561, 0}, {2838, 2842, 3928, 2851, 10536, 2855, 2859, 2863, 2867, 2871, 2875, 10561, 0}, 0, 0, 239, 241, {1814,1857,1301,15659,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
+       {15671, 2647, 1394, 1377, 1982, 15703, 15709, 15725, {15747, 15763, 15788, 15816, 15844, 15872, 15900}, {15919, 15929, 15939, 15949, 15959, 15969, 15979}, {15989, 15993, 15997, 15993, 16001, 16005, 16009}, {16013, 16035, 16063, 16079, 16098, 16114, 16133, 16149, 16171, 16202, 16230, 16255, 0}, {16013, 16035, 16063, 16079, 16098, 16114, 16133, 16149, 16171, 16202, 16230, 16255, 0}, {16283, 16293, 16303, 16313, 16323, 16333, 16343, 16353, 16363, 16373, 16383, 16393, 0}, {16283, 16293, 16303, 16313, 16323, 16333, 16343, 16353, 16363, 16373, 16383, 16393, 0}, 0, 1, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{15671,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {1960, 2351, 280, 274, 1982, 2362, 16403, 16408, {5890, 16413, 16424, 16434, 16444, 16454, 16468}, {5976, 5980, 16480, 16485, 16489, 16494, 16499}, {2090, 2463, 2465, 2463, 5695, 2469, 2471}, {2473, 2480, 4876, 6032, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2473, 2480, 4876, 6032, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, 2, 1, 2601, 241, {2351,1327,1301,0,0,0,0,0,0,0,0,0,0,0},{1960,0,0,0,0,0,0,0},{274,4983,0,0,0,0,0,0,0,0,0,0},{280,6438,0,0,0,0,0,0,0}},
+       {5487, 2351, 280, 274, 44, 55, 16503, 16531, {16553, 16572, 16591, 16613, 16632, 16666, 16691}, {16710, 16721, 16732, 16746, 16757, 16768, 16785}, {16796, 16800, 16807, 16814, 16821, 16828, 16835}, {16839, 16855, 16871, 16887, 16906, 16913, 16923, 16939, 16955, 16977, 16999, 17018, 0}, {16839, 16855, 16871, 16887, 16906, 16913, 16923, 16939, 16955, 16977, 16999, 17018, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {2351,1327,2312,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
+       {17040, 243, 280, 274, 1982, 17065, 17079, 17082, {17085, 17094, 17103, 17113, 17123, 17133, 17145}, {17153, 17158, 17162, 17166, 17170, 17175, 17180}, {17184, 2465, 2465, 9681, 17184, 17187, 2090}, {17190, 17197, 17202, 2775, 17208, 17214, 17221, 17227, 17235, 17245, 17253, 17262, 0}, {17190, 17197, 17202, 2775, 17208, 17214, 17221, 17227, 17235, 17245, 17253, 17262, 0}, {2838, 17272, 3928, 2851, 17276, 17280, 17285, 17289, 17293, 17297, 2875, 17301, 0}, {2838, 17272, 3928, 2851, 17276, 17280, 17285, 17289, 17293, 17297, 2875, 17301, 0}, 0, 0, 239, 241, {243,1301,17306,7084,2987,0,0,0,0,0,0,0,0,0},{17040,17315,9942,0,0,0,0,0},{274,3007,1377,35,0,0,0,0,0,0,0,0},{280,2996,1394,23,0,0,0,0,0}},
+       {17334, 2647, 280, 274, 1982, 17352, 17366, 17371, {17376, 17388, 17399, 17413, 17425, 17435, 17445}, {17456, 17461, 17466, 17471, 17476, 17481, 17486}, {2090, 4134, 2463, 6229, 2752, 15399, 2471}, {17491, 17508, 17521, 17535, 17548, 17561, 17574, 17588, 17600, 17614, 17628, 17642, 0}, {17491, 17508, 17521, 17535, 17548, 17561, 17574, 17588, 17600, 17614, 17628, 17642, 0}, {17655, 17662, 17667, 17672, 17676, 17681, 17686, 17691, 17696, 17703, 17708, 17714, 0}, {17655, 17662, 17667, 17672, 17676, 17681, 17686, 17691, 17696, 17703, 17708, 17714, 0}, 2, 1, 763, 241, {2647,1336,2903,1301,0,0,0,0,0,0,0,0,0,0},{17334,0,0,0,0,0,0,0},{274,1377,4983,0,0,0,0,0,0,0,0,0},{280,1394,6438,0,0,0,0,0,0}},
+       {3732, 243, 280, 274, 1982, 55, 946, 951, {17719, 17733, 17743, 17754, 17768, 17779, 17790}, {17803, 17808, 17813, 17820, 17826, 17832, 17838}, {2752, 2471, 2463, 7414, 2752, 12319, 2090}, {17843, 17851, 17859, 17866, 17875, 17885, 17895, 17901, 17909, 17924, 17942, 17950, 0}, {17843, 17851, 17859, 17866, 17875, 17885, 17895, 17901, 17909, 17924, 17942, 17950, 0}, {17958, 17962, 17859, 17968, 17972, 17977, 17895, 17983, 17988, 17995, 18002, 18007, 0}, {17958, 17962, 17859, 17968, 17972, 17977, 17895, 17983, 17988, 17995, 18002, 18007, 0}, 2, 1, 239, 241, {243,14,1320,2903,1301,0,0,0,0,0,0,0,0,0},{3732,5487,9942,9931,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {5487, 243, 1394, 1377, 1982, 55, 18012, 18015, {18019, 18024, 10453, 10460, 18030, 18037, 10477}, {18044, 18048, 10491, 10495, 18052, 10503, 10507}, {12319, 14531, 2090, 10511, 4419, 4132, 2090}, {10513, 10521, 18056, 2775, 10536, 2855, 18060, 18066, 2802, 2812, 2820, 18071, 0}, {10513, 10521, 18056, 2775, 10536, 2855, 18060, 18066, 2802, 2812, 2820, 18071, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18066, 2867, 2871, 2875, 15347, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18066, 2867, 2871, 2875, 15347, 0}, 0, 1, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {18080, 2647, 1394, 1377, 1982, 4765, 0, 0, {18098, 18113, 18130, 18147, 18162, 18179, 18188}, {18199, 18205, 18211, 18217, 18223, 18229, 18235}, {6555, 0, 0, 6561, 6563, 6565, 6567}, {18241, 18254, 18265, 18278, 18289, 18300, 18313, 18324, 18335, 18352, 18363, 18376, 0}, {18241, 18395, 18265, 18278, 18289, 18300, 18313, 18324, 18335, 18352, 18363, 18376, 0}, {18406, 18414, 18422, 18430, 18438, 18446, 18454, 18462, 18470, 18478, 18486, 18494, 0}, {18406, 18414, 18422, 18430, 18438, 18446, 18454, 18462, 18470, 18478, 18486, 18494, 0}, 0, 0, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{18080,18504,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {18523, 1336, 1394, 1377, 18543, 4765, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 1, 763, 241, {1336,1301,0,0,0,0,0,0,0,0,0,0,0,0},{18523,0,0,0,0,0,0,0},{1377,0,0,0,0,0,0,0,0,0,0,0},{1394,0,0,0,0,0,0,0,0}},
+       {3744, 3764, 2996, 3007, 44, 3773, 18559, 18567, {18575, 18584, 18593, 18601, 18610, 18619, 18626}, {18635, 18638, 18641, 18644, 18647, 18651, 18654}, {6557, 6559, 6561, 6563, 12319, 14531, 6555}, {10513, 10521, 18657, 18663, 10536, 2785, 18060, 18670, 15302, 18677, 15319, 18684, 0}, {10513, 10521, 18657, 18663, 10536, 2785, 18060, 18670, 15302, 18677, 15319, 18684, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18692, 2867, 2871, 2875, 10561, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18692, 2867, 2871, 2875, 10561, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {18696, 18714, 280, 274, 1982, 18725, 0, 0, {18732, 18747, 18762, 18777, 18794, 18811, 18820}, {18831, 18838, 18845, 18852, 18859, 18866, 18873}, {18880, 18883, 8545, 8548, 8542, 18886, 18889}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, 0, 0, 239, 241, {18714,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{18696,3732,5487,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {5487, 1327, 6438, 4983, 44, 55, 18892, 18920, {18942, 18961, 18980, 19005, 19024, 19058, 19083}, {19102, 19112, 19122, 19138, 19148, 19173, 19189}, {19199, 19203, 19210, 19214, 19221, 19228, 19235}, {19239, 19267, 19301, 19317, 19336, 19343, 19353, 19369, 19385, 19416, 19438, 19460, 0}, {19239, 19267, 19301, 19317, 19336, 19343, 19353, 19369, 19385, 19416, 19438, 19460, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 1, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{4983,2327,19485,19494,0,0,0,0,0,0,0,0},{6438,2343,19502,19514,0,0,0,0,0}},
+       {10012, 1327, 1948, 1928, 44, 55, 19525, 19557, {19589, 19605, 19624, 19646, 19665, 19684, 19712}, {19740, 19748, 19759, 19773, 19784, 19795, 19812}, {19826, 19830, 19837, 19844, 19854, 19861, 19874}, {19881, 19897, 19916, 19929, 19948, 19955, 19965, 19981, 19994, 20010, 20029, 20045, 0}, {19881, 19897, 19916, 19929, 19948, 19955, 19965, 19981, 19994, 20010, 20029, 20045, 0}, {6555, 6557, 6559, 6561, 19948, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 19948, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{10012,3732,0,0,0,0,0,0},{1928,1920,1377,274,0,0,0,0,0,0,0,0},{1948,1937,1394,280,0,0,0,0,0}},
+       {5487, 1327, 280, 274, 44, 55, 20061, 20102, {20143, 20162, 20181, 20203, 20222, 20244, 20269}, {20288, 20298, 20308, 20321, 20331, 20344, 20360}, {20370, 20374, 20381, 20388, 20395, 20402, 20409}, {20413, 20441, 20469, 20485, 20504, 20511, 20521, 20537, 20553, 20581, 20603, 20625, 0}, {20413, 20441, 20469, 20485, 20504, 20511, 20521, 20537, 20553, 20581, 20603, 20625, 0}, {20650, 20669, 20469, 20485, 20504, 20511, 20521, 20537, 20688, 20704, 20720, 20730, 0}, {20650, 20669, 20469, 20485, 20504, 20511, 20521, 20537, 20688, 20704, 20720, 20730, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
+       {5487, 1327, 280, 274, 44, 55, 7865, 20743, {20746, 20765, 20784, 20809, 20828, 20850, 20875}, {20894, 20904, 20914, 20930, 20940, 20953, 20969}, {20979, 20983, 20990, 20994, 21001, 21008, 21015}, {21019, 21041, 21072, 21094, 21113, 21120, 21130, 21146, 21162, 21193, 21215, 21237, 0}, {21019, 21041, 21072, 21094, 21113, 21120, 21130, 21146, 21162, 21193, 21215, 21237, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
+       {5487, 2351, 280, 274, 1982, 55, 21262, 21287, {21312, 21331, 21353, 21378, 21394, 21416, 21435}, {21445, 21452, 21459, 21466, 21473, 21480, 21487}, {21445, 21452, 21459, 21466, 21473, 21480, 21487}, {21491, 21507, 21532, 21551, 21570, 21577, 21590, 21603, 21622, 21653, 21678, 21700, 0}, {21491, 21507, 21532, 21551, 21570, 21577, 21590, 21725, 21622, 21653, 21678, 21700, 0}, {21744, 21752, 21766, 21780, 21570, 21577, 21590, 21791, 21799, 21813, 21824, 21832, 0}, {21744, 21752, 21766, 21780, 21570, 21577, 21590, 21791, 21799, 21813, 21824, 21832, 0}, 0, 0, 2601, 241, {2351,1327,2312,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
+       {5487, 1327, 280, 274, 44, 55, 21843, 21874, {21899, 21921, 21943, 21968, 21990, 22015, 22043}, {22065, 22075, 22085, 22098, 22108, 22121, 22137}, {22147, 22151, 22158, 22162, 22169, 22176, 22183}, {22187, 22203, 22228, 22247, 22269, 22276, 22289, 22302, 22321, 22352, 22377, 22396, 0}, {22187, 22203, 22228, 22247, 22269, 22276, 22289, 22302, 22321, 22352, 22377, 22396, 0}, {22421, 22428, 6559, 22444, 22269, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {22421, 22428, 6559, 22444, 22269, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
+       {5487, 1327, 280, 274, 44, 55, 3781, 3784, {22460, 22479, 22498, 22520, 22539, 22561, 22586}, {22605, 22610, 22618, 22626, 22634, 22642, 22650}, {22661, 22665, 22672, 22679, 22686, 22693, 22700}, {22704, 22720, 22745, 22764, 22786, 22793, 22806, 22819, 22838, 22866, 22891, 22913, 0}, {22704, 22720, 22745, 22764, 22786, 22793, 22806, 22819, 22838, 22866, 22891, 22913, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
+       {5487, 1327, 6438, 4983, 44, 55, 22938, 22957, {22988, 23013, 23044, 23072, 23097, 23125, 23159}, {23184, 23203, 23228, 23244, 23263, 23282, 23301}, {23311, 23318, 23325, 23332, 23339, 23352, 23359}, {23363, 23382, 23410, 23438, 23463, 23476, 23492, 23505, 23530, 23567, 23595, 23617, 0}, {23363, 23382, 23410, 23438, 23463, 23476, 23492, 23505, 23530, 23567, 23595, 23617, 0}, {23642, 23652, 23671, 23687, 23463, 23476, 23492, 23703, 23710, 23735, 23751, 23761, 0}, {23642, 23652, 23671, 23687, 23463, 23476, 23492, 23703, 23710, 23735, 23751, 23761, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{4983,2327,19485,19494,0,0,0,0,0,0,0,0},{6438,2343,19502,19514,0,0,0,0,0}},
+       {23774, 2351, 1937, 1920, 23793, 55, 23801, 23829, {23851, 23870, 23889, 23914, 23933, 23967, 23992}, {24011, 19112, 19122, 19138, 24021, 24046, 19189}, {0, 0, 0, 0, 0, 0, 0}, {24062, 24087, 24118, 24134, 19336, 19343, 19353, 24153, 24169, 24200, 24222, 24244, 0}, {24062, 24087, 24118, 24134, 19336, 19343, 19353, 24153, 24169, 24200, 24222, 24244, 0}, {24269, 24282, 24118, 24134, 19336, 19343, 19353, 24301, 24308, 24324, 24340, 24350, 0}, {24269, 24282, 24118, 24134, 19336, 19343, 19353, 24301, 24308, 24324, 24340, 24350, 0}, 0, 0, 2601, 241, {2351,0,0,0,0,0,0,0,0,0,0,0,0,0},{23774,0,0,0,0,0,0,0},{1920,1928,0,0,0,0,0,0,0,0,0,0},{1937,1948,0,0,0,0,0,0,0}},
+       {5487, 2351, 280, 274, 44, 55, 3781, 3784, {16553, 16572, 24363, 16613, 24385, 16666, 16691}, {24407, 24417, 24427, 24440, 24450, 24463, 24479}, {16796, 16800, 16807, 16814, 16821, 16828, 16835}, {24489, 24514, 16871, 24545, 24564, 16913, 24571, 24584, 24600, 24625, 24647, 24675, 0}, {24489, 24514, 16871, 24545, 24564, 16913, 24571, 24584, 24600, 24625, 24647, 24675, 0}, {24697, 24710, 16871, 24729, 24564, 16913, 24571, 24745, 24752, 6573, 24774, 24796, 0}, {24697, 24710, 16871, 24729, 24564, 16913, 24571, 24745, 24752, 6573, 24774, 24796, 0}, 0, 0, 2601, 241, {2351,1327,2312,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
+       {24812, 24833, 1394, 1377, 24842, 4765, 0, 0, {24859, 24866, 24877, 24890, 24903, 24914, 24927}, {24938, 24943, 24948, 24953, 24958, 24963, 24968}, {0, 0, 0, 0, 0, 0, 0}, {24973, 24988, 24997, 25004, 25017, 25024, 25035, 25044, 25053, 25060, 25071, 25082, 0}, {24973, 24988, 24997, 25004, 25017, 25024, 25035, 25044, 25053, 25060, 25071, 25082, 0}, {25093, 25100, 25107, 25114, 25121, 25128, 25135, 25142, 25149, 25156, 25163, 25170, 0}, {25093, 25100, 25107, 25114, 25121, 25128, 25135, 25142, 25149, 25156, 25163, 25170, 0}, 0, 0, 763, 241, {24833,1301,0,0,0,0,0,0,0,0,0,0,0,0},{24812,0,0,0,0,0,0,0},{1377,0,0,0,0,0,0,0,0,0,0,0},{1394,0,0,0,0,0,0,0,0}},
+       {25177, 1444, 280, 274, 25220, 25227, 25253, 25275, {25300, 25328, 25356, 25393, 25424, 25458, 25483}, {25517, 25533, 25549, 25574, 25593, 25615, 25634}, {25656, 25663, 25670, 25677, 25684, 25691, 25695}, {25705, 25739, 25776, 25810, 25844, 25875, 25912, 25949, 25989, 26023, 26057, 26106, 0}, {25705, 25739, 25776, 25810, 25844, 25875, 25912, 25949, 25989, 26023, 26057, 26106, 0}, {26155, 26168, 26181, 26194, 26207, 26220, 26233, 26246, 26259, 26272, 26288, 26304, 0}, {26155, 26168, 26181, 26194, 26207, 26220, 26233, 26246, 26259, 26272, 26288, 26304, 0}, 0, 0, 239, 241, {1444,1796,1805,1825,1301,1814,1836,1843,1850,0,0,0,0,0},{25177,26320,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+       {5487, 243, 280, 274, 1982, 55, 0, 0, {26368, 26377, 26387, 26399, 26412, 26421, 26433}, {26445, 26449, 26454, 26458, 26462, 26466, 26470}, {2090, 2471, 2463, 2463, 14531, 6229, 2090}, {26474, 26481, 26490, 26497, 2781, 26504, 26512, 26523, 26528, 26533, 26540, 26549, 0}, {26474, 26481, 26490, 26497, 2781, 26504, 26557, 26523, 26528, 26533, 26540, 26549, 0}, {26567, 26571, 26454, 26576, 2781, 26580, 26584, 26523, 26528, 26588, 26592, 26597, 0}, {26567, 26571, 26454, 26576, 2781, 26580, 26584, 26523, 26528, 26588, 26592, 26597, 0}, 2, 0, 239, 241, {243,14,1320,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,35,3007,0,0,0,0,0,0,0,0},{280,1394,23,2996,0,0,0,0,0}},
+       {3732, 1301, 280, 26602, 26610, 26645, 26681, 26697, {26713, 26747, 26778, 26809, 26831, 26874, 26902}, {26927, 26934, 26938, 26942, 26949, 26959, 26966}, {0, 0, 0, 0, 0, 0, 0}, {26970, 26983, 27002, 27015, 27028, 27041, 27060, 27079, 27092, 27108, 27121, 27146, 0}, {26970, 26983, 27002, 27015, 27028, 27041, 27060, 27079, 27092, 27108, 27121, 27146, 0}, {27159, 27163, 27167, 27171, 27175, 27179, 27183, 27187, 27191, 27195, 27202, 27209, 0}, {27159, 27163, 27167, 27171, 27175, 27179, 27183, 27187, 27191, 27195, 27202, 27209, 0}, 0, 0, 2601, 241, {1301,0,0,0,0,0,0,0,0,0,0,0,0,0},{3732,9954,0,0,0,0,0,0},{26602,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+       {5487, 243, 280, 26602, 1982, 55, 27216, 27241, {27266, 27291, 27310, 27338, 27357, 27382, 27401}, {27423, 27431, 27436, 27441, 27446, 27454, 27462}, {0, 0, 0, 0, 0, 0, 0}, {27467, 27486, 27502, 27515, 27528, 27550, 27569, 27591, 27607, 27623, 27636, 27652, 0}, {27467, 27486, 27502, 27515, 27528, 27550, 27569, 27591, 27607, 27623, 27636, 27652, 0}, {27668, 27677, 27686, 27698, 27708, 27717, 27729, 27738, 27747, 27756, 27765, 27774, 0}, {27668, 27677, 27686, 27698, 27708, 27717, 27729, 27738, 27747, 27756, 27765, 27774, 0}, 0, 0, 239, 241, {243,1301,0,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{26602,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+       {4005, 243, 1394, 1377, 4034, 55, 946, 951, {27783, 27791, 27796, 27803, 27813, 27819, 27826}, {27834, 27838, 3928, 27842, 27847, 27851, 27855}, {2752, 2471, 2463, 2463, 4130, 4134, 2090}, {27860, 27868, 6248, 27877, 27883, 27888, 27894, 6282, 27900, 27909, 27917, 27926, 0}, {27860, 27868, 6248, 27877, 27883, 27888, 27894, 6282, 27900, 27909, 27917, 27926, 0}, {27935, 2842, 3928, 27939, 2781, 27943, 27948, 18692, 17293, 27952, 2875, 3936, 0}, {27935, 2842, 3928, 27939, 2781, 27943, 27948, 18692, 17293, 27952, 2875, 3936, 0}, 2, 1, 239, 241, {243,14,1312,1320,1327,1336,1301,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{1377,274,35,1382,0,0,0,0,0,0,0,0},{1394,280,23,1402,0,0,0,0,0}},
+       {5487, 2351, 280, 274, 44, 55, 27956, 27968, {27980, 16572, 28008, 16613, 24385, 16666, 16691}, {24407, 24417, 24427, 24440, 24450, 24463, 24479}, {0, 0, 0, 0, 0, 0, 0}, {24489, 24514, 16871, 24545, 24564, 16913, 24571, 28027, 28043, 28071, 24647, 24675, 0}, {24489, 24514, 16871, 24545, 24564, 16913, 24571, 28027, 28043, 28071, 24647, 24675, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {2351,1327,2312,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
+       {28093, 1301, 2996, 3007, 28141, 3773, 28151, 28163, {28172, 28188, 28204, 28232, 28248, 28291, 28316}, {28344, 28354, 28364, 28371, 28381, 28397, 28410}, {28420, 28424, 28428, 28432, 28436, 28449, 28456}, {28463, 28482, 28507, 28526, 28551, 28564, 28577, 28590, 28612, 28646, 28671, 28699, 0}, {28463, 28482, 28507, 28526, 28551, 28564, 28577, 28590, 28612, 28646, 28671, 28699, 0}, {28727, 28734, 28744, 28526, 28551, 28564, 28577, 28757, 28767, 28780, 28790, 28803, 0}, {28727, 28734, 28744, 28526, 28551, 28564, 28577, 28757, 28767, 28780, 28790, 28803, 0}, 0, 1, 2601, 241, {1301,1814,1857,243,14,0,0,0,0,0,0,0,0,0},{28093,0,0,0,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {28816, 2987, 2996, 3007, 1982, 28848, 28862, 28872, {28885, 28895, 28902, 28915, 28925, 28935, 28945}, {28885, 28895, 28955, 28915, 28925, 28935, 28945}, {28965, 28969, 28973, 28977, 28981, 28985, 28989}, {28993, 29009, 29025, 29035, 29048, 29055, 29062, 29072, 29085, 29104, 29123, 29139, 0}, {28993, 29009, 29025, 29035, 29048, 29055, 29062, 29072, 29085, 29104, 29123, 29139, 0}, {29155, 29165, 29025, 29175, 29048, 29055, 29062, 29185, 29195, 29205, 29215, 29225, 0}, {29155, 29165, 29025, 29175, 29048, 29055, 29062, 29185, 29195, 29205, 29215, 29225, 0}, 0, 0, 239, 241, {2987,1301,0,0,0,0,0,0,0,0,0,0,0,0},{28816,0,0,0,0,0,0,0},{3007,0,0,0,0,0,0,0,0,0,0,0},{2996,0,0,0,0,0,0,0,0}},
+       {3991, 2351, 1394, 1377, 44, 55, 29235, 29245, {29258, 29265, 29271, 29278, 29284, 29290, 29298}, {29308, 29312, 29316, 29320, 29324, 29328, 29332}, {12319, 12319, 12319, 12319, 12319, 12319, 12319}, {29338, 29347, 29356, 29361, 29367, 29373, 29379, 29386, 29392, 29401, 29410, 29418, 0}, {29338, 29347, 29356, 29361, 29367, 29373, 29379, 29386, 29392, 29401, 29410, 29418, 0}, {29427, 29431, 3928, 29435, 3897, 29439, 29443, 29447, 29452, 29456, 29462, 29466, 0}, {29427, 29431, 3928, 29435, 3897, 29439, 29443, 29447, 29452, 29456, 29462, 29466, 0}, 0, 0, 2601, 241, {2351,1327,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{1377,274,29470,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3744, 3764, 2996, 3007, 29476, 3773, 29486, 29527, {29568, 29587, 29606, 29631, 29650, 29672, 29697}, {29716, 24417, 29726, 24440, 29742, 24463, 24479}, {29755, 29759, 29763, 29767, 29771, 29775, 29779}, {16839, 29783, 16871, 29811, 24564, 29830, 16923, 16939, 29840, 29871, 29893, 29918, 0}, {16839, 29783, 16871, 29811, 24564, 29830, 16923, 16939, 29840, 29871, 29893, 29918, 0}, {29943, 29950, 16871, 29960, 24564, 29830, 29976, 29989, 29996, 30012, 30028, 30041, 0}, {29943, 29950, 16871, 29960, 24564, 29830, 29976, 29989, 29996, 30012, 30028, 30041, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {243, 14, 2996, 3007, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {30054, 30061, 30070, 30085, 30096, 30105, 30112, 30119, 30126, 30137, 30150, 30163, 0}, {30054, 30061, 30070, 30085, 30096, 30105, 30112, 30119, 30126, 30137, 30150, 30163, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 6, 239, 241, {14,243,0,0,0,0,0,0,0,0,0,0,0,0},{243,1,254,30168,0,0,0,0},{3007,1377,0,0,0,0,0,0,0,0,0,0},{2996,1394,0,0,0,0,0,0,0}},
+       {3744, 3764, 2996, 3007, 44, 3773, 3781, 3784, {30186, 30193, 27796, 30199, 30210, 30218, 30227}, {30234, 27838, 3928, 30238, 30242, 30246, 10507}, {2471, 2471, 2463, 2463, 5695, 15399, 2090}, {30250, 30256, 30264, 27877, 30270, 30275, 30281, 6282, 30287, 30297, 30305, 30315, 0}, {30250, 30256, 30264, 27877, 30270, 30275, 30281, 6282, 30287, 30297, 30305, 30315, 0}, {30325, 30329, 3928, 27939, 3897, 30333, 30337, 18692, 17293, 2871, 30341, 15347, 0}, {30325, 30329, 3928, 27939, 3897, 30333, 30337, 18692, 17293, 2871, 30341, 15347, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {3744, 2987, 2996, 3007, 44, 3773, 0, 0, {30345, 30352, 30360, 30367, 30374, 30382, 30390}, {30397, 30400, 30403, 30406, 30409, 30412, 30415}, {2471, 2471, 2465, 2471, 12319, 4132, 12319}, {30418, 30426, 30436, 30442, 30450, 30455, 30460, 30465, 30472, 18677, 30480, 30488, 0}, {30418, 30426, 30436, 30442, 30450, 30455, 30460, 30465, 30472, 18677, 30480, 30488, 0}, {2838, 30496, 3928, 30500, 3897, 29439, 29443, 30504, 3868, 2871, 30508, 15347, 0}, {2838, 30496, 3928, 30500, 3897, 29439, 29443, 30504, 3868, 2871, 30508, 15347, 0}, 0, 0, 239, 241, {2987,1320,14,243,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {3744, 2987, 2996, 3007, 44, 3773, 30512, 30523, {30533, 30551, 30566, 30588, 30601, 30615, 30632}, {30656, 30664, 30669, 30588, 30601, 30681, 30688}, {0, 0, 0, 0, 0, 0, 0}, {30702, 30724, 30740, 30760, 30774, 30791, 30806, 30823, 30837, 30850, 30869, 30883, 0}, {30702, 30724, 30740, 30760, 30774, 30791, 30806, 30823, 30837, 30850, 30869, 30883, 0}, {30902, 30917, 30926, 30939, 30946, 30956, 30964, 30974, 30981, 30987, 30999, 31006, 0}, {30902, 30917, 30926, 30939, 30946, 30956, 30964, 30974, 30981, 30987, 30999, 31006, 0}, 0, 0, 239, 241, {2987,1320,14,243,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {5487, 1814, 23, 35, 1982, 55, 0, 0, {31018, 31026, 14922, 14931, 14940, 31037, 31047}, {15387, 14972, 14976, 14980, 14984, 15241, 31056}, {0, 0, 0, 0, 0, 0, 0}, {31060, 31069, 31079, 31087, 10536, 3901, 31095, 31101, 31110, 31119, 31128, 31137, 0}, {31060, 31069, 31079, 31087, 10536, 3901, 31095, 31101, 31110, 31119, 31128, 31137, 0}, {2838, 2842, 14991, 31146, 10536, 2855, 2859, 18692, 17293, 2871, 31150, 15347, 0}, {2838, 2842, 14991, 31146, 10536, 2855, 2859, 18692, 17293, 2871, 31150, 15347, 0}, 0, 0, 239, 241, {1814,1857,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
+       {1960, 2351, 280, 274, 1982, 2362, 31154, 31159, {31164, 31171, 31186, 31200, 31216, 31231, 31247}, {6225, 31262, 2565, 31266, 31270, 31274, 31278}, {2090, 12319, 2463, 2085, 2090, 2465, 12319}, {7172, 7180, 31282, 31289, 31296, 2504, 2509, 31301, 31311, 31322, 31331, 31341, 0}, {7172, 7180, 31282, 31289, 31296, 2504, 2509, 31301, 31311, 31322, 31331, 31341, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 0, 0, 2601, 241, {2351,1327,1301,2603,0,0,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {3744, 2987, 2996, 3007, 44, 3773, 31351, 31356, {31361, 31377, 31385, 31393, 31402, 31414, 31424}, {31434, 31440, 31446, 31450, 31454, 31462, 3868}, {0, 0, 0, 0, 0, 0, 0}, {31469, 31482, 31496, 31505, 31511, 31515, 31520, 31528, 15302, 31541, 15319, 15327, 0}, {31469, 31482, 31496, 31505, 31511, 31515, 31520, 31528, 15302, 31541, 15319, 15327, 0}, {31550, 2842, 31554, 15335, 31511, 31558, 2859, 31562, 2867, 31570, 2875, 15347, 0}, {31550, 2842, 31554, 15335, 31511, 31558, 2859, 31562, 2867, 31570, 2875, 15347, 0}, 0, 0, 239, 241, {2987,1320,14,243,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {31576, 1444, 1394, 1920, 31600, 31617, 31631, 31638, {31645, 31655, 31665, 31675, 31685, 31695, 31705}, {31715, 31722, 31729, 31736, 31743, 31750, 31757}, {31764, 31768, 31772, 31776, 31780, 31784, 31788}, {31792, 31799, 31806, 31813, 31820, 31827, 31834, 31841, 31848, 31855, 31862, 31872, 0}, {31792, 31799, 31806, 31813, 31820, 31827, 31834, 31841, 31848, 31855, 31862, 31872, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 239, 241, {1444,1796,1805,1825,1301,1814,0,0,0,0,0,0,0,0},{31576,31882,31912,0,0,0,0,0},{1920,1377,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {4748, 243, 280, 274, 1982, 4765, 0, 0, {26445, 27838, 31942, 31949, 31959, 31964, 31971}, {31978, 4108, 31982, 4839, 31987, 31992, 31997}, {4398, 32002, 32005, 32008, 32011, 32014, 32017}, {32020, 32027, 31942, 32038, 32044, 32048, 32057, 32064, 32069, 32078, 8225, 32083, 0}, {32020, 32027, 31942, 32038, 32044, 32048, 32057, 32064, 32069, 32078, 8225, 32083, 0}, {32089, 32093, 32100, 26576, 32044, 32105, 32110, 32064, 32115, 32078, 8225, 32120, 0}, {32089, 32093, 32100, 26576, 32044, 32105, 32110, 32064, 32115, 32078, 8225, 32120, 0}, 2, 1, 239, 241, {243,14,1336,1327,1301,0,0,0,0,0,0,0,0,0},{4748,4974,3732,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {32124, 243, 280, 274, 1982, 4765, 0, 0, {32152, 32160, 32167, 32175, 32185, 32193, 1007}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {32204, 32212, 1064, 1070, 4887, 32221, 32226, 1093, 1099, 32233, 1116, 32242, 0}, {32204, 32212, 1064, 1070, 4887, 32221, 32226, 1093, 1099, 32233, 1116, 32242, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 2, 1, 239, 241, {243,14,1336,1327,1301,0,0,0,0,0,0,0,0,0},{32124,0,0,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {4748, 243, 280, 274, 1982, 4765, 32251, 32256, {32261, 32269, 32279, 32289, 32298, 32308, 32316}, {32326, 32330, 32335, 32339, 32343, 32347, 32351}, {2090, 2463, 2752, 2463, 2752, 2469, 2090}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 32355, 32364, 32375, 32384, 32394, 0}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 32355, 32364, 32375, 32384, 32394, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, 0, 0, 239, 241, {243,14,1336,1327,1301,0,0,0,0,0,0,0,0,0},{4748,4974,3732,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {32404, 32422, 1394, 1377, 32433, 3773, 32449, 32454, {32459, 32484, 32513, 32538, 32551, 32566, 32583}, {32598, 32603, 32608, 32613, 32618, 32623, 8534}, {32628, 32628, 32631, 8545, 8548, 32628, 8545}, {32634, 32653, 32668, 32690, 32710, 32726, 32742, 32756, 32782, 32806, 32823, 32840, 0}, {32634, 32653, 32668, 32690, 32710, 32726, 32742, 32756, 32782, 32806, 32823, 32840, 0}, {32857, 32866, 32875, 32889, 32903, 32915, 32927, 32937, 32953, 32967, 32974, 32981, 0}, {32857, 32866, 32875, 32889, 32903, 32915, 32927, 32937, 32953, 32967, 32974, 32981, 0}, 0, 1, 763, 241, {32422,32988,2903,3947,32997,0,0,0,0,0,0,0,0,0},{32404,33008,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3744, 3764, 2996, 3007, 44, 3773, 0, 0, {33027, 33039, 33050, 33062, 33074, 33084, 33096}, {33111, 33116, 33121, 33126, 33131, 33136, 33141}, {0, 0, 0, 0, 0, 0, 0}, {33146, 33155, 33167, 33175, 33180, 33190, 33197, 33206, 33213, 33219, 33228, 33239, 0}, {33146, 33155, 33167, 33175, 33180, 33190, 33197, 33206, 33213, 33219, 33228, 33239, 0}, {33247, 33252, 33257, 33262, 33267, 33272, 33277, 33131, 33282, 33287, 33292, 33297, 0}, {33247, 33252, 33257, 33262, 33267, 33272, 33277, 33131, 33282, 33287, 33292, 33297, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {5487, 243, 280, 274, 1982, 55, 6008, 6013, {33302, 33315, 33323, 33332, 33342, 33352, 33361}, {33373, 33377, 33381, 33385, 33389, 33393, 33397}, {2752, 2471, 2463, 7414, 12319, 5695, 2090}, {33401, 33415, 33426, 33435, 33446, 33458, 33472, 33484, 33497, 33510, 33522, 33535, 0}, {33401, 33415, 33426, 33435, 33446, 33458, 33472, 33484, 33497, 33510, 33522, 33535, 0}, {33549, 33554, 33560, 33566, 33571, 33577, 33583, 33588, 33594, 33599, 18002, 33605, 0}, {33549, 33554, 33560, 33566, 33571, 33577, 33583, 33588, 33594, 33599, 18002, 33605, 0}, 2, 0, 239, 241, {243,14,1320,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,35,3007,0,0,0,0,0,0,0,0},{280,1394,23,2996,0,0,0,0,0}},
+       {1, 14, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {14,243,0,0,0,0,0,0,0,0,0,0,0,0},{1,254,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+       {289, 308, 323, 338, 350, 55, 366, 378, {390, 403, 424, 439, 450, 469, 480}, {493, 498, 503, 508, 513, 518, 523}, {528, 531, 534, 537, 540, 531, 537}, {543, 556, 573, 582, 593, 600, 607, 614, 627, 646, 663, 678, 0}, {543, 556, 573, 582, 593, 600, 607, 614, 627, 646, 663, 678, 0}, {695, 701, 573, 711, 593, 600, 607, 719, 727, 737, 745, 755, 0}, {695, 701, 573, 711, 593, 600, 607, 719, 727, 737, 745, 755, 0}, 2, 1, 763, 241, {308,765,781,797,0,0,0,0,0,0,0,0,0,0},{289,814,832,857,0,0,0,0},{338,881,0,0,0,0,0,0,0,0,0,0},{323,892,0,0,0,0,0,0,0}},
+       {906, 243, 280, 274, 932, 55, 946, 951, {956, 965, 973, 981, 990, 997, 1007}, {1016, 1019, 1022, 1025, 1028, 1031, 1034}, {1037, 1039, 1041, 1043, 1045, 1047, 1049}, {1051, 1057, 1064, 1070, 1076, 1081, 1086, 1093, 1099, 1108, 1116, 1125, 0}, {1134, 1143, 1153, 1162, 1172, 1180, 1188, 1198, 1208, 1220, 1232, 1244, 0}, {1256, 1261, 1064, 1267, 1076, 1081, 1272, 1277, 1281, 1286, 1291, 1296, 0}, {1256, 1261, 1064, 1267, 1076, 1081, 1272, 1277, 1281, 1286, 1291, 1296, 0}, 2, 1, 239, 241, {243,14,1301,1312,1320,1327,1336,0,0,0,0,0,0,0},{906,1345,1361,0,0,0,0,0},{274,1377,1382,0,0,0,0,0,0,0,0,0},{280,1394,1402,0,0,0,0,0,0}},
+       {1422, 1444, 1948, 1928, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {33611, 33618, 33625, 33632, 33639, 33646, 33653}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, 0, 0, 239, 241, {1444,1814,1301,0,0,0,0,0,0,0,0,0,0,0},{1422,6639,0,0,0,0,0,0},{1928,1920,274,1377,0,0,0,0,0,0,0,0},{1948,1937,280,1394,0,0,0,0,0}},
+       {1960, 1973, 1394, 1377, 1982, 55, 1992, 1997, {2002, 2010, 2020, 2028, 2036, 2045, 2052}, {2059, 2062, 2065, 2069, 2072, 2076, 2080}, {2083, 2085, 2087, 2090, 2092, 2085, 2090}, {2095, 2101, 2107, 2115, 2121, 2129, 2137, 2147, 2153, 2161, 2169, 2178, 0}, {2187, 2193, 2200, 2208, 2214, 2222, 2230, 2240, 2153, 2246, 2254, 2264, 0}, {2273, 2276, 2279, 2282, 2285, 2288, 2291, 2294, 2297, 2300, 2304, 2308, 0}, {2273, 2276, 2279, 2282, 2285, 2288, 2291, 2294, 2297, 2300, 2304, 2308, 0}, 2, 1, 763, 241, {1973,2312,1301,1796,1836,0,0,0,0,0,0,0,0,0},{1960,0,0,0,0,0,0,0},{1377,274,2319,2327,0,0,0,0,0,0,0,0},{1394,280,2332,2343,0,0,0,0,0}},
+       {1960, 2351, 280, 274, 1982, 2362, 2370, 2375, {2380, 2388, 2395, 2403, 2410, 2418, 2425}, {2433, 2438, 2442, 2446, 2450, 2454, 2458}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {2473, 2480, 2488, 2494, 2500, 2504, 2509, 2514, 2521, 2531, 2539, 2548, 0}, {2473, 2480, 2488, 2494, 2500, 2504, 2509, 2514, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 2601, 241, {2351,1327,1301,2603,0,0,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {2628, 2647, 280, 274, 1982, 55, 2658, 2664, {2671, 2679, 2686, 2695, 2704, 2715, 2723}, {2731, 2734, 2737, 2740, 2743, 2746, 2749}, {2090, 2463, 2752, 2463, 2752, 2469, 2090}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, 2, 1, 763, 241, {2647,2883,1336,2895,2903,1973,1301,0,0,0,0,0,0,0},{2628,1960,2910,0,0,0,0,0},{274,1377,2327,2922,0,0,0,0,0,0,0,0},{280,2933,2947,2962,0,0,0,0,0}},
+       {2969, 2987, 2996, 3007, 1982, 55, 3015, 3022, {3029, 3044, 3059, 3070, 3085, 3098, 3117}, {3132, 3139, 3146, 3153, 3160, 3167, 3174}, {3181, 3184, 3187, 3187, 3190, 3190, 3193}, {3196, 3217, 3240, 3255, 3272, 3283, 3298, 3313, 3332, 3355, 3374, 3393, 0}, {3414, 3435, 3458, 3473, 3490, 3501, 3516, 3531, 3550, 3573, 3592, 3611, 0}, {3632, 3639, 3646, 3653, 3660, 3667, 3676, 3685, 3692, 3699, 3706, 3713, 0}, {3632, 3639, 3646, 3653, 3660, 3667, 3676, 3685, 3692, 3699, 3706, 3713, 0}, 2, 1, 239, 241, {2987,243,1320,14,3720,1301,0,0,0,0,0,0,0,0},{2969,3732,0,0,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {3744, 3764, 2996, 3007, 44, 3773, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {4280, 1973, 1394, 1377, 1982, 4297, 4309, 4313, {4317, 4329, 4341, 4351, 4365, 4375, 4387}, {4398, 4401, 4404, 4407, 4410, 4413, 4416}, {2090, 2463, 2465, 4419, 2465, 2085, 2471}, {4421, 4430, 4439, 4449, 4458, 4467, 4476, 4486, 4493, 4501, 4509, 4519, 0}, {4528, 4539, 4550, 4562, 4573, 4584, 4595, 4607, 4616, 4626, 4636, 4648, 0}, {4659, 4665, 4671, 4678, 4684, 4690, 4696, 4703, 4707, 4712, 4717, 4724, 0}, {4659, 4665, 4671, 4678, 4684, 4690, 4696, 4703, 4707, 4712, 4717, 4724, 0}, 2, 1, 763, 241, {1973,2647,2903,1301,0,0,0,0,0,0,0,0,0,0},{4280,4730,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {4748, 243, 280, 274, 1982, 4765, 3781, 3784, {4772, 4781, 4787, 4793, 4802, 4808, 4817}, {4824, 4829, 4834, 4839, 4844, 4849, 4854}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, 2, 1, 239, 241, {243,14,1336,1327,1301,0,0,0,0,0,0,0,0,0},{4748,4974,3732,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {5007, 243, 280, 274, 1982, 55, 5025, 5038, {5049, 5067, 5081, 5099, 5117, 5135, 5151}, {5165, 5177, 5189, 5201, 5213, 5225, 5237}, {5244, 5247, 5250, 5253, 5256, 5259, 5262}, {5265, 5276, 5289, 5296, 5307, 5314, 5323, 5332, 5345, 5358, 5373, 5386, 0}, {5265, 5276, 5289, 5296, 5307, 5314, 5323, 5332, 5345, 5358, 5373, 5386, 0}, {5397, 5406, 5289, 5415, 5307, 5424, 5433, 5442, 5451, 5460, 5469, 5478, 0}, {5397, 5406, 5289, 5415, 5307, 5424, 5433, 5442, 5451, 5460, 5469, 5478, 0}, 0, 0, 239, 241, {243,5487,14,1,1327,2351,5500,1301,5513,5530,0,0,0,0},{5007,5487,5540,5562,5513,0,0,0},{274,35,0,0,0,0,0,0,0,0,0,0},{280,23,0,0,0,0,0,0,0}},
+       {5583, 5597, 1394, 1377, 5609, 5620, 5628, 5632, {5636, 5646, 5654, 5659, 5666, 5679, 5687}, {4134, 5695, 4419, 5697, 5701, 2085, 5704}, {4134, 5695, 4419, 5708, 5701, 2085, 5708}, {5711, 5719, 5728, 5737, 5746, 5753, 5761, 5769, 5779, 5790, 2539, 2548, 0}, {5711, 5719, 5728, 5737, 5746, 5753, 5761, 5769, 5779, 5790, 2539, 2548, 0}, {5799, 1261, 5804, 5811, 5817, 5823, 5829, 5835, 5840, 5847, 1291, 5852, 0}, {5799, 1261, 5804, 5811, 5817, 5823, 5829, 5835, 5840, 5847, 1291, 5852, 0}, 0, 1, 763, 241, {5597,5857,1301,5871,0,0,0,0,0,0,0,0,0,0},{5583,0,0,0,0,0,0,0},{1377,274,3007,0,0,0,0,0,0,0,0,0},{1394,280,2996,0,0,0,0,0,0}},
+       {1960, 1973, 280, 274, 1982, 2362, 5880, 5885, {5890, 5901, 5912, 5926, 5940, 5952, 5964}, {5976, 5980, 5985, 5990, 5995, 5999, 6004}, {1049, 6008, 6010, 6008, 6013, 6013, 1039}, {6015, 6023, 4876, 6032, 6039, 6044, 6051, 6058, 2521, 5790, 6066, 6076, 0}, {6015, 6023, 4876, 6032, 6039, 6044, 6051, 6058, 2521, 5790, 6066, 6076, 0}, {2557, 2561, 2565, 2569, 6039, 6085, 6090, 6095, 2585, 2589, 6101, 6106, 0}, {2557, 2561, 2565, 2569, 6039, 6085, 6090, 6095, 2585, 2589, 6101, 6106, 0}, 2, 1, 763, 241, {1973,1336,6110,6122,1301,6136,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {4748, 243, 280, 274, 1982, 55, 6145, 6148, {6151, 6160, 6168, 6177, 6188, 6197, 6206}, {4104, 4108, 2565, 6213, 6217, 6221, 6225}, {2752, 2471, 2463, 2463, 6229, 4134, 2090}, {6231, 6239, 6248, 6254, 6261, 6268, 6275, 6282, 6289, 6299, 6307, 6316, 0}, {6325, 6333, 4150, 6342, 6349, 6356, 6363, 4173, 6370, 6380, 1116, 6388, 0}, {6397, 2561, 2565, 2569, 6401, 6405, 6409, 4219, 6413, 6417, 2593, 4227, 0}, {6397, 2561, 2565, 2569, 6401, 6405, 6409, 4219, 6413, 6417, 2593, 4227, 0}, 2, 1, 239, 241, {243,3720,14,6421,1320,1301,0,0,0,0,0,0,0,0},{4748,6429,3732,0,0,0,0,0},{274,1377,2327,4983,0,0,0,0,0,0,0,0},{280,2343,6438,0,0,0,0,0,0}},
+       {1422, 1814, 1394, 1377, 1453, 1469, 6447, 6454, {6461, 6471, 6481, 6491, 6501, 6511, 6521}, {1615, 6531, 6535, 6539, 6543, 6547, 6551}, {1615, 6531, 6535, 6539, 6543, 6547, 6551}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 239, 241, {1814,1857,1843,1444,6582,6601,6618,1301,0,0,0,0,0,0},{1422,6639,6663,6690,0,0,0,0},{1377,274,1920,1928,0,0,0,0,0,0,0,0},{1394,280,1937,1948,0,0,0,0,0}},
+       {6719, 1301, 1937, 1920, 6748, 6765, 6779, 6786, {6793, 6803, 6813, 6823, 6833, 6843, 6853}, {6863, 6867, 6871, 6875, 6879, 6883, 6887}, {6863, 6867, 6871, 6875, 6879, 6883, 6887}, {6891, 6896, 6901, 6906, 6911, 6916, 6921, 6926, 6931, 6936, 6942, 6948, 0}, {6891, 6896, 6901, 6906, 6911, 6916, 6921, 6926, 6931, 6936, 6942, 6948, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1301,5871,1836,1796,0,0,0,0,0,0,0,0,0,0},{6719,6954,6978,7005,7027,7058,0,0},{1920,1928,1377,274,0,0,0,0,0,0,0,0},{1937,1948,1394,280,0,0,0,0,0}},
+       {4748, 7084, 1394, 1377, 1982, 55, 946, 951, {7093, 7100, 7108, 7116, 7125, 7135, 7143}, {7152, 4401, 7155, 7158, 7161, 7164, 7167}, {7170, 2463, 2752, 3872, 2752, 4134, 7170}, {7172, 7180, 7189, 2494, 7195, 2504, 2509, 7199, 2521, 2531, 2539, 2548, 0}, {7172, 7180, 7189, 2494, 7195, 2504, 2509, 7199, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 7208, 2569, 7195, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 7208, 2569, 7195, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 2601, 241, {7084,2312,1327,14,1336,2883,1301,0,0,0,0,0,0,0},{4748,6429,3732,4974,0,0,0,0},{1377,274,2327,7212,7224,0,0,0,0,0,0,0},{1394,280,7236,7251,0,0,0,0,0}},
+       {1960, 2647, 280, 274, 1982, 2362, 946, 951, {2380, 2388, 2395, 2403, 2410, 2418, 2425}, {7266, 7271, 7275, 7279, 7283, 7287, 7291}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, 2, 1, 763, 241, {2647,1336,2903,1301,2883,0,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,7296,4983,0,0,0,0,0,0,0,0},{280,1394,7307,6438,0,0,0,0,0}},
+       {3732, 1301, 280, 274, 1982, 4765, 3781, 3784, {7321, 7331, 7345, 7352, 7359, 7368, 2052}, {7376, 7383, 7388, 7392, 7397, 7402, 7406}, {2083, 2085, 3872, 7411, 7414, 2085, 2090}, {7416, 7425, 7430, 7437, 2500, 7447, 7456, 7463, 7473, 7483, 2169, 7496, 0}, {7506, 7515, 7522, 7528, 7537, 7542, 7550, 7556, 7565, 7575, 7589, 7599, 0}, {7607, 7611, 2565, 7615, 2500, 7619, 7623, 7627, 7631, 7635, 7640, 7644, 0}, {7607, 7611, 2565, 7615, 2500, 7619, 7623, 7627, 7631, 7635, 7640, 7644, 0}, 2, 1, 2601, 241, {1301,5871,0,0,0,0,0,0,0,0,0,0,0,0},{3732,5487,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {7648, 243, 280, 274, 4034, 7676, 3781, 3784, {4049, 7689, 7703, 7716, 7729, 7742, 4096}, {4104, 7754, 7758, 7762, 7766, 7770, 4125}, {2752, 2090, 2465, 7774, 7774, 2090, 2090}, {7776, 7784, 7794, 1070, 7801, 7806, 7812, 4173, 7818, 7827, 7835, 7844, 0}, {7776, 7784, 7794, 1070, 7801, 7806, 7812, 4173, 7818, 7827, 7835, 7844, 0}, {2557, 7853, 2565, 4215, 4887, 2573, 2577, 4219, 6413, 7857, 2593, 7861, 0}, {2557, 7853, 2565, 4215, 4887, 2573, 2577, 4219, 6413, 7857, 2593, 7861, 0}, 0, 0, 239, 241, {243,14,2987,1320,1327,2351,2312,7084,1336,2647,2883,2903,1973,1301},{7648,4258,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+       {2969, 243, 280, 274, 1982, 55, 7865, 7868, {7871, 7880, 4787, 7890, 7898, 7906, 7915}, {7921, 7924, 4401, 7928, 7931, 7935, 2080}, {2752, 6229, 2463, 2463, 6229, 4134, 2090}, {7938, 7946, 4876, 7953, 7960, 7965, 7975, 7983, 7989, 7999, 2539, 2548, 0}, {7938, 7946, 4876, 7953, 7960, 7965, 7975, 7983, 7989, 7999, 2539, 2548, 0}, {8007, 8014, 4876, 4951, 7960, 8020, 8027, 7983, 8032, 1286, 1291, 5852, 0}, {8007, 8014, 4876, 4951, 7960, 8020, 8027, 7983, 8032, 1286, 1291, 5852, 0}, 2, 1, 239, 241, {243,14,1312,8038,1320,243,1301,0,0,0,0,0,0,0},{2969,3732,4974,0,0,0,0,0},{274,1377,8046,8058,8069,8077,8087,8096,2922,8102,8110,8115},{280,1394,8118,8133,2947,2933,8147,8160,2962}},
+       {3732, 2647, 280, 274, 1982, 4765, 3781, 3784, {8172, 8182, 8187, 8194, 8203, 8207, 8214}, {8225, 8228, 8231, 2740, 8234, 8237, 8240}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {8244, 8253, 8263, 8270, 4887, 8278, 8284, 2514, 8290, 8301, 8311, 8321, 0}, {8244, 8253, 8263, 8270, 4887, 8278, 8284, 2514, 8290, 8301, 8311, 8321, 0}, {8331, 8336, 4834, 8341, 4887, 8346, 8351, 5835, 4962, 1286, 1291, 5852, 0}, {8331, 8336, 4834, 8341, 4887, 8346, 8351, 5835, 4962, 1286, 1291, 5852, 0}, 0, 1, 763, 241, {2647,1973,1301,0,0,0,0,0,0,0,0,0,0,0},{3732,0,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {814, 2647, 1394, 1377, 1982, 3773, 8356, 8376, {8402, 8425, 424, 8448, 8459, 8474, 8489}, {8504, 8509, 8514, 8519, 8524, 8529, 8534}, {8539, 8542, 8539, 8545, 8548, 8542, 8545}, {8551, 8564, 8579, 8588, 8601, 8608, 8617, 8626, 8639, 8656, 8671, 8684, 0}, {8699, 8712, 8727, 8738, 8751, 8758, 8767, 8776, 8791, 8808, 8823, 8836, 0}, {8851, 8859, 8579, 8869, 8601, 8608, 8617, 8877, 8885, 8895, 8903, 8913, 0}, {8851, 8859, 8579, 8869, 8601, 8608, 8617, 8877, 8885, 8895, 8903, 8913, 0}, 0, 1, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{814,289,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {8921, 8935, 1394, 1377, 44, 2362, 3781, 3784, {8945, 8954, 8966, 8973, 8981, 8991, 8997}, {9004, 9008, 9012, 9016, 9020, 9025, 9029}, {9033, 9035, 9037, 1049, 9039, 9035, 1049}, {9042, 9052, 9061, 9069, 9077, 9085, 9092, 9099, 9107, 2169, 9113, 9121, 0}, {9130, 9140, 9149, 9157, 9165, 9173, 9180, 9187, 9196, 7589, 9202, 9212, 0}, {9221, 9225, 9230, 9235, 9239, 7623, 9243, 9247, 9251, 7640, 9255, 9259, 0}, {9221, 9225, 9230, 9235, 9239, 7623, 9243, 9247, 9251, 7640, 9255, 9259, 0}, 0, 1, 763, 241, {8935,9263,6110,9271,9283,9293,9303,1301,0,0,0,0,0,0},{8921,9315,9330,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {1960, 9350, 1394, 1377, 1982, 55, 9361, 9372, {9383, 9391, 9400, 9407, 9414, 9423, 2052}, {2059, 2062, 9430, 2069, 9433, 9437, 2080}, {2083, 2085, 9440, 2090, 9442, 2085, 2090}, {5711, 5719, 9445, 6032, 9451, 6085, 6090, 2514, 2521, 5790, 2539, 2548, 0}, {9456, 9465, 7522, 9475, 9483, 9489, 9495, 9501, 9509, 9519, 9528, 9537, 0}, {2557, 2561, 2565, 2569, 9451, 6085, 6090, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 9451, 6085, 6090, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 9546, 241, {9350,1973,9549,2903,2647,1336,1301,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{1377,274,2327,0,0,0,0,0,0,0,0,0},{1394,280,2343,0,0,0,0,0,0}},
+       {1301, 1301, 9558, 9569, 9577, 3773, 9585, 9588, {9591, 9598, 9607, 9616, 9628, 9636, 9645}, {9655, 9659, 3928, 9664, 9669, 9673, 9677}, {2752, 5695, 2463, 2463, 9681, 2085, 2090}, {9683, 9689, 4876, 9696, 2500, 9702, 9710, 9717, 9723, 9731, 9737, 9745, 0}, {9683, 9689, 4876, 9696, 2500, 9702, 9710, 9717, 9723, 9731, 9737, 9745, 0}, {2838, 9753, 3928, 9757, 9761, 9765, 9769, 9773, 9677, 9777, 9781, 9786, 0}, {2838, 9753, 3928, 9757, 9761, 9765, 9769, 9773, 9677, 9777, 9781, 9786, 0}, 0, 1, 2601, 241, {1301,5871,0,0,0,0,0,0,0,0,0,0,0,0},{1301,0,0,0,0,0,0,0},{9569,274,0,0,0,0,0,0,0,0,0,0},{9558,280,0,0,0,0,0,0,0}},
+       {9790, 1301, 280, 274, 1982, 9808, 9821, 9824, {9827, 9835, 9843, 2403, 2410, 2418, 9850}, {9858, 9863, 9868, 2446, 2450, 2454, 9872}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {7172, 7180, 4876, 2494, 2500, 2504, 2509, 9877, 2521, 2531, 2539, 2548, 0}, {7172, 7180, 4876, 2494, 2500, 2504, 2509, 9877, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 2601, 241, {1301,5871,0,0,0,0,0,0,0,0,0,0,0,0},{9790,9885,0,0,0,0,0,0},{274,1377,9908,0,0,0,0,0,0,0,0,0},{280,1394,9918,0,0,0,0,0,0}},
+       {3732, 2987, 1394, 1377, 1982, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 239, 241, {2987,1320,14,243,9931,9942,1301,0,0,0,0,0,0,0},{3732,9954,9970,0,0,0,0,0},{1377,274,3007,35,0,0,0,0,0,0,0,0},{1394,280,2996,23,0,0,0,0,0}},
+       {10012, 2647, 280, 274, 1982, 55, 3781, 3784, {10030, 10036, 10046, 10052, 10063, 10073, 10078}, {10088, 10092, 10096, 10100, 10105, 10109, 10113}, {2085, 2085, 2090, 10117, 2085, 7414, 7414}, {10120, 10125, 10132, 10137, 10143, 10150, 10158, 10165, 10174, 10181, 10186, 10193, 0}, {10120, 10125, 10132, 10137, 10143, 10150, 10158, 10165, 10174, 10181, 10186, 10193, 0}, {10201, 10205, 3928, 10210, 3897, 10214, 10218, 10222, 10227, 10231, 10235, 10239, 0}, {10201, 10205, 3928, 10210, 3897, 10214, 10218, 10222, 10227, 10231, 10235, 10239, 0}, 0, 1, 763, 241, {2647,1336,1301,0,0,0,0,0,0,0,0,0,0,0},{10012,5487,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+       {3991, 243, 2996, 3007, 44, 55, 10243, 10248, {10255, 10266, 10273, 10282, 10289, 10302, 10311}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {10320, 10331, 10342, 10351, 10362, 10367, 10374, 10385, 10394, 10405, 10418, 10429, 0}, {10320, 10331, 10342, 10351, 10362, 10367, 10374, 10385, 10394, 10405, 10418, 10429, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {5487, 243, 1394, 1377, 1982, 55, 3781, 3784, {10440, 10447, 10453, 10460, 10465, 10471, 10477}, {10483, 10487, 10491, 10495, 10499, 10503, 10507}, {2463, 2090, 2090, 10511, 4419, 4132, 2090}, {10513, 10521, 10530, 2775, 10536, 2785, 2790, 10540, 2802, 2812, 2820, 10548, 0}, {10513, 10521, 10530, 2775, 10536, 2785, 2790, 10540, 2802, 2812, 2820, 10548, 0}, {2838, 2842, 3928, 2851, 10536, 2855, 2859, 10557, 2867, 2871, 2875, 10561, 0}, {2838, 2842, 3928, 2851, 10536, 2855, 2859, 10557, 2867, 2871, 2875, 10561, 0}, 0, 0, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {10565, 2647, 1394, 1377, 10583, 4765, 10599, 10604, {10609, 10622, 10641, 10658, 10671, 10684, 10701}, {10714, 8509, 8514, 8519, 8524, 8529, 8534}, {10719, 8542, 8539, 8545, 8548, 8542, 8545}, {10722, 10735, 10746, 10763, 10778, 10793, 10808, 10821, 10836, 10853, 10868, 10885, 0}, {10900, 10911, 10924, 10939, 10952, 10965, 10978, 10989, 11002, 11017, 11030, 11049, 0}, {11062, 11069, 11076, 11083, 11090, 11097, 11104, 11111, 11118, 11125, 11132, 11139, 0}, {11062, 11069, 11076, 11083, 11090, 11097, 11104, 11111, 11118, 11125, 11132, 11139, 0}, 0, 1, 763, 241, {2647,1336,1301,0,0,0,0,0,0,0,0,0,0,0},{10565,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3732, 2647, 1394, 1377, 1982, 4765, 11146, 11159, {11172, 11187, 11208, 11223, 11236, 11249, 11264}, {493, 498, 11277, 508, 11282, 518, 523}, {528, 531, 11287, 537, 540, 531, 537}, {11290, 11307, 11316, 11331, 11348, 11363, 11378, 11391, 11406, 11423, 11444, 11461, 0}, {11290, 11307, 11316, 11331, 593, 11363, 11378, 11391, 11406, 11423, 11444, 11461, 0}, {11476, 11483, 11490, 11497, 11504, 11511, 11518, 11525, 11532, 11539, 11546, 11553, 0}, {11476, 11483, 11490, 11497, 11504, 11511, 11518, 11525, 11532, 11539, 11546, 11553, 0}, 0, 0, 763, 241, {2647,1336,1301,0,0,0,0,0,0,0,0,0,0,0},{3732,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {1960, 1973, 1394, 1377, 1982, 2362, 1992, 11560, {11565, 11573, 11584, 11590, 11596, 11605, 2052}, {9004, 9008, 2450, 11611, 9020, 9025, 11615}, {9033, 9035, 1041, 1049, 9039, 9035, 1049}, {2473, 2480, 9445, 2494, 2500, 11619, 11625, 11631, 2521, 2531, 2539, 2548, 0}, {2473, 2480, 9445, 2494, 2500, 11619, 11625, 11631, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {11653, 11672, 1394, 1377, 11682, 2362, 11698, 11703, {11708, 11719, 11730, 11741, 11752, 11763, 11769}, {2085, 9681, 2465, 4419, 2083, 10511, 2471}, {2085, 9681, 2465, 4419, 2083, 10511, 2471}, {11778, 11786, 11795, 11802, 4887, 11809, 11815, 2514, 2521, 11821, 2539, 11830, 0}, {11778, 11786, 11795, 11802, 4887, 11809, 11815, 2514, 2521, 11821, 2539, 11830, 0}, {11840, 11845, 11795, 2569, 4887, 11809, 11815, 2581, 11851, 2589, 2593, 11856, 0}, {11840, 11845, 11795, 2569, 4887, 11809, 11815, 2581, 11851, 2589, 2593, 11856, 0}, 2, 1, 763, 241, {11672,2647,1336,1301,0,0,0,0,0,0,0,0,0,0},{11653,11861,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {11881, 5597, 1394, 1377, 5609, 2362, 11908, 11925, {11939, 11950, 11960, 11969, 11980, 11992, 12003}, {12013, 12016, 12019, 12022, 12025, 12028, 12031}, {2090, 2085, 2467, 2465, 7414, 2085, 2090}, {12034, 12044, 2488, 12055, 12064, 12070, 12078, 12086, 12094, 12105, 12114, 12124, 0}, {12034, 12044, 2488, 12055, 12064, 12070, 12078, 12086, 12094, 12105, 12114, 12124, 0}, {4938, 1261, 2488, 8341, 12064, 12134, 12140, 5835, 4962, 5847, 1291, 5852, 0}, {4938, 1261, 2488, 8341, 12064, 12134, 12140, 5835, 4962, 5847, 1291, 5852, 0}, 0, 1, 763, 241, {5597,12146,1301,0,0,0,0,0,0,0,0,0,0,0},{11881,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {12156, 1825, 280, 274, 12178, 12193, 12205, 11560, {12211, 12223, 12235, 12247, 12261, 12276, 12289}, {12303, 12016, 12306, 12022, 12309, 12312, 12315}, {2090, 2085, 12319, 2465, 4419, 2085, 9442}, {12321, 12328, 12336, 12342, 12351, 12360, 12370, 12376, 12387, 12397, 12404, 12414, 0}, {12422, 12429, 12437, 12443, 12452, 12461, 12471, 12477, 12488, 12498, 12505, 12515, 0}, {12523, 12529, 12534, 12539, 12544, 12549, 12554, 12560, 12566, 12572, 12578, 12585, 0}, {12523, 12529, 12534, 12539, 12544, 12549, 12554, 12560, 12566, 12572, 12578, 12585, 0}, 2, 1, 763, 241, {1825,1301,0,0,0,0,0,0,0,0,0,0,0,0},{12156,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+       {3732, 1336, 1394, 1377, 1982, 3773, 12592, 12604, {12616, 12631, 12646, 12661, 12678, 12697, 12708}, {12719, 12726, 12733, 12740, 12747, 12754, 12761}, {0, 0, 0, 0, 0, 0, 0}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, 0, 1, 763, 241, {1336,1301,0,0,0,0,0,0,0,0,0,0,0,0},{3732,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,0,0,0,0,0,0,0,0}},
+       {3744, 3956, 23, 35, 44, 3773, 12932, 12952, {12969, 12982, 12995, 13011, 13028, 13043, 13052}, {12969, 12982, 12995, 13011, 13028, 13043, 13052}, {13061, 13064, 13067, 13070, 13073, 13076, 13079}, {13082, 13095, 13106, 13115, 13126, 13131, 13140, 13151, 13158, 13173, 13184, 13197, 0}, {13210, 13225, 13106, 13115, 13238, 13131, 13245, 13151, 13158, 13173, 13184, 13197, 0}, {13082, 13095, 13106, 13115, 13126, 13131, 13140, 13151, 13158, 13173, 13184, 13197, 0}, {13082, 13095, 13106, 13115, 13126, 13131, 13140, 13151, 13158, 13173, 13184, 13197, 0}, 0, 6, 239, 241, {3956,3947,0,0,0,0,0,0,0,0,0,0,0,0},{3744,3977,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+       {5487, 243, 2996, 3007, 1982, 55, 13258, 13261, {13264, 13277, 13287, 13296, 13306, 13317, 13328}, {13340, 13343, 13348, 13353, 13358, 13363, 13368}, {13340, 13373, 13376, 13379, 13382, 13385, 13388}, {13391, 13404, 13415, 13425, 13436, 13448, 13460, 13473, 13485, 13498, 13513, 13534, 0}, {13391, 13404, 13415, 13425, 13436, 13448, 13460, 13473, 13485, 13498, 13513, 13534, 0}, {13553, 13559, 13565, 13571, 13577, 13583, 13589, 13595, 13601, 13607, 13614, 13621, 0}, {13553, 13559, 13565, 13571, 13577, 13583, 13589, 13595, 13601, 13607, 13614, 13621, 0}, 0, 1, 239, 241, {243,14,1327,2351,1301,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {13628, 2647, 1394, 1377, 44, 4765, 13641, 13649, {13657, 13670, 13691, 13710, 13731, 13750, 13763}, {13774, 13781, 13788, 13795, 13802, 13809, 13816}, {0, 0, 0, 0, 0, 0, 0}, {13823, 13838, 13853, 13862, 13873, 13884, 13897, 13910, 13925, 13944, 13963, 13980, 0}, {13823, 13838, 13853, 13862, 13873, 13884, 13897, 13910, 13925, 13944, 13963, 13980, 0}, {13999, 14006, 14013, 14020, 14027, 14034, 14041, 14048, 14055, 14062, 14069, 14076, 0}, {13999, 14006, 14013, 14020, 14027, 14034, 14041, 14048, 14055, 14062, 14069, 14076, 0}, 0, 1, 763, 241, {2647,1336,14083,243,14093,3720,1301,0,0,0,0,0,0,0},{13628,2969,14104,5487,14123,14134,14146,14163},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3732, 2647, 1394, 1377, 1982, 4765, 0, 0, {14181, 14187, 14201, 14224, 14238, 14254, 14261}, {14270, 14273, 14278, 14284, 14288, 7414, 14293}, {6567, 6555, 6557, 6559, 6561, 6563, 6565}, {14297, 14304, 10132, 14311, 3897, 14317, 14323, 14329, 14336, 14345, 14353, 14360, 0}, {14297, 14304, 10132, 14311, 3897, 14317, 14323, 14329, 14336, 14345, 14353, 14360, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, 0, 1, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{3732,5487,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {14399, 1814, 1394, 274, 14426, 3773, 3781, 3784, {14442, 14450, 14461, 14471, 14482, 14491, 14500}, {14510, 14513, 14516, 14519, 14522, 14525, 14528}, {14531, 2463, 12319, 2471, 12319, 2467, 14531}, {14533, 14543, 14551, 14559, 14567, 14575, 14582, 14590, 14598, 14605, 14611, 14618, 0}, {14533, 14543, 14551, 14559, 14567, 14575, 14582, 14590, 14598, 14605, 14611, 14618, 0}, {14626, 14630, 2565, 14634, 4887, 14638, 14642, 14646, 14650, 14654, 14658, 14662, 0}, {14626, 14630, 2565, 14634, 4887, 14638, 14642, 14646, 14650, 14654, 14658, 14662, 0}, 2, 1, 239, 241, {1814,1301,0,0,0,0,0,0,0,0,0,0,0,0},{14399,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{1394,280,1402,0,0,0,0,0,0}},
+       {14104, 2647, 280, 274, 1982, 55, 14666, 14687, {14704, 403, 424, 8448, 14717, 14734, 14745}, {14758, 14766, 14774, 14780, 14788, 14796, 14804}, {528, 531, 534, 537, 540, 531, 537}, {14812, 556, 573, 582, 14827, 14834, 14843, 614, 627, 646, 663, 678, 0}, {14812, 556, 573, 582, 14827, 14834, 14843, 614, 627, 646, 663, 678, 0}, {14852, 14860, 14868, 711, 14827, 14876, 14884, 719, 727, 737, 745, 14892, 0}, {14852, 14860, 14868, 711, 14827, 14876, 14884, 719, 727, 737, 745, 14892, 0}, 0, 1, 763, 241, {2647,1336,1301,0,0,0,0,0,0,0,0,0,0,0},{14104,0,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+       {5487, 1814, 23, 35, 1982, 55, 0, 0, {14904, 14911, 14922, 14931, 14940, 14947, 14958}, {14968, 14972, 14976, 14980, 14984, 14987, 14991}, {0, 0, 0, 0, 0, 0, 0}, {14995, 15005, 15014, 15022, 15031, 15044, 15056, 15063, 15070, 15077, 15087, 15099, 0}, {14995, 15005, 15014, 15022, 15031, 15044, 15056, 15063, 15070, 15077, 15087, 15099, 0}, {15112, 15116, 15120, 15124, 15128, 15132, 15136, 15140, 15144, 15148, 15152, 15156, 0}, {15112, 15116, 15120, 15124, 15128, 15132, 15136, 15140, 15144, 15148, 15152, 15156, 0}, 0, 0, 239, 241, {1814,1857,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
+       {5487, 1814, 23, 35, 1982, 55, 0, 0, {15160, 15165, 15171, 15181, 15193, 15201, 15212}, {15221, 15225, 15229, 15233, 15237, 15241, 15245}, {0, 0, 0, 0, 0, 0, 0}, {15249, 15259, 15269, 15276, 15283, 2785, 15288, 15295, 15302, 15311, 15319, 15327, 0}, {15249, 15259, 15269, 15276, 15283, 2785, 15288, 15295, 15302, 15311, 15319, 15327, 0}, {2838, 2842, 14991, 15335, 15339, 2855, 2859, 15343, 2867, 2871, 2875, 15347, 0}, {2838, 2842, 14991, 15335, 15339, 2855, 2859, 15343, 2867, 2871, 2875, 15347, 0}, 0, 0, 239, 241, {1814,1857,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
+       {5487, 1814, 23, 35, 1982, 55, 3781, 3784, {15351, 15357, 15368, 15181, 15378, 15201, 15212}, {15387, 15391, 15395, 15233, 15237, 15241, 15245}, {2090, 2463, 15399, 2465, 2090, 5695, 2463}, {15401, 15411, 15422, 15429, 15438, 15444, 15450, 15458, 15466, 15477, 15487, 15496, 0}, {15505, 15259, 15514, 15520, 15283, 2785, 15288, 15295, 15527, 15311, 15319, 15327, 0}, {2838, 2842, 15537, 2851, 15339, 2855, 2859, 15343, 2867, 2871, 2875, 15347, 0}, {2838, 2842, 15537, 2851, 15339, 2855, 2859, 15343, 2867, 2871, 2875, 15347, 0}, 0, 0, 239, 241, {1814,1857,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
+       {5487, 1814, 23, 35, 1982, 55, 15541, 15545, {15549, 15556, 15564, 15572, 15581, 15591, 15598}, {2731, 8231, 2737, 15607, 2743, 15610, 2749}, {2090, 2463, 2752, 3872, 2752, 4134, 2090}, {15613, 15622, 15632, 2775, 10536, 15638, 15644, 15650, 2802, 2812, 2820, 10548, 0}, {15613, 15622, 15632, 2775, 10536, 15638, 15644, 15650, 2802, 2812, 2820, 10548, 0}, {2838, 2842, 3928, 2851, 10536, 2855, 2859, 2863, 2867, 2871, 2875, 10561, 0}, {2838, 2842, 3928, 2851, 10536, 2855, 2859, 2863, 2867, 2871, 2875, 10561, 0}, 0, 0, 239, 241, {1814,1857,1301,15659,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
+       {15671, 2647, 1394, 1377, 1982, 15703, 15709, 15725, {15747, 15763, 15788, 15816, 15844, 15872, 15900}, {15919, 15929, 15939, 15949, 15959, 15969, 15979}, {15989, 15993, 15997, 15993, 16001, 16005, 16009}, {16013, 16035, 16063, 16079, 16098, 16114, 16133, 16149, 16171, 16202, 16230, 16255, 0}, {16013, 16035, 16063, 16079, 16098, 16114, 16133, 16149, 16171, 16202, 16230, 16255, 0}, {16283, 16293, 16303, 16313, 16323, 16333, 16343, 16353, 16363, 16373, 16383, 16393, 0}, {16283, 16293, 16303, 16313, 16323, 16333, 16343, 16353, 16363, 16373, 16383, 16393, 0}, 0, 1, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{15671,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {1960, 2351, 280, 274, 1982, 2362, 16403, 16408, {5890, 16413, 16424, 16434, 16444, 16454, 16468}, {5976, 5980, 16480, 16485, 16489, 16494, 16499}, {2090, 2463, 2465, 2463, 5695, 2469, 2471}, {2473, 2480, 4876, 6032, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2473, 2480, 4876, 6032, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, 2, 1, 2601, 241, {2351,1327,1301,0,0,0,0,0,0,0,0,0,0,0},{1960,0,0,0,0,0,0,0},{274,4983,0,0,0,0,0,0,0,0,0,0},{280,6438,0,0,0,0,0,0,0}},
+       {5487, 2351, 280, 274, 44, 55, 16503, 16531, {16553, 16572, 16591, 16613, 16632, 16666, 16691}, {16710, 16721, 16732, 16746, 16757, 16768, 16785}, {16796, 16800, 16807, 16814, 16821, 16828, 16835}, {16839, 16855, 16871, 16887, 16906, 16913, 16923, 16939, 16955, 16977, 16999, 17018, 0}, {16839, 16855, 16871, 16887, 16906, 16913, 16923, 16939, 16955, 16977, 16999, 17018, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {2351,1327,2312,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
+       {17040, 243, 280, 274, 1982, 17065, 17079, 17082, {17085, 17094, 17103, 17113, 17123, 17133, 17145}, {17153, 17158, 17162, 17166, 17170, 17175, 17180}, {17184, 2465, 2465, 9681, 17184, 17187, 2090}, {17190, 17197, 17202, 2775, 17208, 17214, 17221, 17227, 17235, 17245, 17253, 17262, 0}, {17190, 17197, 17202, 2775, 17208, 17214, 17221, 17227, 17235, 17245, 17253, 17262, 0}, {2838, 17272, 3928, 2851, 17276, 17280, 17285, 17289, 17293, 17297, 2875, 17301, 0}, {2838, 17272, 3928, 2851, 17276, 17280, 17285, 17289, 17293, 17297, 2875, 17301, 0}, 0, 0, 239, 241, {243,1301,17306,7084,2987,0,0,0,0,0,0,0,0,0},{17040,17315,9942,0,0,0,0,0},{274,3007,1377,35,0,0,0,0,0,0,0,0},{280,2996,1394,23,0,0,0,0,0}},
+       {17334, 2647, 280, 274, 1982, 17352, 17366, 17371, {17376, 17388, 17399, 17413, 17425, 17435, 17445}, {17456, 17461, 17466, 17471, 17476, 17481, 17486}, {2090, 4134, 2463, 6229, 2752, 15399, 2471}, {17491, 17508, 17521, 17535, 17548, 17561, 17574, 17588, 17600, 17614, 17628, 17642, 0}, {17491, 17508, 17521, 17535, 17548, 17561, 17574, 17588, 17600, 17614, 17628, 17642, 0}, {17655, 17662, 17667, 17672, 17676, 17681, 17686, 17691, 17696, 17703, 17708, 17714, 0}, {17655, 17662, 17667, 17672, 17676, 17681, 17686, 17691, 17696, 17703, 17708, 17714, 0}, 2, 1, 763, 241, {2647,1336,2903,1301,0,0,0,0,0,0,0,0,0,0},{17334,0,0,0,0,0,0,0},{274,1377,4983,0,0,0,0,0,0,0,0,0},{280,1394,6438,0,0,0,0,0,0}},
+       {5487, 243, 1394, 1377, 1982, 55, 18012, 18015, {18019, 18024, 10453, 10460, 18030, 18037, 10477}, {18044, 18048, 10491, 10495, 18052, 10503, 10507}, {12319, 14531, 2090, 10511, 4419, 4132, 2090}, {10513, 10521, 18056, 2775, 10536, 2855, 18060, 18066, 2802, 2812, 2820, 18071, 0}, {10513, 10521, 18056, 2775, 10536, 2855, 18060, 18066, 2802, 2812, 2820, 18071, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18066, 2867, 2871, 2875, 15347, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18066, 2867, 2871, 2875, 15347, 0}, 0, 1, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {18523, 1336, 1394, 1377, 18543, 4765, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 1, 763, 241, {1336,1301,0,0,0,0,0,0,0,0,0,0,0,0},{18523,0,0,0,0,0,0,0},{1377,0,0,0,0,0,0,0,0,0,0,0},{1394,0,0,0,0,0,0,0,0}},
+       {3744, 3764, 2996, 3007, 44, 3773, 18559, 18567, {18575, 18584, 18593, 18601, 18610, 18619, 18626}, {18635, 18638, 18641, 18644, 18647, 18651, 18654}, {6557, 6559, 6561, 6563, 12319, 14531, 6555}, {10513, 10521, 18657, 18663, 10536, 2785, 18060, 18670, 15302, 18677, 15319, 18684, 0}, {10513, 10521, 18657, 18663, 10536, 2785, 18060, 18670, 15302, 18677, 15319, 18684, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18692, 2867, 2871, 2875, 10561, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18692, 2867, 2871, 2875, 10561, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {18696, 18714, 280, 274, 1982, 18725, 0, 0, {33660, 33670, 33679, 33688, 33699, 33709, 33714}, {33721, 33727, 33732, 33737, 33742, 10109, 33746}, {33751, 2752, 2090, 7414, 2085, 7414, 2090}, {14297, 14304, 10132, 14311, 3897, 33753, 33758, 33763, 14336, 14345, 14353, 14360, 0}, {14297, 14304, 10132, 14311, 3897, 33753, 33758, 33763, 14336, 14345, 14353, 14360, 0}, {33770, 33775, 3928, 2851, 3897, 33753, 33758, 33779, 10487, 2871, 33783, 33788, 0}, {33770, 33775, 3928, 2851, 3897, 33753, 33758, 33779, 10487, 2871, 33783, 33788, 0}, 0, 1, 239, 241, {18714,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{18696,3732,5487,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {5487, 1327, 6438, 4983, 44, 55, 18892, 18920, {18942, 18961, 18980, 19005, 19024, 19058, 19083}, {19102, 19112, 19122, 19138, 19148, 19173, 19189}, {19199, 19203, 19210, 19214, 19221, 19228, 19235}, {19239, 19267, 19301, 19317, 19336, 19343, 19353, 19369, 19385, 19416, 19438, 19460, 0}, {19239, 19267, 19301, 19317, 19336, 19343, 19353, 19369, 19385, 19416, 19438, 19460, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{4983,2327,19485,19494,0,0,0,0,0,0,0,0},{6438,2343,19502,19514,0,0,0,0,0}},
+       {5487, 1327, 280, 274, 44, 55, 20061, 20102, {20143, 20162, 20181, 20203, 20222, 20244, 20269}, {20288, 20298, 20308, 20321, 20331, 20344, 20360}, {20370, 20374, 20381, 20388, 20395, 20402, 20409}, {20413, 20441, 20469, 20485, 20504, 20511, 20521, 20537, 20553, 20581, 20603, 20625, 0}, {20413, 20441, 20469, 20485, 20504, 20511, 20521, 20537, 20553, 20581, 20603, 20625, 0}, {20650, 20669, 20469, 20485, 20504, 20511, 20521, 20537, 20688, 20704, 20720, 20730, 0}, {20650, 20669, 20469, 20485, 20504, 20511, 20521, 20537, 20688, 20704, 20720, 20730, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
+       {5487, 1327, 280, 274, 44, 55, 7865, 20743, {20746, 20765, 20784, 20809, 20828, 20850, 20875}, {20894, 20904, 20914, 20930, 20940, 20953, 20969}, {20979, 20983, 20990, 20994, 21001, 21008, 21015}, {21019, 21041, 21072, 21094, 21113, 21120, 21130, 21146, 21162, 21193, 21215, 21237, 0}, {21019, 21041, 21072, 21094, 21113, 21120, 21130, 21146, 21162, 21193, 21215, 21237, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
+       {5487, 2351, 280, 274, 1982, 55, 21262, 21287, {21312, 21331, 21353, 21378, 21394, 21416, 21435}, {21445, 21452, 21459, 21466, 21473, 21480, 21487}, {21445, 21452, 21459, 21466, 21473, 21480, 21487}, {21491, 21507, 21532, 21551, 21570, 21577, 21590, 21603, 21622, 21653, 21678, 21700, 0}, {21491, 21507, 21532, 21551, 21570, 21577, 21590, 21725, 21622, 21653, 21678, 21700, 0}, {21744, 21752, 21766, 21780, 21570, 21577, 21590, 21791, 21799, 21813, 21824, 21832, 0}, {21744, 21752, 21766, 21780, 21570, 21577, 21590, 21791, 21799, 21813, 21824, 21832, 0}, 0, 0, 2601, 241, {2351,1327,2312,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
+       {5487, 1327, 280, 274, 44, 55, 21843, 21874, {21899, 21921, 21943, 21968, 21990, 22015, 22043}, {22065, 22075, 22085, 22098, 22108, 22121, 22137}, {22147, 22151, 22158, 22162, 22169, 22176, 22183}, {22187, 22203, 22228, 22247, 22269, 22276, 22289, 22302, 22321, 22352, 22377, 22396, 0}, {22187, 22203, 22228, 22247, 22269, 22276, 22289, 22302, 22321, 22352, 22377, 22396, 0}, {22421, 22428, 6559, 22444, 22269, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {22421, 22428, 6559, 22444, 22269, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
+       {5487, 1327, 280, 274, 44, 55, 3781, 3784, {22460, 22479, 22498, 22520, 22539, 22561, 22586}, {22605, 22610, 22618, 22626, 22634, 22642, 22650}, {22661, 22665, 22672, 22679, 22686, 22693, 22700}, {22704, 22720, 22745, 22764, 22786, 22793, 22806, 22819, 22838, 22866, 22891, 22913, 0}, {22704, 22720, 22745, 22764, 22786, 22793, 22806, 22819, 22838, 22866, 22891, 22913, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
+       {5487, 1327, 6438, 4983, 44, 55, 22938, 22957, {22988, 23013, 23044, 23072, 23097, 23125, 23159}, {23184, 23203, 23228, 23244, 23263, 23282, 23301}, {23311, 23318, 23325, 23332, 23339, 23352, 23359}, {23363, 23382, 23410, 23438, 23463, 23476, 23492, 23505, 23530, 23567, 23595, 23617, 0}, {23363, 23382, 23410, 23438, 23463, 23476, 23492, 23505, 23530, 23567, 23595, 23617, 0}, {23642, 23652, 23671, 23687, 23463, 23476, 23492, 23703, 23710, 23735, 23751, 23761, 0}, {23642, 23652, 23671, 23687, 23463, 23476, 23492, 23703, 23710, 23735, 23751, 23761, 0}, 0, 0, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{4983,2327,19485,19494,0,0,0,0,0,0,0,0},{6438,2343,19502,19514,0,0,0,0,0}},
+       {23774, 2351, 1937, 1920, 23793, 55, 23801, 23829, {23851, 23870, 23889, 23914, 23933, 23967, 23992}, {24011, 19112, 19122, 19138, 24021, 24046, 19189}, {0, 0, 0, 0, 0, 0, 0}, {24062, 24087, 24118, 24134, 19336, 19343, 19353, 24153, 24169, 24200, 24222, 24244, 0}, {24062, 24087, 24118, 24134, 19336, 19343, 19353, 24153, 24169, 24200, 24222, 24244, 0}, {24269, 24282, 24118, 24134, 19336, 19343, 19353, 24301, 24308, 24324, 24340, 24350, 0}, {24269, 24282, 24118, 24134, 19336, 19343, 19353, 24301, 24308, 24324, 24340, 24350, 0}, 0, 0, 2601, 241, {2351,0,0,0,0,0,0,0,0,0,0,0,0,0},{23774,0,0,0,0,0,0,0},{1920,1928,0,0,0,0,0,0,0,0,0,0},{1937,1948,0,0,0,0,0,0,0}},
+       {5487, 2351, 280, 274, 44, 55, 3781, 3784, {16553, 16572, 24363, 16613, 24385, 16666, 16691}, {24407, 24417, 24427, 24440, 24450, 24463, 24479}, {16796, 16800, 16807, 16814, 16821, 16828, 16835}, {24489, 24514, 16871, 24545, 24564, 16913, 24571, 24584, 24600, 24625, 24647, 24675, 0}, {24489, 24514, 16871, 24545, 24564, 16913, 24571, 24584, 24600, 24625, 24647, 24675, 0}, {24697, 24710, 16871, 24729, 24564, 16913, 24571, 24745, 24752, 6573, 24774, 24796, 0}, {24697, 24710, 16871, 24729, 24564, 16913, 24571, 24745, 24752, 6573, 24774, 24796, 0}, 0, 0, 2601, 241, {2351,1327,2312,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
+       {25177, 1444, 280, 274, 25220, 25227, 25253, 25275, {25300, 25328, 25356, 25393, 25424, 25458, 25483}, {25517, 25533, 25549, 25574, 25593, 25615, 25634}, {25656, 25663, 25670, 25677, 25684, 25691, 25695}, {25705, 25739, 25776, 25810, 25844, 25875, 25912, 25949, 25989, 26023, 26057, 26106, 0}, {25705, 25739, 25776, 25810, 25844, 25875, 25912, 25949, 25989, 26023, 26057, 26106, 0}, {26155, 26168, 26181, 26194, 26207, 26220, 26233, 26246, 26259, 26272, 26288, 26304, 0}, {26155, 26168, 26181, 26194, 26207, 26220, 26233, 26246, 26259, 26272, 26288, 26304, 0}, 0, 0, 239, 241, {1444,1796,1805,1825,1301,1814,1836,1843,1850,0,0,0,0,0},{25177,26320,0,0,0,0,0,0},{274,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+       {5487, 243, 280, 274, 1982, 55, 0, 0, {26368, 26377, 26387, 26399, 26412, 26421, 26433}, {26445, 26449, 26454, 26458, 26462, 26466, 26470}, {2090, 2471, 2463, 2463, 14531, 6229, 2090}, {26474, 26481, 26490, 26497, 2781, 26504, 26512, 26523, 26528, 26533, 26540, 26549, 0}, {26474, 26481, 26490, 26497, 2781, 26504, 26557, 26523, 26528, 26533, 26540, 26549, 0}, {26567, 26571, 26454, 26576, 2781, 26580, 26584, 26523, 26528, 26588, 26592, 26597, 0}, {26567, 26571, 26454, 26576, 2781, 26580, 26584, 26523, 26528, 26588, 26592, 26597, 0}, 2, 0, 239, 241, {243,14,1320,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,35,3007,0,0,0,0,0,0,0,0},{280,1394,23,2996,0,0,0,0,0}},
+       {3732, 1301, 280, 26602, 26610, 26645, 26681, 26697, {26713, 26747, 26778, 26809, 26831, 26874, 26902}, {26927, 26934, 26938, 26942, 26949, 26959, 26966}, {0, 0, 0, 0, 0, 0, 0}, {26970, 26983, 27002, 27015, 27028, 27041, 27060, 27079, 27092, 27108, 27121, 27146, 0}, {26970, 26983, 27002, 27015, 27028, 27041, 27060, 27079, 27092, 27108, 27121, 27146, 0}, {27159, 27163, 27167, 27171, 27175, 27179, 27183, 27187, 27191, 27195, 27202, 27209, 0}, {27159, 27163, 27167, 27171, 27175, 27179, 27183, 27187, 27191, 27195, 27202, 27209, 0}, 0, 0, 2601, 241, {1301,0,0,0,0,0,0,0,0,0,0,0,0,0},{3732,9954,0,0,0,0,0,0},{26602,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+       {5487, 243, 280, 26602, 1982, 55, 27216, 27241, {27266, 27291, 27310, 27338, 27357, 27382, 27401}, {27423, 27431, 27436, 27441, 27446, 27454, 27462}, {0, 0, 0, 0, 0, 0, 0}, {27467, 27486, 27502, 27515, 27528, 27550, 27569, 27591, 27607, 27623, 27636, 27652, 0}, {27467, 27486, 27502, 27515, 27528, 27550, 27569, 27591, 27607, 27623, 27636, 27652, 0}, {27668, 27677, 27686, 27698, 27708, 27717, 27729, 27738, 27747, 27756, 27765, 27774, 0}, {27668, 27677, 27686, 27698, 27708, 27717, 27729, 27738, 27747, 27756, 27765, 27774, 0}, 0, 0, 239, 241, {243,1301,0,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{26602,0,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+       {4005, 243, 1394, 1377, 4034, 55, 946, 951, {27783, 27791, 27796, 27803, 27813, 27819, 27826}, {27834, 27838, 3928, 27842, 27847, 27851, 27855}, {2752, 2471, 2463, 2463, 4130, 4134, 2090}, {27860, 27868, 6248, 27877, 27883, 27888, 27894, 6282, 27900, 27909, 27917, 27926, 0}, {27860, 27868, 6248, 27877, 27883, 27888, 27894, 6282, 27900, 27909, 27917, 27926, 0}, {27935, 2842, 3928, 27939, 2781, 27943, 27948, 18692, 17293, 27952, 2875, 3936, 0}, {27935, 2842, 3928, 27939, 2781, 27943, 27948, 18692, 17293, 27952, 2875, 3936, 0}, 2, 1, 239, 241, {243,14,1312,1320,1327,1336,1301,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{1377,274,35,1382,0,0,0,0,0,0,0,0},{1394,280,23,1402,0,0,0,0,0}},
+       {5487, 2351, 280, 274, 44, 55, 27956, 27968, {27980, 16572, 28008, 16613, 24385, 16666, 16691}, {24407, 24417, 24427, 24440, 24450, 24463, 24479}, {0, 0, 0, 0, 0, 0, 0}, {24489, 24514, 16871, 24545, 24564, 16913, 24571, 28027, 28043, 28071, 24647, 24675, 0}, {24489, 24514, 16871, 24545, 24564, 16913, 24571, 28027, 28043, 28071, 24647, 24675, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 2601, 241, {2351,1327,2312,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,1920,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
+       {28093, 1301, 2996, 3007, 28141, 3773, 28151, 28163, {28172, 28188, 28204, 28232, 28248, 28291, 28316}, {28344, 28354, 28364, 28371, 28381, 28397, 28410}, {28420, 28424, 28428, 28432, 28436, 28449, 28456}, {28463, 28482, 28507, 28526, 28551, 28564, 28577, 28590, 28612, 28646, 28671, 28699, 0}, {28463, 28482, 28507, 28526, 28551, 28564, 28577, 28590, 28612, 28646, 28671, 28699, 0}, {28727, 28734, 28744, 28526, 28551, 28564, 28577, 28757, 28767, 28780, 28790, 28803, 0}, {28727, 28734, 28744, 28526, 28551, 28564, 28577, 28757, 28767, 28780, 28790, 28803, 0}, 0, 1, 2601, 241, {1301,1814,1857,243,14,0,0,0,0,0,0,0,0,0},{28093,0,0,0,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {28816, 2987, 2996, 3007, 1982, 28848, 28862, 28872, {28885, 28895, 28902, 28915, 28925, 28935, 28945}, {28885, 28895, 28955, 28915, 28925, 28935, 28945}, {28965, 28969, 28973, 28977, 28981, 28985, 28989}, {28993, 29009, 29025, 29035, 29048, 29055, 29062, 29072, 29085, 29104, 29123, 29139, 0}, {28993, 29009, 29025, 29035, 29048, 29055, 29062, 29072, 29085, 29104, 29123, 29139, 0}, {29155, 29165, 29025, 29175, 29048, 29055, 29062, 29185, 29195, 29205, 29215, 29225, 0}, {29155, 29165, 29025, 29175, 29048, 29055, 29062, 29185, 29195, 29205, 29215, 29225, 0}, 0, 0, 239, 241, {2987,1301,0,0,0,0,0,0,0,0,0,0,0,0},{28816,0,0,0,0,0,0,0},{3007,0,0,0,0,0,0,0,0,0,0,0},{2996,0,0,0,0,0,0,0,0}},
+       {3744, 3764, 2996, 3007, 29476, 3773, 29486, 29527, {29568, 29587, 29606, 29631, 29650, 29672, 29697}, {29716, 24417, 29726, 24440, 29742, 24463, 24479}, {29755, 29759, 29763, 29767, 29771, 29775, 29779}, {16839, 29783, 16871, 29811, 24564, 29830, 16923, 16939, 29840, 29871, 29893, 29918, 0}, {16839, 29783, 16871, 29811, 24564, 29830, 16923, 16939, 29840, 29871, 29893, 29918, 0}, {29943, 29950, 16871, 29960, 24564, 29830, 29976, 29989, 29996, 30012, 30028, 30041, 0}, {29943, 29950, 16871, 29960, 24564, 29830, 29976, 29989, 29996, 30012, 30028, 30041, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {243, 14, 2996, 3007, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {30054, 30061, 30070, 30085, 30096, 30105, 30112, 30119, 30126, 30137, 30150, 30163, 0}, {30054, 30061, 30070, 30085, 30096, 30105, 30112, 30119, 30126, 30137, 30150, 30163, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 6, 239, 241, {14,243,0,0,0,0,0,0,0,0,0,0,0,0},{243,1,254,30168,0,0,0,0},{3007,1377,0,0,0,0,0,0,0,0,0,0},{2996,1394,0,0,0,0,0,0,0}},
+       {3744, 3764, 2996, 3007, 44, 3773, 3781, 3784, {30186, 30193, 27796, 30199, 30210, 30218, 30227}, {30234, 27838, 3928, 30238, 30242, 30246, 10507}, {2471, 2471, 2463, 2463, 5695, 15399, 2090}, {30250, 30256, 30264, 27877, 30270, 30275, 30281, 6282, 30287, 30297, 30305, 30315, 0}, {30250, 30256, 30264, 27877, 30270, 30275, 30281, 6282, 30287, 30297, 30305, 30315, 0}, {30325, 30329, 3928, 27939, 3897, 30333, 30337, 18692, 17293, 2871, 30341, 15347, 0}, {30325, 30329, 3928, 27939, 3897, 30333, 30337, 18692, 17293, 2871, 30341, 15347, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {3744, 2987, 2996, 3007, 44, 3773, 0, 0, {30345, 30352, 30360, 30367, 30374, 30382, 30390}, {30397, 30400, 30403, 30406, 30409, 30412, 30415}, {2471, 2471, 2465, 2471, 12319, 4132, 12319}, {30418, 30426, 30436, 30442, 30450, 30455, 30460, 30465, 30472, 18677, 30480, 30488, 0}, {30418, 30426, 30436, 30442, 30450, 30455, 30460, 30465, 30472, 18677, 30480, 30488, 0}, {2838, 30496, 3928, 30500, 3897, 29439, 29443, 30504, 3868, 2871, 30508, 15347, 0}, {2838, 30496, 3928, 30500, 3897, 29439, 29443, 30504, 3868, 2871, 30508, 15347, 0}, 0, 0, 239, 241, {2987,1320,14,243,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {3744, 2987, 2996, 3007, 44, 3773, 30512, 30523, {30533, 30551, 30566, 30588, 30601, 30615, 30632}, {30656, 30664, 30669, 30588, 30601, 30681, 30688}, {0, 0, 0, 0, 0, 0, 0}, {30702, 30724, 30740, 30760, 30774, 30791, 30806, 30823, 30837, 30850, 30869, 30883, 0}, {30702, 30724, 30740, 30760, 30774, 30791, 30806, 30823, 30837, 30850, 30869, 30883, 0}, {30902, 30917, 30926, 30939, 30946, 30956, 30964, 30974, 30981, 30987, 30999, 31006, 0}, {30902, 30917, 30926, 30939, 30946, 30956, 30964, 30974, 30981, 30987, 30999, 31006, 0}, 0, 0, 239, 241, {2987,1320,14,243,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {5487, 1814, 23, 35, 1982, 55, 0, 0, {31018, 31026, 14922, 14931, 14940, 31037, 31047}, {15387, 14972, 14976, 14980, 14984, 15241, 31056}, {0, 0, 0, 0, 0, 0, 0}, {31060, 31069, 31079, 31087, 10536, 3901, 31095, 31101, 31110, 31119, 31128, 31137, 0}, {31060, 31069, 31079, 31087, 10536, 3901, 31095, 31101, 31110, 31119, 31128, 31137, 0}, {2838, 2842, 14991, 31146, 10536, 2855, 2859, 18692, 17293, 2871, 31150, 15347, 0}, {2838, 2842, 14991, 31146, 10536, 2855, 2859, 18692, 17293, 2871, 31150, 15347, 0}, 0, 0, 239, 241, {1814,1857,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,3007,274,0,0,0,0,0,0,0,0,0},{23,2996,280,0,0,0,0,0,0}},
+       {1960, 2351, 280, 274, 1982, 2362, 31154, 31159, {31164, 31171, 31186, 31200, 31216, 31231, 31247}, {6225, 31262, 2565, 31266, 31270, 31274, 31278}, {2090, 12319, 2463, 2085, 2090, 2465, 12319}, {7172, 7180, 31282, 31289, 31296, 2504, 2509, 31301, 31311, 31322, 31331, 31341, 0}, {7172, 7180, 31282, 31289, 31296, 2504, 2509, 31301, 31311, 31322, 31331, 31341, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 0, 0, 2601, 241, {2351,1327,1301,2603,0,0,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {3744, 2987, 2996, 3007, 44, 3773, 31351, 31356, {31361, 31377, 31385, 31393, 31402, 31414, 31424}, {31434, 31440, 31446, 31450, 31454, 31462, 3868}, {0, 0, 0, 0, 0, 0, 0}, {31469, 31482, 31496, 31505, 31511, 31515, 31520, 31528, 15302, 31541, 15319, 15327, 0}, {31469, 31482, 31496, 31505, 31511, 31515, 31520, 31528, 15302, 31541, 15319, 15327, 0}, {31550, 2842, 31554, 15335, 31511, 31558, 2859, 31562, 2867, 31570, 2875, 15347, 0}, {31550, 2842, 31554, 15335, 31511, 31558, 2859, 31562, 2867, 31570, 2875, 15347, 0}, 0, 0, 239, 241, {2987,1320,14,243,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {31576, 1444, 1394, 1920, 31600, 31617, 31631, 31638, {31645, 31655, 31665, 31675, 31685, 31695, 31705}, {31715, 31722, 31729, 31736, 31743, 31750, 31757}, {31764, 31768, 31772, 31776, 31780, 31784, 31788}, {31792, 31799, 31806, 31813, 31820, 31827, 31834, 31841, 31848, 31855, 31862, 31872, 0}, {31792, 31799, 31806, 31813, 31820, 31827, 31834, 31841, 31848, 31855, 31862, 31872, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 0, 239, 241, {1444,1796,1805,1825,1301,1814,0,0,0,0,0,0,0,0},{31576,31882,31912,0,0,0,0,0},{1920,1377,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {4748, 243, 280, 274, 1982, 4765, 0, 0, {26445, 27838, 31942, 31949, 31959, 31964, 31971}, {31978, 4108, 31982, 4839, 31987, 31992, 31997}, {4398, 32002, 32005, 32008, 32011, 32014, 32017}, {32020, 32027, 31942, 32038, 32044, 32048, 32057, 32064, 32069, 32078, 8225, 32083, 0}, {32020, 32027, 31942, 32038, 32044, 32048, 32057, 32064, 32069, 32078, 8225, 32083, 0}, {32089, 32093, 32100, 26576, 32044, 32105, 32110, 32064, 32115, 32078, 8225, 32120, 0}, {32089, 32093, 32100, 26576, 32044, 32105, 32110, 32064, 32115, 32078, 8225, 32120, 0}, 2, 1, 239, 241, {243,14,1336,1327,1301,0,0,0,0,0,0,0,0,0},{4748,4974,3732,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {32124, 243, 280, 274, 1982, 4765, 0, 0, {32152, 32160, 32167, 32175, 32185, 32193, 1007}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {32204, 32212, 1064, 1070, 4887, 32221, 32226, 1093, 1099, 32233, 1116, 32242, 0}, {32204, 32212, 1064, 1070, 4887, 32221, 32226, 1093, 1099, 32233, 1116, 32242, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 2, 1, 239, 241, {243,14,1336,1327,1301,0,0,0,0,0,0,0,0,0},{32124,0,0,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {32404, 32422, 1394, 1377, 32433, 3773, 32449, 32454, {32459, 32484, 32513, 32538, 32551, 32566, 32583}, {32598, 32603, 32608, 32613, 32618, 32623, 8534}, {32628, 32628, 32631, 8545, 8548, 32628, 8545}, {32634, 32653, 32668, 32690, 32710, 32726, 32742, 32756, 32782, 32806, 32823, 32840, 0}, {32634, 32653, 32668, 32690, 32710, 32726, 32742, 32756, 32782, 32806, 32823, 32840, 0}, {32857, 32866, 32875, 32889, 32903, 32915, 32927, 32937, 32953, 32967, 32974, 32981, 0}, {32857, 32866, 32875, 32889, 32903, 32915, 32927, 32937, 32953, 32967, 32974, 32981, 0}, 0, 1, 763, 241, {32422,32988,2903,3947,32997,0,0,0,0,0,0,0,0,0},{32404,33008,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3744, 3764, 2996, 3007, 44, 3773, 0, 0, {33027, 33039, 33050, 33062, 33074, 33084, 33096}, {33111, 33116, 33121, 33126, 33131, 33136, 33141}, {0, 0, 0, 0, 0, 0, 0}, {33146, 33155, 33167, 33175, 33180, 33190, 33197, 33206, 33213, 33219, 33228, 33239, 0}, {33146, 33155, 33167, 33175, 33180, 33190, 33197, 33206, 33213, 33219, 33228, 33239, 0}, {33247, 33252, 33257, 33262, 33267, 33272, 33277, 33131, 33282, 33287, 33292, 33297, 0}, {33247, 33252, 33257, 33262, 33267, 33272, 33277, 33131, 33282, 33287, 33292, 33297, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {5487, 243, 280, 274, 1982, 55, 6008, 6013, {33302, 33315, 33323, 33332, 33342, 33352, 33361}, {33373, 33377, 33381, 33385, 33389, 33393, 33397}, {2752, 2471, 2463, 7414, 12319, 5695, 2090}, {33401, 33415, 33426, 33435, 33446, 33458, 33472, 33484, 33497, 33510, 33522, 33535, 0}, {33401, 33415, 33426, 33435, 33446, 33458, 33472, 33484, 33497, 33510, 33522, 33535, 0}, {33549, 33554, 33560, 33566, 33571, 33577, 33583, 33588, 33594, 33599, 18002, 33605, 0}, {33549, 33554, 33560, 33566, 33571, 33577, 33583, 33588, 33594, 33599, 18002, 33605, 0}, 2, 0, 239, 241, {243,14,1320,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,35,3007,0,0,0,0,0,0,0,0},{280,1394,23,2996,0,0,0,0,0}},
+       {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+       {1422, 1444, 1394, 1377, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {1566, 1573, 1580, 1587, 1594, 1601, 1608}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, 0, 0, 239, 241, {1444,1796,1805,1301,1814,1825,1836,1843,1850,1857,0,0,0,0},{1422,1866,1893,0,0,0,0,0},{1377,274,1920,1928,0,0,0,0,0,0,0,0},{1394,280,1937,1948,0,0,0,0,0}},
+       {2628, 2647, 280, 274, 1982, 55, 2658, 2664, {2671, 2679, 2686, 2695, 2704, 2715, 2723}, {2731, 2734, 2737, 2740, 2743, 2746, 2749}, {2090, 2463, 2752, 2463, 2752, 2469, 2090}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, 2, 1, 763, 241, {2647,1336,2895,33792,2903,1301,0,0,0,0,0,0,0,0},{2628,1960,33802,0,0,0,0,0},{274,1377,8087,8077,2922,8110,8115,8096,8102,0,0,0},{280,1394,8147,8160,2947,2933,2962,0,0}},
+       {5487, 243, 280, 274, 1982, 55, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 2, 0, 239, 241, {243,14,1320,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,35,3007,0,0,0,0,0,0,0,0},{280,1394,23,2996,0,0,0,0,0}},
+       {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,3720,14,1312,1320,1327,1301,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
+       {4748, 14083, 280, 274, 1982, 4765, 3781, 3784, {4772, 4781, 4787, 4793, 4802, 4808, 4817}, {4824, 4829, 4834, 4839, 4844, 4849, 4854}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, 2, 1, 239, 241, {14083,1312,1336,1857,1327,243,1301,0,0,0,0,0,0,0},{4748,3732,3967,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {2628, 2647, 280, 274, 1982, 2362, 6145, 6148, {6151, 6160, 6168, 6177, 6188, 6197, 6206}, {4104, 4108, 2565, 6213, 6217, 6221, 6225}, {2752, 2471, 2463, 2463, 6229, 4134, 2090}, {6231, 6239, 6248, 6254, 6261, 6268, 6275, 6282, 6289, 6299, 6307, 6316, 0}, {6325, 6333, 4150, 6342, 6349, 6356, 6363, 4173, 6370, 6380, 1116, 6388, 0}, {6397, 2561, 2565, 2569, 6401, 6405, 6409, 4219, 6413, 6417, 2593, 4227, 0}, {6397, 2561, 2565, 2569, 6401, 6405, 6409, 4219, 6413, 6417, 2593, 4227, 0}, 2, 1, 763, 241, {2647,1336,11642,1320,6421,1301,0,0,0,0,0,0,0,0},{2628,6429,3732,0,0,0,0,0},{274,1377,8087,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {4748, 14083, 1394, 1377, 1982, 55, 946, 951, {7093, 7100, 7108, 7116, 7125, 7135, 7143}, {7152, 4401, 7155, 7158, 7161, 7164, 7167}, {7170, 2463, 2752, 3872, 2752, 4134, 7170}, {7172, 7180, 7189, 2494, 7195, 2504, 2509, 7199, 2521, 2531, 2539, 2548, 0}, {7172, 7180, 7189, 2494, 7195, 2504, 2509, 7199, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 7208, 2569, 7195, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 7208, 2569, 7195, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 239, 241, {14083,1312,1327,1336,2883,1301,0,0,0,0,0,0,0,0},{4748,3967,3732,5530,0,0,0,0},{1377,274,33812,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {1960, 2647, 280, 274, 1982, 2362, 2370, 2375, {2380, 9835, 33822, 2403, 2410, 2418, 33829}, {2433, 9863, 33837, 2446, 2450, 2454, 6004}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, 2, 1, 763, 241, {2647,1336,2903,1301,2883,0,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,7296,4983,0,0,0,0,0,0,0,0},{280,1394,7307,6438,0,0,0,0,0}},
+       {7648, 2351, 280, 274, 4034, 33841, 946, 951, {27783, 33845, 33859, 33872, 33885, 33898, 27826}, {4104, 7754, 7758, 7762, 7766, 7770, 4125}, {2752, 2090, 2465, 7774, 7774, 2090, 2090}, {33910, 33918, 33928, 27877, 27883, 33935, 33941, 6282, 27900, 27909, 27917, 33947, 0}, {33910, 33918, 33928, 27877, 27883, 33935, 33941, 6282, 27900, 27909, 27917, 33947, 0}, {2838, 33775, 3928, 27939, 2781, 2855, 2859, 18692, 17293, 27952, 2875, 2879, 0}, {2838, 33775, 3928, 27939, 2781, 2855, 2859, 18692, 17293, 27952, 2875, 2879, 0}, 2, 1, 2601, 241, {2351,14134,24833,2903,14,1301,0,0,0,0,0,0,0,0},{7648,4258,33956,33965,0,0,0,0},{274,33974,0,0,0,0,0,0,0,0,0,0},{280,0,0,0,0,0,0,0,0}},
+       {9790, 1973, 280, 274, 1982, 9808, 9821, 9824, {9827, 9835, 9843, 2403, 2410, 2418, 9850}, {9858, 9863, 9868, 2446, 2450, 2454, 9872}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {7172, 7180, 4876, 2494, 2500, 2504, 2509, 9877, 2521, 2531, 2539, 2548, 0}, {7172, 7180, 4876, 2494, 2500, 2504, 2509, 9877, 2521, 2531, 2539, 2548, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 2581, 2585, 2589, 2593, 2597, 0}, 2, 1, 763, 241, {1973,2647,2903,1301,0,0,0,0,0,0,0,0,0,0},{9790,9885,0,0,0,0,0,0},{274,1377,9908,0,0,0,0,0,0,0,0,0},{280,1394,9918,0,0,0,0,0,0}},
+       {3732, 2647, 1394, 1377, 1982, 4765, 0, 0, {33985, 33996, 34020, 34050, 34067, 34089, 34098}, {14270, 14273, 14278, 14284, 14288, 7414, 14293}, {6567, 6555, 6557, 6559, 6561, 6563, 6565}, {34109, 34122, 573, 34135, 593, 34146, 34155, 614, 34164, 34181, 34196, 34209, 0}, {34109, 34122, 573, 34135, 593, 34146, 34155, 614, 34164, 34181, 34196, 34209, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, 0, 1, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{3732,5487,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3732, 243, 280, 274, 1982, 55, 946, 951, {17719, 17733, 17743, 17754, 17768, 17779, 17790}, {17803, 17808, 17813, 17820, 17826, 17832, 17838}, {2752, 2471, 2463, 7414, 2752, 12319, 2090}, {17843, 17851, 17859, 17866, 17875, 17885, 17895, 17901, 17909, 17924, 17942, 17950, 0}, {17843, 17851, 17859, 17866, 17875, 17885, 17895, 17901, 17909, 17924, 17942, 17950, 0}, {17958, 17962, 17859, 17968, 17972, 17977, 17895, 17983, 17988, 17995, 18002, 18007, 0}, {17958, 17962, 17859, 17968, 17972, 17977, 17895, 17983, 17988, 17995, 18002, 18007, 0}, 2, 1, 239, 241, {243,14,1320,2903,1301,0,0,0,0,0,0,0,0,0},{3732,5487,9942,9931,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {5487, 243, 1394, 1377, 1982, 55, 18012, 18015, {18019, 18024, 10453, 10460, 18030, 18037, 10477}, {18044, 18048, 10491, 10495, 18052, 10503, 10507}, {12319, 14531, 2090, 10511, 4419, 4132, 2090}, {10513, 10521, 18056, 2775, 10536, 2855, 18060, 18066, 2802, 2812, 2820, 18071, 0}, {10513, 10521, 18056, 2775, 10536, 2855, 18060, 18066, 2802, 2812, 2820, 18071, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18066, 2867, 2871, 2875, 15347, 0}, {2838, 2842, 18056, 2851, 10536, 2855, 2859, 18066, 2867, 2871, 2875, 15347, 0}, 0, 1, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {34222, 2647, 280, 274, 1982, 18725, 0, 0, {18732, 18747, 18762, 18777, 18794, 18811, 18820}, {18831, 18838, 18845, 18852, 18859, 18866, 18873}, {18880, 18883, 8545, 8548, 8542, 18886, 18889}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, 0, 1, 763, 241, {2647,1336,18714,2903,14,1301,0,0,0,0,0,0,0,0},{34222,3732,5487,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {5487, 1327, 6438, 4983, 44, 55, 18892, 18920, {18942, 18961, 18980, 19005, 19024, 19058, 19083}, {19102, 19112, 19122, 19138, 19148, 19173, 19189}, {19199, 19203, 19210, 19214, 19221, 19228, 19235}, {19239, 19267, 19301, 19317, 19336, 19343, 19353, 19369, 19385, 19416, 19438, 19460, 0}, {19239, 19267, 19301, 19317, 19336, 19343, 19353, 19369, 19385, 19416, 19438, 19460, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, {6555, 6557, 6559, 6561, 6563, 6565, 6567, 6569, 6571, 6573, 6576, 6579, 0}, 0, 5, 2601, 241, {1327,2312,2903,2351,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{4983,2327,19485,19494,0,0,0,0,0,0,0,0},{6438,2343,19502,19514,0,0,0,0,0}},
+       {34243, 1444, 1394, 1377, 34319, 34351, 0, 0, {24859, 24866, 24877, 24890, 24903, 24914, 24927}, {24938, 24943, 24948, 24953, 24958, 24963, 24968}, {0, 0, 0, 0, 0, 0, 0}, {24973, 24988, 24997, 25004, 25017, 25024, 25035, 25044, 25053, 25060, 25071, 25082, 0}, {24973, 24988, 24997, 25004, 25017, 25024, 25035, 25044, 25053, 25060, 25071, 25082, 0}, {25093, 25100, 25107, 25114, 25121, 25128, 25135, 25142, 25149, 25156, 25163, 25170, 0}, {25093, 25100, 25107, 25114, 25121, 25128, 25135, 25142, 25149, 25156, 25163, 25170, 0}, 0, 0, 239, 241, {1444,1796,1805,1825,1301,1814,1836,1843,1850,1857,0,0,0,0},{34243,34386,0,0,0,0,0,0},{1377,0,0,0,0,0,0,0,0,0,0,0},{1394,0,0,0,0,0,0,0,0}},
+       {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+       {1422, 2987, 1394, 1377, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {33611, 33618, 33625, 33632, 33639, 33646, 33653}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, 0, 0, 239, 241, {2987,1320,14,1843,1857,1444,1814,1301,0,0,0,0,0,0},{1422,6639,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {34470, 2647, 280, 274, 1982, 55, 2658, 2664, {2671, 2679, 2686, 2695, 2704, 2715, 2723}, {2731, 2734, 2737, 2740, 2743, 2746, 2749}, {2090, 2463, 2752, 2463, 2752, 2469, 2090}, {34490, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {34490, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {34498, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, {34498, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, 2, 1, 763, 241, {2647,1336,34503,1301,0,0,0,0,0,0,0,0,0,0},{34470,34513,34525,9931,0,0,0,0},{274,1377,34535,34547,8110,8115,8102,0,0,0,0,0},{280,1394,2947,2933,2962,0,0,0,0}},
+       {2969, 14083, 2996, 3007, 1982, 55, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {14083,1312,1320,2987,14,243,3967,5500,1301,1857,1814,0,0,0},{2969,3732,0,0,0,0,0,0},{3007,1377,274,0,0,0,0,0,0,0,0,0},{2996,1394,280,0,0,0,0,0,0}},
+       {4005, 243, 1394, 1377, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 4130, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 2, 1, 239, 241, {243,14,1312,1320,1327,1336,1301,2883,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{1377,274,1382,0,0,0,0,0,0,0,0,0},{1394,280,1402,0,0,0,0,0,0}},
+       {3732, 1301, 280, 274, 44, 4765, 3781, 3784, {4772, 4781, 4787, 4793, 4802, 4808, 4817}, {4824, 4829, 4834, 4839, 4844, 4849, 4854}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, 0, 0, 2601, 241, {1301,5871,1327,6136,14,3720,0,0,0,0,0,0,0,0},{3732,9931,0,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {17334, 1973, 1394, 1377, 1982, 17352, 17366, 17371, {34558, 34566, 34574, 34582, 34594, 34603, 34615}, {17456, 17461, 17466, 17471, 17476, 17481, 17486}, {2090, 2463, 2752, 6229, 2752, 15399, 2471}, {17491, 17508, 17521, 17535, 17548, 17561, 17574, 17588, 17600, 17614, 17628, 17642, 0}, {17491, 17508, 17521, 17535, 17548, 17561, 17574, 17588, 17600, 17614, 17628, 17642, 0}, {34626, 34637, 34644, 34652, 34659, 34666, 34673, 34681, 34687, 34695, 34703, 34711, 0}, {34626, 34637, 34644, 34652, 34659, 34666, 34673, 34681, 34687, 34695, 34703, 34711, 0}, 2, 1, 763, 241, {1973,2647,2903,1301,0,0,0,0,0,0,0,0,0,0},{17334,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+       {1422, 2987, 1937, 1920, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {1566, 1573, 1580, 1587, 1594, 1601, 1608}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, 0, 0, 239, 241, {2987,1320,14,1843,1857,1444,1814,1301,0,0,0,0,0,0},{1422,6639,0,0,0,0,0,0},{1920,1928,1377,274,0,0,0,0,0,0,0,0},{1937,1948,1394,280,0,0,0,0,0}},
+       {2628, 2647, 280, 274, 1982, 55, 2658, 2664, {2671, 2679, 2686, 2695, 2704, 2715, 2723}, {2731, 2734, 2737, 2740, 2743, 2746, 2749}, {2090, 2463, 2752, 2463, 2752, 2469, 2090}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, 2, 1, 763, 241, {2647,1336,2895,2903,1973,1301,0,0,0,0,0,0,0,0},{2628,1960,2910,0,0,0,0,0},{274,1377,2327,2922,0,0,0,0,0,0,0,0},{280,2933,2947,2962,0,0,0,0,0}},
+       {34718, 243, 2996, 3007, 44, 3773, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {243,14,1320,1301,5871,34729,3967,14134,0,0,0,0,0,0},{34718,34737,6429,3744,0,0,0,0},{3007,35,274,1377,0,0,0,0,0,0,0,0},{2996,23,280,1394,0,0,0,0,0}},
+       {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,14083,1320,1327,1301,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
+       {4748, 2647, 280, 274, 1982, 4765, 3781, 3784, {4772, 4781, 4787, 4793, 4802, 4808, 4817}, {4824, 4829, 4834, 4839, 4844, 4849, 4854}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, 2, 1, 763, 241, {2647,1336,33792,2903,1301,0,0,0,0,0,0,0,0,0},{4748,3732,4974,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {3991, 2351, 1394, 1377, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 2601, 241, {2351,1327,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{1377,274,35,0,0,0,0,0,0,0,0,0},{1394,280,23,0,0,0,0,0,0}},
+       {1422, 2987, 1394, 1377, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {33611, 33618, 33625, 33632, 33639, 33646, 33653}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, 0, 0, 239, 241, {2987,1320,14,1843,1857,1444,1814,1301,0,0,0,0,0,0},{1422,34750,34777,2603,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {2628, 2647, 280, 274, 1982, 55, 2658, 2664, {2671, 2679, 2686, 2695, 2704, 2715, 2723}, {2731, 2734, 2737, 2740, 2743, 2746, 2749}, {2090, 2463, 2752, 2463, 2752, 2469, 2090}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2754, 2761, 2769, 2775, 2781, 2785, 2790, 2795, 2802, 2812, 2820, 2829, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, {2838, 2842, 2846, 2851, 2781, 2855, 2859, 2863, 2867, 2871, 2875, 2879, 0}, 2, 1, 763, 241, {2647,1336,2895,33792,2903,1301,0,0,0,0,0,0,0,0},{2628,1960,33802,0,0,0,0,0},{274,1377,8087,8077,2922,8110,8115,8096,8102,0,0,0},{280,1394,8147,8160,2947,2933,2962,0,0}},
+       {2969, 14083, 2996, 3007, 1982, 55, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {14083,1312,14,2895,1301,0,0,0,0,0,0,0,0,0},{2969,3732,0,0,0,0,0,0},{3007,35,274,1377,0,0,0,0,0,0,0,0},{2996,23,280,1394,0,0,0,0,0}},
+       {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 1, 239, 241, {243,14,1320,1327,1301,0,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
+       {4748, 243, 280, 274, 1982, 4765, 3781, 3784, {4772, 4781, 4787, 4793, 4802, 4808, 4817}, {4824, 4829, 4834, 4839, 4844, 4849, 4854}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, 2, 1, 239, 241, {243,14,1336,1327,1301,0,0,0,0,0,0,0,0,0},{4748,4974,3732,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {3991, 2351, 1394, 1377, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 2601, 241, {2351,1327,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{1377,274,35,0,0,0,0,0,0,0,0,0},{1394,280,23,0,0,0,0,0,0}},
+       {5487, 243, 280, 274, 1982, 55, 946, 951, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 2, 1, 239, 241, {243,14,1320,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {4005, 3956, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {3956,3947,1320,14,1327,1301,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
+       {4748, 243, 280, 274, 1982, 4765, 3781, 3784, {4772, 4781, 4787, 4793, 4802, 4808, 4817}, {4824, 4829, 4834, 4839, 4844, 4849, 4854}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4859, 4867, 4876, 4881, 4887, 4891, 4896, 4904, 4910, 4920, 1116, 4928, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, {4938, 4944, 4876, 4951, 4887, 4891, 4956, 4904, 4962, 1286, 1291, 4968, 0}, 2, 1, 239, 241, {243,14,1336,1327,1301,0,0,0,0,0,0,0,0,0},{4748,4974,3732,0,0,0,0,0},{274,1377,4983,4989,4999,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {1960, 1973, 1394, 1377, 1982, 2362, 34793, 34803, {11565, 34811, 8966, 11590, 8981, 8991, 8997}, {9004, 9008, 9012, 11611, 9020, 9025, 9029}, {9033, 9035, 9037, 1049, 9039, 9035, 1049}, {2473, 2480, 34822, 2494, 2500, 2573, 2577, 11631, 34827, 34837, 34845, 34854, 0}, {2473, 2480, 34822, 2494, 2500, 2573, 2577, 11631, 34827, 34837, 34845, 34854, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3991, 2351, 1394, 1377, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 0, 2601, 241, {2351,1327,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{1377,274,35,0,0,0,0,0,0,0,0,0},{1394,280,23,0,0,0,0,0,0}},
+       {5487, 1814, 23, 35, 1982, 55, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {1814,1857,1301,0,0,0,0,0,0,0,0,0,0,0},{5487,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+       {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,3956,1320,1327,1301,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
+       {1960, 1973, 1394, 1377, 44, 2362, 34863, 34881, {34896, 34909, 34928, 34941, 34956, 34973, 11264}, {34984, 34991, 34998, 35005, 35012, 35019, 35026}, {528, 531, 35033, 537, 540, 531, 537}, {35036, 35049, 573, 582, 14827, 14834, 14843, 614, 35064, 35083, 35098, 35115, 0}, {35036, 35049, 573, 582, 14827, 14834, 14843, 614, 35064, 35083, 35098, 35115, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,1377,0,0,0,0,0,0,0,0,0},{23,280,1394,0,0,0,0,0,0}},
+       {3744, 243, 23, 35, 44, 3773, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {243,1301,0,0,0,0,0,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
+       {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,1320,1327,1301,0,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
+       {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,1377,0,0,0,0,0,0,0,0,0},{23,280,1394,0,0,0,0,0,0}},
+       {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,14083,1320,1327,1301,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
+       {1960, 1973, 1394, 1377, 1982, 2362, 34793, 34803, {11565, 34811, 8966, 11590, 8981, 8991, 8997}, {9004, 9008, 9012, 11611, 9020, 9025, 9029}, {9033, 9035, 9037, 1049, 9039, 9035, 1049}, {2473, 2480, 34822, 2494, 2500, 2573, 2577, 11631, 34827, 34837, 34845, 34854, 0}, {2473, 2480, 34822, 2494, 2500, 2573, 2577, 11631, 34827, 34837, 34845, 34854, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {35209, 35233, 35242, 35251, 35262, 35271, 35284, 35293, 35298, 35309, 35331, 35355, 0}, {35209, 35233, 35242, 35251, 35262, 35271, 35284, 35293, 35298, 35309, 35331, 35355, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,1377,0,0,0,0,0,0,0,0,0},{23,280,1394,0,0,0,0,0,0}},
+       {14104, 243, 23, 35, 1982, 55, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {243,1301,0,0,0,0,0,0,0,0,0,0,0,0},{14104,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+       {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,1320,1327,1301,0,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
+       {1960, 1973, 1394, 1377, 1982, 2362, 34863, 34881, {34896, 34909, 34928, 8448, 34956, 34973, 11264}, {34984, 34991, 34998, 35377, 35012, 35019, 35026}, {528, 531, 35033, 537, 540, 531, 537}, {35036, 35049, 573, 582, 14827, 35160, 35167, 614, 35064, 35083, 35098, 35115, 0}, {35036, 35049, 573, 582, 14827, 35160, 35167, 614, 35064, 35083, 35098, 35115, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {35209, 35233, 35242, 35251, 35262, 35271, 35284, 35293, 35298, 35309, 35331, 35355, 0}, {35209, 35233, 35242, 35251, 35262, 35271, 35284, 35293, 35298, 35309, 35331, 35355, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,1377,0,0,0,0,0,0,0,0,0},{23,280,1394,0,0,0,0,0,0}},
+       {14104, 243, 23, 35, 1982, 55, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {243,1301,0,0,0,0,0,0,0,0,0,0,0,0},{14104,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+       {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,1320,1327,1301,0,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,274,1377,0,0,0,0,0,0,0,0},{23,2996,280,1394,0,0,0,0,0}},
+       {1960, 1973, 1394, 1377, 1982, 2362, 34793, 34803, {11565, 34811, 8966, 11590, 8981, 8991, 8997}, {9004, 9008, 9012, 11611, 9020, 9025, 9029}, {9033, 9035, 9037, 1049, 9039, 9035, 1049}, {2473, 2480, 34822, 2494, 2500, 2573, 2577, 11631, 34827, 34837, 34845, 34854, 0}, {2473, 2480, 34822, 2494, 2500, 2573, 2577, 11631, 34827, 34837, 34845, 34854, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {35209, 35233, 35242, 35251, 35262, 35271, 35284, 35293, 35298, 35309, 35331, 35355, 0}, {35209, 35233, 35242, 35251, 35262, 35271, 35284, 35293, 35298, 35309, 35331, 35355, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 1, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,1377,0,0,0,0,0,0,0,0,0},{23,280,1394,0,0,0,0,0,0}},
+       {3744, 3764, 2996, 3007, 44, 3773, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1301,1857,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {4005, 243, 1394, 1377, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 1, 239, 241, {243,14,1320,1327,1301,0,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {1960, 1973, 1394, 1377, 1982, 2362, 34863, 34881, {34896, 34909, 34928, 8448, 34956, 34973, 11264}, {34984, 34991, 34998, 35377, 35012, 35019, 35026}, {528, 531, 35033, 537, 540, 531, 537}, {35036, 35049, 573, 582, 14827, 35160, 35167, 614, 35064, 35083, 35098, 35115, 0}, {35036, 35049, 573, 582, 14827, 35160, 35167, 614, 35064, 35083, 35098, 35115, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,1377,0,0,0,0,0,0,0,0,0},{23,280,1394,0,0,0,0,0,0}},
+       {3744, 3764, 2996, 3007, 44, 3773, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1301,1857,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {4005, 2351, 1394, 1377, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 1, 2601, 241, {2351,1327,14,1320,1301,0,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,1377,0,0,0,0,0,0,0,0,0},{23,280,1394,0,0,0,0,0,0}},
+       {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 1, 239, 241, {243,14,1320,1327,1301,0,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
+       {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,1377,0,0,0,0,0,0,0,0,0},{23,280,1394,0,0,0,0,0,0}},
+       {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,1320,1327,1301,0,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
+       {3991, 243, 23, 35, 44, 55, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, {63, 72, 79, 99, 119, 143, 167, 174, 185, 196, 205, 223, 0}, 0, 6, 239, 241, {243,14,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{35,274,1377,0,0,0,0,0,0,0,0,0},{23,280,1394,0,0,0,0,0,0}},
+       {5487, 2351, 280, 274, 44, 55, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 2601, 241, {2351,1327,2312,2903,1301,0,0,0,0,0,0,0,0,0},{5487,3732,0,0,0,0,0,0},{274,1377,1928,0,0,0,0,0,0,0,0,0},{280,1394,1948,1937,0,0,0,0,0}},
+       {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,1320,1327,1301,0,0,0,0,0,0,0,0,0},{4005,4231,4258,0,0,0,0,0},{35,3007,1377,274,0,0,0,0,0,0,0,0},{23,2996,1394,280,0,0,0,0,0}},
+       {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,32997,1301,0,0,0,0,0,0,0,0,0,0},{4005,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+       {35384, 2987, 2996, 3007, 44, 4765, 3781, 3784, {3787, 3794, 3801, 3809, 3819, 3828, 3835}, {3844, 3848, 3852, 3856, 3860, 3864, 3868}, {2090, 2463, 2465, 3872, 2465, 2469, 2090}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {3874, 3882, 3891, 2775, 3897, 3901, 3906, 2795, 2802, 3911, 2820, 3919, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, {2838, 2842, 3928, 2851, 3897, 2855, 2859, 2863, 2867, 3932, 2875, 3936, 0}, 0, 0, 239, 241, {2987,1320,243,14,1301,0,0,0,0,0,0,0,0,0},{35384,13628,0,0,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,32997,1301,0,0,0,0,0,0,0,0,0,0},{4005,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+       {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,32997,1301,0,0,0,0,0,0,0,0,0,0},{4005,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+       {4005, 243, 23, 35, 4034, 55, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {243,14,32997,1301,0,0,0,0,0,0,0,0,0,0},{4005,0,0,0,0,0,0,0},{35,274,0,0,0,0,0,0,0,0,0,0},{23,280,0,0,0,0,0,0,0}},
+       {3744, 3764, 2996, 3007, 4034, 7676, 946, 951, {4049, 4057, 4063, 4070, 4081, 4088, 4096}, {4104, 4108, 2565, 4112, 4117, 4121, 4125}, {2752, 2471, 2463, 2463, 4132, 4134, 2090}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4136, 4142, 4150, 1070, 4156, 4161, 4167, 4173, 4180, 1108, 4191, 4201, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, {4211, 2561, 2565, 4215, 4156, 2573, 2577, 4219, 2585, 4223, 2593, 4227, 0}, 0, 0, 239, 241, {3764,3940,3947,3956,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}},
+       {1960, 1973, 1394, 1377, 1982, 2362, 34863, 34881, {34896, 34909, 34928, 8448, 34956, 34973, 11264}, {34984, 34991, 34998, 35377, 35012, 35019, 35026}, {528, 531, 35033, 537, 540, 531, 537}, {35036, 35049, 573, 582, 14827, 35160, 35167, 614, 35064, 35083, 35098, 35115, 0}, {35036, 35049, 573, 582, 14827, 35160, 35167, 614, 35064, 35083, 35098, 35115, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {1960, 1973, 1394, 1377, 1982, 2362, 34793, 34803, {11565, 34811, 8966, 11590, 8981, 8991, 8997}, {9004, 9008, 9012, 11611, 9020, 9025, 9029}, {9033, 9035, 9037, 1049, 9039, 9035, 1049}, {2473, 2480, 34822, 2494, 2500, 2573, 2577, 11631, 34827, 34837, 34845, 34854, 0}, {2473, 2480, 34822, 2494, 2500, 2573, 2577, 11631, 34827, 34837, 34845, 34854, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3732, 2647, 1394, 1377, 1982, 4765, 0, 0, {33985, 33996, 34020, 34050, 34067, 34089, 34098}, {14270, 14273, 14278, 14284, 14288, 7414, 14293}, {6567, 6555, 6557, 6559, 6561, 6563, 6565}, {34109, 34122, 573, 34135, 593, 34146, 34155, 614, 34164, 34181, 34196, 34209, 0}, {34109, 34122, 573, 34135, 593, 34146, 34155, 614, 34164, 34181, 34196, 34209, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, 0, 1, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{3732,5487,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {1422, 1444, 1394, 1377, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {1566, 1573, 1580, 1587, 1594, 1601, 1608}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, {1643, 1650, 1657, 1664, 1671, 1678, 1685, 1692, 1699, 1706, 1713, 1723, 0}, 0, 0, 239, 241, {1444,1796,1805,1301,1814,1825,1836,1843,1850,1857,0,0,0,0},{1422,1866,1893,0,0,0,0,0},{1377,274,1920,1928,0,0,0,0,0,0,0,0},{1394,280,1937,1948,0,0,0,0,0}},
+       {1960, 2647, 280, 274, 1982, 2362, 2370, 2375, {2380, 9835, 33822, 2403, 2410, 2418, 33829}, {2433, 9863, 33837, 2446, 2450, 2454, 6004}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, 2, 1, 763, 241, {2647,1336,2903,1301,2883,0,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,7296,4983,0,0,0,0,0,0,0,0},{280,1394,7307,6438,0,0,0,0,0}},
+       {1960, 1973, 1394, 1377, 1982, 2362, 34793, 34803, {8945, 8954, 8966, 8973, 8981, 8991, 8997}, {9004, 9008, 9012, 9016, 9020, 9025, 9029}, {0, 0, 0, 0, 0, 0, 0}, {2473, 2480, 34822, 2494, 2500, 2504, 2509, 11631, 34827, 34837, 34845, 34854, 0}, {2473, 2480, 34822, 2494, 2500, 2504, 2509, 11631, 34827, 34837, 34845, 34854, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, {2557, 2561, 2565, 2569, 2500, 2573, 2577, 11638, 2585, 2589, 2593, 2597, 0}, 0, 0, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3732, 2647, 1394, 1377, 1982, 4765, 0, 0, {14181, 14187, 14201, 14224, 14238, 14254, 14261}, {14270, 14273, 14278, 14284, 14288, 7414, 14293}, {6567, 6555, 6557, 6559, 6561, 6563, 6565}, {14297, 14304, 10132, 14311, 3897, 14317, 14323, 14329, 14336, 14345, 14353, 14360, 0}, {14297, 14304, 10132, 14311, 3897, 14317, 14323, 14329, 14336, 14345, 14353, 14360, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, {14367, 7853, 2565, 2569, 14371, 14375, 14379, 14383, 14387, 2589, 14391, 14395, 0}, 0, 1, 763, 241, {2647,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{3732,5487,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {34222, 2647, 280, 274, 1982, 18725, 0, 0, {18732, 18747, 18762, 18777, 18794, 18811, 18820}, {18831, 18838, 18845, 18852, 18859, 18866, 18873}, {18880, 18883, 8545, 8548, 8542, 18886, 18889}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, 0, 1, 763, 241, {2647,1336,18714,2903,14,1301,0,0,0,0,0,0,0,0},{34222,3732,5487,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {24812, 24833, 1394, 1377, 24842, 4765, 0, 0, {24859, 24866, 24877, 24890, 24903, 24914, 24927}, {24938, 24943, 24948, 24953, 24958, 24963, 24968}, {0, 0, 0, 0, 0, 0, 0}, {24973, 24988, 24997, 25004, 25017, 25024, 25035, 25044, 25053, 25060, 25071, 25082, 0}, {24973, 24988, 24997, 25004, 25017, 25024, 25035, 25044, 25053, 25060, 25071, 25082, 0}, {25093, 25100, 25107, 25114, 25121, 25128, 25135, 25142, 25149, 25156, 25163, 25170, 0}, {25093, 25100, 25107, 25114, 25121, 25128, 25135, 25142, 25149, 25156, 25163, 25170, 0}, 0, 0, 763, 241, {24833,1301,0,0,0,0,0,0,0,0,0,0,0,0},{24812,0,0,0,0,0,0,0},{1377,0,0,0,0,0,0,0,0,0,0,0},{1394,0,0,0,0,0,0,0,0}},
+       {1422, 2987, 1394, 1377, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {33611, 33618, 33625, 33632, 33639, 33646, 33653}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, 0, 0, 239, 241, {2987,1320,14,1843,1857,1444,1814,1301,0,0,0,0,0,0},{1422,6639,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {1422, 2987, 1394, 1377, 1453, 1469, 1482, 1489, {1496, 1506, 1516, 1526, 1536, 1546, 1556}, {33611, 33618, 33625, 33632, 33639, 33646, 33653}, {1615, 1619, 1623, 1627, 1631, 1635, 1639}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, {1733, 1738, 1743, 1748, 1753, 1758, 1763, 1768, 1773, 1778, 1784, 1790, 0}, 0, 0, 239, 241, {2987,1320,14,1843,1857,1444,1814,1301,0,0,0,0,0,0},{1422,6639,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {1960, 2647, 280, 274, 1982, 2362, 946, 951, {2380, 2388, 2395, 2403, 2410, 2418, 2425}, {7266, 7271, 7275, 7279, 7283, 7287, 7291}, {2090, 2463, 2465, 2467, 2465, 2469, 2471}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2473, 2480, 4876, 2494, 4887, 2504, 2509, 2514, 2521, 2531, 2539, 6076, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, {2557, 2561, 2565, 2569, 4887, 2573, 2577, 2581, 2585, 2589, 2593, 6106, 0}, 2, 1, 763, 241, {2647,1336,2903,1301,2883,0,0,0,0,0,0,0,0,0},{1960,2614,0,0,0,0,0,0},{274,1377,7296,4983,0,0,0,0,0,0,0,0},{280,1394,7307,6438,0,0,0,0,0}},
+       {1960, 1973, 1394, 1377, 1982, 2362, 34863, 34881, {34896, 34909, 34928, 8448, 34956, 34973, 11264}, {34984, 34991, 34998, 35377, 35012, 35019, 35026}, {528, 531, 35033, 537, 540, 531, 537}, {35036, 35049, 573, 582, 14827, 35160, 35167, 614, 35064, 35083, 35098, 35115, 0}, {35036, 35049, 573, 582, 14827, 35160, 35167, 614, 35064, 35083, 35098, 35115, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, {35132, 35139, 35146, 35153, 14827, 35160, 35167, 35174, 35181, 35188, 35195, 35202, 0}, 0, 1, 763, 241, {1973,2903,9350,2647,9549,1336,11642,1301,0,0,0,0,0,0},{1960,2614,2628,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3732, 1336, 1394, 1377, 1982, 3773, 12592, 12604, {12616, 12631, 12646, 12661, 12678, 12697, 12708}, {12719, 12726, 12733, 12740, 12747, 12754, 12761}, {0, 0, 0, 0, 0, 0, 0}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12768, 12779, 8579, 12792, 8601, 12803, 12810, 8626, 12817, 12832, 12845, 12856, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, {12869, 12876, 12883, 12890, 8601, 12803, 12810, 12897, 12904, 12911, 12918, 12925, 0}, 0, 1, 763, 241, {1336,1301,0,0,0,0,0,0,0,0,0,0,0,0},{3732,0,0,0,0,0,0,0},{1377,274,0,0,0,0,0,0,0,0,0,0},{1394,0,0,0,0,0,0,0,0}},
+       {18696, 18714, 280, 274, 1982, 18725, 0, 0, {33660, 33670, 33679, 33688, 33699, 33709, 33714}, {33721, 33727, 33732, 33737, 33742, 10109, 33746}, {33751, 2752, 2090, 7414, 2085, 7414, 2090}, {14297, 14304, 10132, 14311, 3897, 33753, 33758, 33763, 14336, 14345, 14353, 14360, 0}, {14297, 14304, 10132, 14311, 3897, 33753, 33758, 33763, 14336, 14345, 14353, 14360, 0}, {33770, 33775, 3928, 2851, 3897, 33753, 33758, 33779, 10487, 2871, 33783, 33788, 0}, {33770, 33775, 3928, 2851, 3897, 33753, 33758, 33779, 10487, 2871, 33783, 33788, 0}, 0, 1, 239, 241, {18714,1336,2903,14,1301,0,0,0,0,0,0,0,0,0},{18696,3732,5487,0,0,0,0,0},{274,1377,0,0,0,0,0,0,0,0,0,0},{280,1394,0,0,0,0,0,0,0}},
+       {34243, 1444, 1394, 1377, 34319, 34351, 0, 0, {24859, 24866, 24877, 24890, 24903, 24914, 24927}, {24938, 24943, 24948, 24953, 24958, 24963, 24968}, {0, 0, 0, 0, 0, 0, 0}, {24973, 24988, 24997, 25004, 25017, 25024, 25035, 25044, 25053, 25060, 25071, 25082, 0}, {24973, 24988, 24997, 25004, 25017, 25024, 25035, 25044, 25053, 25060, 25071, 25082, 0}, {25093, 25100, 25107, 25114, 25121, 25128, 25135, 25142, 25149, 25156, 25163, 25170, 0}, {25093, 25100, 25107, 25114, 25121, 25128, 25135, 25142, 25149, 25156, 25163, 25170, 0}, 0, 0, 239, 241, {1444,1796,1805,1825,1301,1814,1836,1843,1850,1857,0,0,0,0},{34243,34386,0,0,0,0,0,0},{1377,0,0,0,0,0,0,0,0,0,0,0},{1394,0,0,0,0,0,0,0,0}},
+       {3991, 2351, 1394, 1377, 44, 55, 29235, 29245, {29258, 29265, 29271, 29278, 29284, 29290, 29298}, {29308, 29312, 29316, 29320, 29324, 29328, 29332}, {12319, 12319, 12319, 12319, 12319, 12319, 12319}, {29338, 29347, 29356, 29361, 29367, 29373, 29379, 29386, 29392, 29401, 29410, 29418, 0}, {29338, 29347, 29356, 29361, 29367, 29373, 29379, 29386, 29392, 29401, 29410, 29418, 0}, {29427, 29431, 3928, 29435, 3897, 29439, 29443, 29447, 29452, 29456, 29462, 29466, 0}, {29427, 29431, 3928, 29435, 3897, 29439, 29443, 29447, 29452, 29456, 29462, 29466, 0}, 0, 0, 2601, 241, {2351,1327,1301,0,0,0,0,0,0,0,0,0,0,0},{3991,254,0,0,0,0,0,0},{1377,274,29470,0,0,0,0,0,0,0,0,0},{1394,280,0,0,0,0,0,0,0}},
+       {3744, 2987, 2996, 3007, 44, 3773, 0, 0, {30345, 30352, 30360, 30367, 30374, 30382, 30390}, {30397, 30400, 30403, 30406, 30409, 30412, 30415}, {2471, 2471, 2465, 2471, 12319, 4132, 12319}, {30418, 30426, 30436, 30442, 30450, 30455, 30460, 30465, 30472, 18677, 30480, 30488, 0}, {30418, 30426, 30436, 30442, 30450, 30455, 30460, 30465, 30472, 18677, 30480, 30488, 0}, {2838, 30496, 3928, 30500, 3897, 29439, 29443, 30504, 3868, 2871, 30508, 15347, 0}, {2838, 30496, 3928, 30500, 3897, 29439, 29443, 30504, 3868, 2871, 30508, 15347, 0}, 0, 0, 239, 241, {2987,1320,14,243,1857,1301,3967,0,0,0,0,0,0,0},{3744,3977,254,3991,0,0,0,0},{3007,35,1377,274,0,0,0,0,0,0,0,0},{2996,23,1394,280,0,0,0,0,0}}
 };
 
 
 static const NumberFormatEntry number_format_entries [] = {
-       {35395, 35398, 35395, 35398, 35395, 35398, 35401, 35411, 35414, 35428, 35431, 35441, 2624, 35450, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35457, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35477, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35477, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35481, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35485, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35473, 35463, 35490, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35499, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35503, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35485, 35463, 35506, 35469, 35511, 35441, 35523, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 0, 35469, 35431, 35441, 2624, 35450, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35477, 35463, 35527, 35469, 35431, 35441, 2624, 35450, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35543, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 0, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35547, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35551, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35554, 790, 35554, 790, 35554, 0, 35463, 35465, 35469, 35511, 35441, 35523, 35450, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 0, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35558, 35463, 35566, 35469, 35431, 35441, 2624, 35450, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35582, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 2, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35473, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35585, 35463, 0, 35469, 35431, 35441, 2624, 35450, 5, 1, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35485, 35463, 35589, 35469, 35511, 35441, 35523, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35596, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35600, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35603, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 3, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35608, 35463, 0, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35611, 35463, 35615, 35469, 35431, 35441, 2624, 35450, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 0, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35631, 35463, 35634, 35469, 35511, 35441, 35523, 35450, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35648, 35463, 35589, 35469, 35511, 35441, 35523, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 0, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 35651, 35411, 0, 35428, 35431, 35441, 2624, 35450, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35655, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35659, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 0, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 0, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 10506, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 10506, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 10506, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 10506, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 0, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35485, 35463, 35589, 35469, 35511, 35441, 35523, 35450, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35665, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {790, 35452, 790, 35452, 790, 35452, 35473, 35463, 0, 35469, 35431, 35441, 2624, 35450, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35473, 35463, 35589, 35469, 35511, 35441, 35523, 35450, 12, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35473, 35463, 0, 35469, 35431, 35441, 2624, 35450, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35669, 35463, 0, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 0, 35463, 0, 35469, 35431, 35441, 2624, 35450, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35672, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35679, 35463, 0, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 0, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35683, 35463, 35690, 35469, 35431, 35441, 2624, 35450, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 0, 35463, 0, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35665, 35463, 35716, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {790, 35452, 790, 35452, 790, 35452, 35665, 35463, 0, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {790, 35452, 790, 35452, 790, 35452, 35665, 35463, 35748, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35665, 35463, 0, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35665, 35463, 35774, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {790, 35452, 790, 35452, 790, 35452, 35665, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35665, 35463, 0, 35469, 35431, 35441, 2624, 35450, 12, 1, 1, 1, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35665, 35463, 35805, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 0, 35463, 0, 35469, 35431, 35441, 2624, 35450, 5, 1, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35815, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35820, 35463, 0, 35469, 35431, 35441, 2624, 35450, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35823, 35463, 0, 35469, 35431, 35441, 2624, 35450, 5, 1, 1, 1, 2, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35827, 35463, 0, 35469, 35431, 35441, 2624, 35450, 4, 1, 0, 0, 0, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35665, 35463, 0, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35831, 35463, 0, 35469, 35431, 35441, 2624, 35450, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35839, 35463, 0, 35469, 35431, 35441, 2624, 35450, 1, 0, 1, 1, 1, 2, 1, 1, {3, 0}, {3, 0}, {3, 0}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 0, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35846, 35463, 0, 35469, 35431, 35441, 2624, 35450, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 35859, 35411, 0, 35469, 35431, 35441, 2624, 35450, 3, 0, 4, 2, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35862, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 0, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35866, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 10506, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35485, 35463, 35589, 35469, 35511, 35441, 35523, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35866, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35815, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35473, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35473, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35554, 790, 35554, 790, 35554, 0, 35463, 35465, 35469, 35511, 35441, 35523, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 0, 35463, 0, 35469, 35431, 35441, 2624, 35450, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35870, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35820, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 35401, 35411, 35414, 35428, 35431, 35441, 2624, 35450, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35457, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35873, 35463, 35877, 35469, 35431, 35441, 2624, 35450, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35481, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35485, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35473, 35463, 35490, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35499, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35503, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35485, 35463, 35506, 35469, 35511, 35441, 35523, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 0, 35469, 35431, 35441, 2624, 35450, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35477, 35463, 35527, 35469, 35431, 35441, 2624, 35450, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35543, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35485, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35547, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35551, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35554, 790, 35554, 790, 35554, 0, 35463, 35465, 35469, 35511, 35441, 35523, 35450, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 0, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35558, 35463, 35566, 35469, 35431, 35441, 2624, 35450, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35582, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 2, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35473, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35585, 35463, 0, 35469, 35431, 35441, 2624, 35450, 5, 1, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35485, 35463, 35589, 35469, 35511, 35441, 35523, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35596, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35600, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35603, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 3, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35608, 35463, 0, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35611, 35463, 35615, 35469, 35431, 35441, 2624, 35450, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 0, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35631, 35463, 35634, 35469, 35511, 35441, 35523, 35450, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35648, 35463, 35589, 35469, 35511, 35441, 35523, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35672, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 35651, 35411, 0, 35428, 35431, 35441, 2624, 35450, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35655, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35659, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35887, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 0, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 10506, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 10506, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 10506, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 10506, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 0, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35485, 35463, 35589, 35469, 35511, 35441, 35523, 35450, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35665, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {790, 35452, 790, 35452, 790, 35452, 35473, 35463, 0, 35469, 35431, 35441, 2624, 35450, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 0, 35463, 35589, 35469, 35511, 35441, 35523, 35450, 12, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35669, 35463, 0, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35672, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35679, 35463, 0, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35892, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35665, 35463, 35690, 35469, 35431, 35441, 2624, 35450, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35665, 35463, 35716, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {790, 35452, 790, 35452, 790, 35452, 35665, 35463, 0, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {790, 35452, 790, 35452, 790, 35452, 35665, 35463, 35748, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35665, 35463, 0, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35665, 35463, 35774, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {790, 35452, 790, 35452, 790, 35452, 35665, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35665, 35463, 0, 35469, 35431, 35441, 2624, 35450, 12, 1, 1, 1, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35665, 35463, 35805, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {790, 35452, 790, 35452, 790, 35452, 35815, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35820, 35463, 0, 35469, 35431, 35441, 2624, 35450, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35823, 35463, 0, 35469, 35431, 35441, 2624, 35450, 5, 1, 1, 1, 2, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35827, 35463, 0, 35469, 35431, 35441, 2624, 35450, 4, 1, 0, 0, 0, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35665, 35463, 0, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35831, 35463, 0, 35469, 35431, 35441, 2624, 35450, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35839, 35463, 0, 35469, 35431, 35441, 2624, 35450, 1, 0, 1, 1, 1, 2, 1, 1, {3, 0}, {3, 0}, {3, 0}},
-       {790, 35452, 790, 35452, 790, 35452, 35846, 35463, 0, 35469, 35431, 35441, 2624, 35450, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 35859, 35411, 0, 35469, 35431, 35441, 2624, 35450, 3, 0, 4, 2, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35862, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35866, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35866, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 10506, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35485, 35463, 35589, 35469, 35511, 35441, 35523, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35866, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35815, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35473, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35473, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 0, 35463, 0, 35469, 35431, 35441, 2624, 35450, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35870, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35820, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 35898, 35411, 35414, 35428, 35431, 35441, 2624, 35450, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35477, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35908, 790, 35908, 790, 35908, 0, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35820, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35908, 790, 35908, 790, 35908, 0, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35485, 35463, 35465, 35469, 35511, 35441, 35523, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35473, 35463, 35589, 35469, 35511, 35441, 35523, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35910, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35473, 35463, 0, 35469, 35431, 35441, 2624, 35450, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35488, 35463, 0, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35918, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35925, 35463, 35690, 35469, 35431, 35441, 2624, 35450, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35815, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 35929, 35411, 35414, 35428, 35431, 35441, 2624, 35450, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35488, 35463, 35877, 35469, 35431, 35441, 2624, 35450, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 15, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35473, 35463, 35589, 35469, 35511, 35441, 35523, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 35939, 35411, 35414, 35428, 35431, 35441, 2624, 35450, 3, 0, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 0, 35463, 0, 35469, 35431, 35441, 2624, 35450, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 7769, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35908, 790, 35908, 790, 35908, 0, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 35949, 35411, 35414, 35428, 35431, 35441, 2624, 35450, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 0, 35463, 35877, 35469, 35431, 35441, 2624, 35450, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35908, 790, 35908, 790, 35908, 0, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35959, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 35963, 35411, 35414, 35428, 35431, 35441, 2624, 35450, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35973, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35977, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 35980, 35411, 35414, 35428, 35431, 35441, 2624, 35450, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 10506, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35990, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 35996, 35411, 35414, 35428, 35431, 35441, 2624, 35450, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 36006, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 36012, 35411, 35414, 35428, 35431, 35441, 2624, 35450, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 36022, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 36027, 35411, 35414, 35428, 35431, 35441, 2624, 35450, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 36037, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 36041, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 36049, 35411, 35414, 35428, 35431, 35441, 2624, 35450, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 36059, 35411, 35414, 35428, 35431, 35441, 2624, 35450, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35473, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 36069, 35411, 35414, 35428, 35431, 35441, 2624, 35450, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35862, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 36079, 35411, 35414, 35428, 35431, 35441, 2624, 35450, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 36089, 35411, 35414, 35428, 35431, 35441, 2624, 35450, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 36099, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35395, 35398, 35395, 35398, 35395, 35398, 36103, 35411, 35414, 35428, 35431, 35441, 2624, 35450, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35665, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
-       {35452, 790, 35452, 790, 35452, 790, 36113, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 36116, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 2494, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 36120, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35488, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
-       {35452, 790, 35452, 790, 35452, 790, 36123, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 36131, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35910, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 36136, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35485, 35463, 35465, 35469, 35511, 35441, 35523, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 0, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 35887, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35918, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 0, 35463, 0, 35469, 35431, 35441, 2624, 35450, 5, 1, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 36139, 35463, 35877, 35469, 35431, 35441, 2624, 35450, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 36139, 35463, 35877, 35469, 35431, 35441, 2624, 35450, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35485, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 790, 35452, 790, 35452, 790, 36131, 35463, 35465, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35452, 35452, 35452, 35452, 35452, 35672, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35892, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 35815, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
-       {35452, 35454, 35452, 35454, 35452, 35454, 0, 35463, 0, 35469, 35431, 35441, 2624, 35450, 8, 3, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
-       {790, 35452, 790, 35452, 790, 35452, 35866, 35463, 0, 35469, 35431, 35441, 2624, 35450, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}
+       {35403, 35406, 35403, 35406, 35403, 35406, 35409, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35465, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35485, 35494, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35502, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35502, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35506, 35471, 35473, 35477, 35510, 35522, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35534, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35537, 35548, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35559, 35573, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35607, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35473, 35477, 35616, 35624, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35632, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35636, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35534, 35471, 35639, 35477, 35644, 35449, 35656, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 0, 35477, 35588, 35660, 2601, 35458, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35502, 35471, 35670, 35477, 35439, 35449, 2601, 35458, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35686, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35690, 35700, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35709, 35471, 35473, 35477, 35713, 35732, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35751, 35471, 35473, 35477, 35588, 35660, 2601, 35458, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35754, 763, 35754, 763, 35754, 0, 35471, 35473, 35477, 35758, 35769, 35656, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 0, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35778, 35471, 35786, 35477, 35802, 35830, 2601, 35458, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35857, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 2, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 0, 35477, 35510, 35522, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35860, 35471, 0, 35477, 35439, 35449, 2601, 35458, 5, 1, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35534, 35471, 35864, 35477, 35644, 35449, 35656, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35871, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35875, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35878, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 3, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35883, 35471, 0, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35886, 35471, 35890, 35477, 35439, 35449, 2601, 35458, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35906, 35920, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35933, 35471, 35936, 35477, 35950, 35964, 35656, 35458, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35975, 35471, 35864, 35477, 35978, 35991, 35656, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36001, 35419, 0, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36005, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36009, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 0, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 36015, 36025, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 0, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35534, 35471, 35864, 35477, 35644, 35449, 35656, 35458, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36034, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {763, 35460, 763, 35460, 763, 35460, 35481, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35864, 35477, 35644, 35449, 35656, 35458, 12, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35481, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36038, 35471, 0, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 36041, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36048, 35471, 0, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36052, 35471, 36059, 35477, 35439, 35449, 2601, 35458, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36034, 35471, 36085, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {763, 35460, 763, 35460, 763, 35460, 36034, 35471, 0, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {763, 35460, 763, 35460, 763, 35460, 36034, 35471, 36117, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36034, 35471, 0, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36034, 35471, 36143, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {763, 35460, 763, 35460, 763, 35460, 36034, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36034, 35471, 0, 35477, 35439, 35449, 2601, 35458, 12, 1, 1, 1, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36034, 35471, 36174, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 5, 1, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36184, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36189, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36192, 35471, 0, 35477, 35439, 35449, 2601, 35458, 5, 1, 1, 1, 2, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36196, 35471, 0, 35477, 35439, 35449, 2601, 35458, 4, 1, 0, 0, 0, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36034, 35471, 0, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36200, 35471, 0, 35477, 35439, 35449, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36208, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 1, 1, 1, 2, 1, 1, {3, 0}, {3, 0}, {3, 0}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 0, 35477, 35616, 35624, 2601, 35458, 8, 3, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36215, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36228, 35419, 0, 35477, 35439, 35449, 2601, 35458, 3, 0, 4, 2, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36231, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36235, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35534, 35471, 35864, 35477, 35644, 35449, 35656, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36235, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36184, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 35481, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35754, 763, 35754, 763, 35754, 0, 35471, 35473, 35477, 35644, 35449, 35656, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36239, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36189, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 35409, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35465, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35485, 35494, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36242, 35471, 36246, 35477, 35439, 35449, 2601, 35458, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35506, 35471, 35473, 35477, 35510, 35522, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35534, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35537, 35548, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35559, 35573, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35607, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35473, 35477, 35616, 35624, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35632, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35636, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35534, 35471, 35639, 35477, 35644, 35449, 35656, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 0, 35477, 35588, 35660, 2601, 35458, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35502, 35471, 35670, 35477, 35439, 35449, 2601, 35458, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35686, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35690, 35700, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35534, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35709, 35471, 35473, 35477, 35713, 35732, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35751, 35471, 35473, 35477, 35588, 35660, 2601, 35458, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35754, 763, 35754, 763, 35754, 0, 35471, 35473, 35477, 35758, 35769, 35656, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 0, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35778, 35471, 35786, 35477, 35802, 35830, 2601, 35458, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35857, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 2, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 0, 35477, 35510, 35522, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35860, 35471, 0, 35477, 35439, 35449, 2601, 35458, 5, 1, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35534, 35471, 35864, 35477, 35644, 35449, 35656, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35871, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35875, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35878, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 3, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35883, 35471, 0, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35886, 35471, 35890, 35477, 35439, 35449, 2601, 35458, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35906, 35920, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35933, 35471, 35936, 35477, 35950, 35964, 35656, 35458, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35975, 35471, 35864, 35477, 35978, 35991, 35656, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36041, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36001, 35419, 0, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36005, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36009, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36256, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 36015, 36025, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 0, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35534, 35471, 35864, 35477, 35644, 35449, 35656, 35458, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36034, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {763, 35460, 763, 35460, 763, 35460, 35481, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 35864, 35477, 35644, 35449, 35656, 35458, 12, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36038, 35471, 0, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 36041, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36048, 35471, 0, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 36261, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36034, 35471, 36059, 35477, 35439, 35449, 2601, 35458, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36034, 35471, 36085, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {763, 35460, 763, 35460, 763, 35460, 36034, 35471, 0, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {763, 35460, 763, 35460, 763, 35460, 36034, 35471, 36117, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36034, 35471, 0, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36034, 35471, 36143, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {763, 35460, 763, 35460, 763, 35460, 36034, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36034, 35471, 0, 35477, 35439, 35449, 2601, 35458, 12, 1, 1, 1, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36034, 35471, 36174, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {763, 35460, 763, 35460, 763, 35460, 36184, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36189, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36192, 35471, 0, 35477, 35439, 35449, 2601, 35458, 5, 1, 1, 1, 2, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36196, 35471, 0, 35477, 35439, 35449, 2601, 35458, 4, 1, 0, 0, 0, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36034, 35471, 0, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36200, 35471, 0, 35477, 35439, 35449, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36208, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 1, 1, 1, 2, 1, 1, {3, 0}, {3, 0}, {3, 0}},
+       {763, 35460, 763, 35460, 763, 35460, 36215, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 2}, {3, 2}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36228, 35419, 0, 35477, 35439, 35449, 2601, 35458, 3, 0, 4, 2, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36231, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36235, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36235, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 2, 2, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35534, 35471, 35864, 35477, 35644, 35449, 35656, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36235, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36184, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 35481, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36239, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36189, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36267, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35502, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 36277, 763, 36277, 763, 36277, 0, 35471, 35473, 35477, 35537, 35548, 2601, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36189, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35616, 35624, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 36277, 763, 36277, 763, 36277, 0, 35471, 0, 35477, 35588, 35660, 2601, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35690, 35700, 2601, 35458, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35534, 35471, 35473, 35477, 35644, 35449, 35656, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35473, 35477, 35588, 35660, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35864, 35477, 35644, 35449, 35656, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36279, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35481, 35471, 0, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35586, 35471, 0, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 36287, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36294, 35471, 36059, 35477, 35439, 35449, 2601, 35458, 12, 2, 2, 2, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 36184, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36298, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 36246, 35477, 35439, 35449, 2601, 35458, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35537, 35548, 2601, 35458, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35586, 35471, 35473, 35477, 35616, 35624, 2601, 35458, 15, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35864, 35477, 35644, 35449, 35656, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36308, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 0, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35537, 35548, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 7774, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 36277, 763, 36277, 763, 36277, 0, 35471, 35473, 35477, 35616, 35624, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36318, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 0, 35471, 36246, 35477, 35439, 35449, 2601, 35458, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 36277, 763, 36277, 763, 36277, 0, 35471, 35473, 35477, 35537, 35548, 2601, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36328, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35616, 35624, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36332, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35481, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36342, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35481, 35471, 35473, 35477, 35616, 35624, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36346, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36349, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 10511, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36359, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36365, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 1, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36375, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36381, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35586, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36391, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36396, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36406, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36410, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36418, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35586, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36428, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35586, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35481, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36438, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36231, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35586, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36448, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 35586, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36458, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36468, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35403, 35406, 35403, 35406, 35403, 35406, 36472, 35419, 35422, 35436, 35439, 35449, 2601, 35458, 3, 2, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36034, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, 2}, {3, 2}, {3, 2}},
+       {35460, 763, 35460, 763, 35460, 763, 36482, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36485, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 2471, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36489, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 14, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 35586, 35471, 35473, 35477, 35588, 35598, 2601, 35458, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1}, {3, 0}, {3, 0}},
+       {35460, 763, 35460, 763, 35460, 763, 36492, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36500, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36279, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36505, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35534, 35471, 35473, 35477, 35644, 35449, 35656, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36256, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 36287, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 0, 35477, 35439, 35449, 2601, 35458, 5, 1, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36508, 35471, 36246, 35477, 35439, 35449, 2601, 35458, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36508, 35471, 36246, 35477, 35439, 35449, 2601, 35458, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 35534, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 12, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 763, 35460, 763, 35460, 763, 36500, 35471, 35473, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35460, 35460, 35460, 35460, 35460, 36041, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 36261, 35471, 0, 35477, 35439, 35449, 2601, 35458, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 36184, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 0, 1, 1, 1, 2, 2, 2, {3, 0}, {3, 0}, {3, 0}},
+       {35460, 35462, 35460, 35462, 35460, 35462, 0, 35471, 0, 35477, 35616, 35624, 2601, 35458, 8, 3, 0, 0, 3, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}},
+       {763, 35460, 763, 35460, 763, 35460, 36235, 35471, 0, 35477, 35439, 35449, 2601, 35458, 2, 2, 0, 0, 1, 2, 2, 2, {3, -1}, {3, -1}, {3, -1}}
 };
 
 
 static const CultureInfoEntry culture_entries [] = {
-       {0x0001, 0x007F, 768, -1, 36143, 36146, 36153, 36168, 36172, 36143, 0, {0, 0, 36176, 0}, 0, 0, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x0002, 0x007F, 257, -1, 36204, 36207, 36217, 36236, 36240, 36204, 0, {36244, 0, 0, 0}, 1, 1, { 1251, 21025, 10007, 866, 0, ';' }},
-       {0x0003, 0x007F, 257, -1, 36286, 36289, 36297, 36305, 36309, 36286, 0, {36313, 0, 0, 0}, 2, 2, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x0004, 0x7804, 257, -1, 36333, 36341, 36362, 36369, 36373, 36377, 0, {36380, 0, 0, 0}, 3, 3, { 936, 500, 10008, 936, 0, ',' }},
-       {0x0004, 0x0004, 257, -1, 36387, 36394, 36362, 36369, 36373, 36377, 0, {36380, 0, 0, 0}, 4, 4, { 936, 500, 10008, 936, 0, ',' }},
-       {0x0005, 0x007F, 257, -1, 36422, 36425, 36431, 36441, 36445, 36422, 0, {36449, 0, 0, 0}, 5, 5, { 1250, 500, 10029, 852, 0, ';' }},
-       {0x0006, 0x007F, 257, -1, 36475, 36478, 36485, 36491, 36495, 36475, 0, {36499, 0, 0, 0}, 6, 6, { 1252, 20277, 10000, 850, 0, ';' }},
-       {0x0007, 0x007F, 257, -1, 36520, 36523, 36530, 36538, 36542, 36520, 0, {36546, 0, 0, 0}, 7, 7, { 1252, 20273, 10000, 850, 0, ';' }},
-       {0x0008, 0x007F, 257, -1, 36571, 36574, 36580, 36597, 36601, 36571, 0, {36605, 0, 0, 0}, 8, 8, { 1253, 20273, 10006, 737, 0, ';' }},
-       {0x0009, 0x007F, 257, -1, 36647, 36650, 36650, 36658, 36662, 36647, 0, {36666, 0, 0, 0}, 9, 9, { 1252, 37, 10000, 437, 0, ',' }},
-       {0x000A, 0x007F, 257, -1, 36685, 36688, 36696, 36705, 36709, 36685, 0, {36713, 0, 0, 0}, 10, 10, { 1252, 20284, 10000, 850, 0, ';' }},
-       {0x000B, 0x007F, 257, -1, 36735, 36738, 36746, 36752, 36756, 36735, 0, {36760, 0, 0, 0}, 11, 11, { 1252, 20278, 10000, 850, 0, ';' }},
-       {0x000C, 0x007F, 257, -1, 36785, 36788, 36795, 36805, 36809, 36785, 0, {36813, 0, 0, 0}, 12, 12, { 1252, 20297, 10000, 850, 0, ';' }},
-       {0x000D, 0x007F, 257, -1, 36835, 36838, 36845, 36856, 36860, 36835, 0, {36864, 0, 0, 0}, 13, 13, { 1255, 500, 10005, 862, 1, ',' }},
-       {0x000E, 0x007F, 257, -1, 36897, 36900, 36910, 36917, 36921, 36897, 0, {36925, 0, 0, 0}, 14, 14, { 1250, 500, 10029, 852, 0, ';' }},
-       {0x000F, 0x007F, 257, -1, 36941, 36944, 36954, 36964, 36968, 36941, 0, {36972, 0, 0, 0}, 15, 15, { 1252, 20871, 10079, 850, 0, ';' }},
-       {0x0010, 0x007F, 257, -1, 36992, 36995, 37003, 37012, 37016, 36992, 0, {36713, 0, 0, 0}, 16, 16, { 1252, 20280, 10000, 850, 0, ';' }},
-       {0x0011, 0x007F, 257, -1, 37020, 37023, 37032, 37042, 37046, 37020, 0, {37050, 0, 0, 0}, 17, 17, { 932, 20290, 10001, 932, 0, ',' }},
-       {0x0012, 0x007F, 257, -1, 37077, 37080, 37087, 37097, 37101, 37077, 0, {37105, 0, 0, 0}, 18, 18, { 949, 20833, 10003, 949, 0, ',' }},
-       {0x0013, 0x007F, 257, -1, 37115, 37118, 37124, 37135, 37139, 37115, 0, {37143, 0, 0, 0}, 19, 19, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x0014, 0x007F, 257, -1, 37165, 37168, 37178, 37184, 37188, 37192, 0, {36499, 0, 0, 0}, 20, 20, { 1252, 20277, 10000, 850, 0, ';' }},
-       {0x0015, 0x007F, 257, -1, 37195, 37198, 37205, 37212, 37216, 37195, 0, {37220, 0, 0, 0}, 21, 21, { 1250, 20880, 10029, 852, 0, ';' }},
-       {0x0016, 0x007F, 257, -1, 37244, 37247, 37258, 37269, 37273, 37244, 0, {37277, 0, 0, 0}, 22, 22, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x0017, 0x007F, 257, -1, 37300, 37303, 37311, 37321, 37325, 37300, 0, {37329, 0, 0, 0}, 23, 23, { 1252, 20273, 10000, 850, 0, ';' }},
-       {0x0018, 0x007F, 257, -1, 37349, 37352, 37361, 37370, 37374, 37349, 0, {37378, 0, 0, 0}, 24, 24, { 1250, 20880, 10029, 852, 0, ';' }},
-       {0x0019, 0x007F, 257, -1, 37397, 37400, 37408, 37423, 37427, 37397, 0, {37431, 0, 0, 0}, 25, 25, { 1251, 20880, 10007, 866, 0, ';' }},
-       {0x001A, 0x007F, 257, -1, 37477, 37480, 37489, 37498, 37502, 37477, 0, {37506, 0, 0, 0}, 26, 26, { 1250, 500, 10082, 852, 0, ';' }},
-       {0x001B, 0x007F, 257, -1, 37529, 37532, 37539, 37551, 37555, 37529, 0, {37559, 0, 0, 0}, 27, 27, { 1250, 20880, 10029, 852, 0, ';' }},
-       {0x001C, 0x007F, 257, -1, 37583, 37586, 37595, 37601, 37605, 37583, 0, {0, 0, 0, 0}, 28, 28, { 1250, 20880, 10029, 852, 0, ';' }},
-       {0x001D, 0x007F, 257, -1, 37609, 37612, 37620, 37628, 37632, 37609, 0, {36499, 0, 0, 0}, 29, 29, { 1252, 20278, 10000, 850, 0, ';' }},
-       {0x001E, 0x007F, 512, -1, 37636, 37639, 37644, 37654, 37658, 37636, 0, {0, 37662, 0, 0}, 30, 30, { 874, 20838, 10021, 874, 0, ',' }},
-       {0x001F, 0x007F, 257, -1, 37693, 37696, 37704, 37713, 37717, 37693, 0, {37721, 0, 0, 0}, 31, 31, { 1254, 20905, 10081, 857, 0, ';' }},
-       {0x0020, 0x007F, 257, -1, 37735, 37738, 37743, 37752, 37756, 37735, 0, {37760, 0, 0, 0}, 32, 32, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x0021, 0x007F, 257, -1, 37790, 37793, 37804, 37821, 37825, 37790, 0, {37829, 0, 0, 0}, 33, 33, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x0022, 0x007F, 257, -1, 37848, 37851, 37861, 37882, 37886, 37848, 0, {37890, 0, 0, 0}, 34, 34, { 1251, 500, 10017, 866, 0, ';' }},
-       {0x0023, 0x007F, 257, -1, 37936, 37939, 37950, 37971, 37975, 37936, 0, {37979, 0, 0, 0}, 35, 35, { 1251, 500, 10007, 866, 0, ';' }},
-       {0x0024, 0x007F, 257, -1, 38021, 38024, 38034, 38048, 38052, 38021, 0, {38056, 0, 0, 0}, 36, 36, { 1250, 20880, 10029, 852, 0, ';' }},
-       {0x0025, 0x007F, 257, -1, 38078, 38081, 38090, 38096, 38100, 38078, 0, {38104, 0, 0, 0}, 37, 37, { 1257, 500, 10029, 775, 0, ';' }},
-       {0x0026, 0x007F, 257, -1, 38124, 38127, 38135, 38145, 38149, 38124, 0, {38153, 0, 0, 0}, 38, 38, { 1257, 500, 10029, 775, 0, ';' }},
-       {0x0027, 0x007F, 257, -1, 38172, 38175, 38186, 38196, 38200, 38172, 0, {38204, 0, 0, 0}, 39, 39, { 1257, 500, 10029, 775, 0, ';' }},
-       {0x0028, 0x007F, 257, -1, 38227, 38230, 0, 38236, 38240, 38227, 0, {0, 0, 0, 0}, 40, 40, { 1251, 20880, 10007, 866, 0, ';' }},
-       {0x0029, 0x007F, 257, -1, 38244, 38247, 38255, 38266, 38270, 38244, 0, {38274, 0, 0, 0}, 41, 41, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x002A, 0x007F, 257, -1, 38298, 38301, 38312, 38327, 4144, 38298, 0, {38331, 0, 0, 0}, 42, 42, { 1258, 500, 10000, 1258, 0, ',' }},
-       {0x002B, 0x007F, 257, -1, 38346, 38349, 38358, 38373, 38377, 38346, 0, {0, 0, 0, 0}, 43, 43, { 0, 500, 2, 1, 0, ',' }},
-       {0x002C, 0x007F, 257, -1, 14514, 38381, 38393, 38407, 38411, 14514, 0, {38415, 0, 0, 0}, 44, 44, { 1254, 20905, 10081, 857, 0, ';' }},
-       {0x002D, 0x007F, 257, -1, 38433, 38436, 38443, 38451, 38455, 38433, 0, {38459, 0, 0, 0}, 45, 45, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x002F, 0x007F, 257, -1, 38479, 38482, 38493, 38514, 38518, 38479, 0, {38522, 0, 0, 0}, 46, 46, { 1251, 500, 10007, 866, 0, ';' }},
-       {0x0032, 0x007F, 257, -1, 38566, 38569, 38576, 38585, 38589, 38566, 0, {0, 0, 0, 0}, 47, 47, { 1252, 500, 10000, 850, 0, ',' }},
-       {0x0034, 0x007F, 257, -1, 38593, 38596, 38602, 38611, 38615, 38593, 0, {0, 0, 0, 0}, 48, 48, { 1252, 500, 10000, 850, 0, ',' }},
-       {0x0035, 0x007F, 257, -1, 38619, 38622, 38627, 38635, 38639, 38619, 0, {38643, 0, 0, 0}, 49, 49, { 1252, 500, 10000, 850, 0, ',' }},
-       {0x0036, 0x007F, 257, -1, 38664, 38667, 38667, 38677, 38681, 38664, 0, {38685, 0, 0, 0}, 50, 50, { 1252, 500, 10000, 850, 0, ',' }},
-       {0x0037, 0x007F, 257, -1, 38705, 38708, 38717, 38739, 38743, 38705, 0, {38747, 0, 0, 0}, 51, 51, { 0, 500, 2, 1, 0, ';' }},
-       {0x0038, 0x007F, 257, -1, 38812, 38815, 38823, 38833, 38837, 38812, 0, {0, 0, 0, 0}, 52, 52, { 1252, 20277, 10079, 850, 0, ';' }},
-       {0x0039, 0x007F, 257, -1, 38841, 38844, 38850, 38869, 38873, 38841, 0, {38877, 0, 0, 0}, 53, 53, { 0, 500, 2, 1, 0, ',' }},
-       {0x003A, 0x007F, 257, -1, 38918, 38921, 38929, 38935, 38939, 38918, 0, {38943, 0, 0, 0}, 54, 54, { 0, 500, 2, 1, 0, ',' }},
-       {0x003B, 0x007F, 257, -1, 38964, 38967, 38981, 38998, 39002, 38964, 0, {0, 0, 0, 0}, 55, 55, { 1252, 20277, 10000, 850, 0, ';' }},
-       {0x003C, 0x007F, 257, -1, 39006, 39009, 39015, 39023, 39027, 39006, 0, {39031, 0, 0, 0}, 56, 56, { 1252, 500, 10000, 850, 0, ',' }},
-       {0x003E, 0x007F, 257, -1, 39052, 39055, 39061, 39075, 39079, 39052, 0, {39083, 0, 0, 0}, 57, 57, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x003F, 0x007F, 257, -1, 39100, 39103, 39110, 39130, 39134, 39100, 0, {39138, 0, 0, 0}, 58, 58, { 0, 500, 2, 1, 0, ';' }},
-       {0x0040, 0x007F, 257, -1, 39180, 39183, 39191, 39204, 39208, 39180, 0, {0, 0, 0, 0}, 59, 59, { 1251, 20880, 10007, 866, 0, ';' }},
-       {0x0041, 0x007F, 257, -1, 39212, 39215, 39223, 39233, 39237, 39212, 0, {39241, 0, 0, 0}, 60, 60, { 1252, 500, 10000, 437, 0, ',' }},
-       {0x0043, 0x007F, 257, -1, 39262, 39265, 39271, 39282, 39286, 39262, 0, {0, 0, 0, 0}, 61, 61, { 1254, 500, 10029, 857, 0, ';' }},
-       {0x0045, 0x007F, 257, -1, 39290, 39293, 39301, 39317, 39321, 39290, 0, {39325, 0, 0, 0}, 62, 62, { 0, 500, 2, 1, 0, ',' }},
-       {0x0046, 0x007F, 257, -1, 39390, 39393, 39401, 39420, 39424, 39390, 0, {0, 0, 0, 0}, 63, 63, { 0, 500, 2, 1, 0, ',' }},
-       {0x0047, 0x007F, 257, -1, 39428, 39431, 39440, 39462, 39466, 39428, 0, {39470, 0, 0, 0}, 64, 64, { 0, 500, 2, 1, 0, ',' }},
-       {0x0048, 0x007F, 257, -1, 14520, 39526, 39532, 39548, 39552, 14520, 0, {0, 0, 0, 0}, 65, 65, { 0, 500, 2, 1, 0, ',' }},
-       {0x0049, 0x007F, 257, -1, 39556, 39559, 39565, 39581, 39585, 39556, 0, {39589, 0, 0, 0}, 66, 66, { 0, 500, 2, 1, 0, ',' }},
-       {0x004A, 0x007F, 257, -1, 39654, 39657, 39664, 39683, 39687, 39654, 0, {39691, 0, 0, 0}, 67, 67, { 0, 500, 2, 1, 0, ',' }},
-       {0x004B, 0x007F, 257, -1, 35582, 39756, 39764, 39780, 39784, 35582, 0, {39788, 0, 0, 0}, 68, 68, { 0, 500, 2, 1, 0, ',' }},
-       {0x004C, 0x007F, 257, -1, 39859, 39862, 39872, 39891, 39895, 39859, 0, {39899, 0, 0, 0}, 69, 69, { 0, 500, 2, 1, 0, ',' }},
-       {0x004D, 0x007F, 257, -1, 14511, 39949, 39958, 39980, 39984, 14511, 0, {39988, 0, 0, 0}, 70, 70, { 0, 500, 2, 1, 0, ',' }},
-       {0x004E, 0x007F, 257, -1, 40041, 40044, 40052, 40068, 2588, 40041, 0, {40072, 0, 0, 0}, 71, 71, { 0, 500, 2, 1, 0, ',' }},
-       {0x0050, 0x007F, 257, -1, 40134, 40137, 40147, 40160, 40164, 40134, 0, {0, 0, 0, 0}, 72, 72, { 1251, 20880, 10007, 866, 0, ';' }},
-       {0x0051, 0x007F, 257, -1, 40168, 40171, 40179, 40204, 40208, 40168, 0, {0, 0, 0, 0}, 73, 73, { 0, 500, 2, 1, 0, ',' }},
-       {0x0052, 0x007F, 257, -1, 40212, 40215, 40221, 40229, 40233, 40212, 0, {0, 0, 0, 0}, 74, 74, { 1252, 20285, 10000, 850, 0, ',' }},
-       {0x0053, 0x007F, 257, -1, 40237, 40240, 40246, 40274, 40278, 40237, 0, {0, 0, 0, 0}, 75, 75, { 0, 500, 2, 1, 0, ',' }},
-       {0x0054, 0x007F, 257, -1, 40282, 40285, 40289, 40299, 40303, 40282, 0, {0, 0, 0, 0}, 76, 76, { 0, 500, 2, 1, 0, ',' }},
-       {0x0056, 0x007F, 257, -1, 40307, 40310, 40319, 40326, 40330, 40307, 0, {36713, 0, 0, 0}, 77, 77, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x0057, 0x007F, 257, -1, 40334, 40338, 40346, 40365, 40334, 40334, 0, {0, 0, 0, 0}, 78, 78, { 0, 500, 2, 1, 0, ',' }},
-       {0x005B, 0x007F, 257, -1, 40369, 40372, 40380, 40396, 40400, 40369, 0, {40404, 0, 0, 0}, 79, 79, { 0, 500, 2, 1, 0, ',' }},
-       {0x005E, 0x007F, 257, -1, 7860, 40426, 40434, 40447, 40451, 7860, 0, {40455, 0, 0, 0}, 80, 80, { 0, 500, 2, 1, 0, ';' }},
-       {0x005F, 0x007F, 257, -1, 40500, 40504, 40530, 40540, 40500, 40500, 0, {0, 0, 0, 0}, 81, 81, { 1252, 20297, 10000, 850, 0, ';' }},
-       {0x0061, 0x007F, 257, -1, 2082, 40544, 40551, 40570, 40574, 2082, 0, {40578, 0, 0, 0}, 82, 82, { 0, 500, 2, 1, 0, ',' }},
-       {0x0063, 0x007F, 1024, -1, 40628, 40631, 40638, 40647, 40651, 40628, 0, {0, 0, 0, 0}, 83, 83, { 0, 500, 2, 1, 1, ';' }},
-       {0x0064, 0x007F, 257, -1, 40655, 40659, 40659, 40668, 40655, 40655, 0, {40672, 0, 0, 0}, 84, 84, { 1252, 500, 10000, 437, 0, ',' }},
-       {0x0068, 0x007F, 257, -1, 40695, 40698, 40698, 40704, 40708, 40695, 0, {0, 0, 0, 0}, 85, 85, { 1252, 37, 10000, 437, 0, ',' }},
-       {0x006A, 0x007F, 257, -1, 40712, 40715, 40722, 40737, 40741, 40712, 0, {0, 0, 0, 0}, 86, 86, { 1252, 37, 10000, 437, 0, ',' }},
-       {0x006C, 0x007F, 257, -1, 40745, 40749, 40764, 40781, 40745, 40745, 0, {0, 0, 0, 0}, 87, 87, { 1252, 500, 10000, 850, 0, ',' }},
-       {0x006F, 0x007F, 257, -1, 40785, 40788, 40800, 40812, 40816, 40785, 0, {0, 0, 0, 0}, 88, 88, { 1252, 20277, 10000, 850, 0, ';' }},
-       {0x0070, 0x007F, 257, -1, 14505, 40820, 40820, 40825, 40829, 14505, 0, {0, 0, 0, 0}, 89, 89, { 1252, 37, 10000, 437, 0, ',' }},
-       {0x0078, 0x007F, 257, -1, 40833, 40836, 40847, 40857, 40861, 40833, 0, {40865, 0, 0, 0}, 90, 90, { 0, 500, 2, 1, 0, ',' }},
-       {0x007E, 0x007F, 257, -1, 40878, 40881, 40888, 40898, 40902, 40878, 0, {40906, 0, 0, 0}, 91, 91, { 1252, 20297, 10000, 850, 0, ';' }},
-       {0x0082, 0x007F, 257, -1, 40926, 40929, 40937, 40945, 40949, 40926, 0, {0, 0, 0, 0}, 92, 92, { 1252, 20297, 10000, 850, 0, ';' }},
-       {0x0084, 0x007F, 257, -1, 40953, 40957, 40970, 40989, 40953, 40953, 0, {40993, 0, 0, 0}, 93, 93, { 1252, 20297, 10000, 850, 0, ';' }},
-       {0x0085, 0x007F, 257, -1, 41018, 41022, 41028, 41046, 41018, 41018, 0, {0, 0, 0, 0}, 94, 94, { 1251, 20880, 10007, 866, 0, ';' }},
-       {0x0087, 0x007F, 257, -1, 41050, 41053, 41053, 41065, 41069, 41050, 0, {0, 0, 0, 0}, 95, 95, { 1252, 37, 10000, 437, 0, ';' }},
-       {0x0091, 0x007F, 257, -1, 41073, 41076, 41092, 41102, 41106, 41073, 0, {41110, 0, 0, 0}, 96, 96, { 1252, 20285, 10000, 850, 0, ',' }},
-       {0x0401, 0x0001, 768, 98, 41135, 41141, 41163, 36168, 36172, 36143, 13253, {0, 0, 36176, 0}, 97, 97, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x0402, 0x0002, 257, 11, 41227, 41233, 41254, 36236, 36240, 36204, 41292, {36244, 0, 0, 0}, 98, 98, { 1251, 21025, 10007, 866, 0, ';' }},
-       {0x0403, 0x0003, 257, 32, 41295, 41301, 41317, 36305, 36309, 36286, 41335, {36313, 0, 0, 0}, 99, 99, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x0404, 0x7C04, 257, 110, 41338, 41344, 41366, 41382, 36373, 36377, 41386, {41389, 0, 0, 0}, 100, 100, { 950, 500, 10002, 950, 0, ',' }},
-       {0x0405, 0x0005, 257, 24, 41396, 41402, 41425, 36441, 36445, 36422, 41455, {36449, 0, 0, 0}, 101, 101, { 1250, 500, 10029, 852, 0, ';' }},
-       {0x0406, 0x0006, 257, 26, 41458, 41464, 41481, 36491, 36495, 36475, 41497, {36499, 0, 0, 0}, 102, 102, { 1252, 20277, 10000, 850, 0, ';' }},
-       {0x0407, 0x0007, 257, 25, 41500, 41506, 41523, 36538, 36542, 36520, 41545, {36546, 0, 0, 0}, 103, 103, { 1252, 20273, 10000, 850, 0, ';' }},
-       {0x0408, 0x0008, 257, 40, 41548, 41554, 41569, 36597, 36601, 36571, 41601, {36605, 0, 0, 0}, 104, 104, { 1253, 20273, 10006, 737, 0, ';' }},
-       {0x0409, 0x0009, 257, 112, 41604, 41610, 41610, 36658, 36662, 36647, 41634, {36666, 0, 0, 0}, 105, 105, { 1252, 37, 10000, 437, 0, ',' }},
-       {0x040B, 0x000B, 257, 34, 41637, 41643, 41661, 36752, 36756, 36735, 41675, {36760, 0, 0, 0}, 106, 106, { 1252, 20278, 10000, 850, 0, ';' }},
-       {0x040C, 0x000C, 257, 36, 41678, 41684, 41700, 36805, 36809, 36785, 41719, {36813, 0, 0, 0}, 107, 107, { 1252, 20297, 10000, 850, 0, ';' }},
-       {0x040D, 0x000D, 257, 48, 41722, 41728, 41744, 36856, 36860, 36835, 41768, {36864, 0, 0, 0}, 108, 108, { 1255, 500, 10005, 862, 1, ',' }},
-       {0x040E, 0x000E, 257, 45, 41771, 41777, 41797, 36917, 36921, 36897, 41820, {36925, 0, 0, 0}, 109, 109, { 1250, 500, 10029, 852, 0, ';' }},
-       {0x040F, 0x000F, 257, 52, 41823, 41829, 41849, 36964, 36968, 36941, 41869, {36972, 0, 0, 0}, 110, 110, { 1252, 20871, 10079, 850, 0, ';' }},
-       {0x0410, 0x0010, 257, 53, 41872, 41878, 41894, 37012, 37016, 36992, 41912, {36713, 0, 0, 0}, 111, 111, { 1252, 20280, 10000, 850, 0, ';' }},
-       {0x0411, 0x0011, 257, 56, 41915, 41921, 41938, 37042, 37046, 37020, 41957, {37050, 0, 0, 0}, 112, 112, { 932, 20290, 10001, 932, 0, ',' }},
-       {0x0412, 0x0012, 257, 60, 41960, 41966, 41987, 37097, 37101, 37077, 42012, {37105, 0, 0, 0}, 113, 113, { 949, 20833, 10003, 949, 0, ',' }},
-       {0x0413, 0x0013, 257, 80, 42015, 42021, 42041, 37135, 37139, 37115, 42064, {37143, 0, 0, 0}, 114, 114, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x0414, 0x7C14, 257, 81, 42067, 42073, 42100, 37184, 37188, 37192, 42122, {36499, 0, 0, 0}, 115, 115, { 1252, 20277, 10000, 850, 0, ';' }},
-       {0x0415, 0x0015, 257, 89, 42125, 42131, 42147, 37212, 37216, 37195, 42163, {37220, 0, 0, 0}, 116, 116, { 1250, 20880, 10029, 852, 0, ';' }},
-       {0x0416, 0x0016, 257, 15, 42166, 42172, 42192, 37269, 37273, 37244, 42212, {37277, 0, 0, 0}, 117, 117, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x0417, 0x0017, 257, 19, 42215, 42221, 42243, 37321, 37325, 37300, 13256, {37329, 0, 0, 0}, 118, 118, { 1252, 20273, 10000, 850, 0, ';' }},
-       {0x0418, 0x0018, 257, 94, 42262, 42268, 42287, 37370, 37374, 37349, 42307, {37378, 0, 0, 0}, 119, 119, { 1250, 20880, 10029, 852, 0, ';' }},
-       {0x0419, 0x0019, 257, 96, 42310, 42316, 42333, 37423, 37427, 37397, 42363, {37431, 0, 0, 0}, 120, 120, { 1251, 20880, 10007, 866, 0, ';' }},
-       {0x041A, 0x001A, 257, 44, 42366, 42372, 42391, 37498, 37502, 37477, 42411, {37506, 0, 0, 0}, 121, 121, { 1250, 500, 10082, 852, 0, ';' }},
-       {0x041B, 0x001B, 257, 102, 42414, 42420, 42438, 37551, 37555, 37529, 42473, {37559, 0, 0, 0}, 122, 122, { 1250, 20880, 10029, 852, 0, ';' }},
-       {0x041C, 0x001C, 257, 2, 42476, 42482, 42501, 37601, 37605, 37583, 42520, {0, 0, 0, 0}, 123, 123, { 1250, 20880, 10029, 852, 0, ';' }},
-       {0x041D, 0x001D, 257, 99, 42523, 42529, 42546, 37628, 37632, 37609, 42564, {36499, 0, 0, 0}, 124, 124, { 1252, 20278, 10000, 850, 0, ';' }},
-       {0x041E, 0x001E, 512, 105, 42567, 42573, 42589, 37654, 37658, 37636, 42611, {0, 37662, 0, 0}, 125, 125, { 874, 20838, 10021, 874, 0, ',' }},
-       {0x041F, 0x001F, 257, 108, 42614, 42620, 42637, 37713, 37717, 37693, 42657, {37721, 0, 0, 0}, 126, 126, { 1254, 20905, 10081, 857, 0, ';' }},
-       {0x0420, 0x0020, 257, 88, 42660, 42666, 42682, 37752, 37756, 37735, 42708, {37760, 0, 0, 0}, 127, 127, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x0421, 0x0021, 257, 46, 42711, 42717, 42740, 37821, 37825, 37790, 42769, {37829, 0, 0, 0}, 128, 128, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x0422, 0x0022, 257, 111, 42772, 42778, 42798, 37882, 37886, 37848, 42836, {37890, 0, 0, 0}, 129, 129, { 1251, 500, 10017, 866, 0, ';' }},
-       {0x0423, 0x0023, 257, 16, 42839, 42845, 42866, 37971, 37975, 37936, 42906, {37979, 0, 0, 0}, 130, 130, { 1251, 500, 10007, 866, 0, ';' }},
-       {0x0424, 0x0024, 257, 101, 42909, 42915, 42936, 38048, 38052, 38021, 42962, {38056, 0, 0, 0}, 131, 131, { 1250, 20880, 10029, 852, 0, ';' }},
-       {0x0425, 0x0025, 257, 30, 42965, 42971, 42990, 38096, 38100, 38078, 43004, {38104, 0, 0, 0}, 132, 132, { 1257, 500, 10029, 775, 0, ';' }},
-       {0x0426, 0x0026, 257, 68, 43007, 43013, 43030, 38145, 38149, 38124, 43050, {38153, 0, 0, 0}, 133, 133, { 1257, 500, 10029, 775, 0, ';' }},
-       {0x0427, 0x0027, 257, 66, 43053, 43059, 43082, 38196, 38200, 38172, 43102, {38204, 0, 0, 0}, 134, 134, { 1257, 500, 10029, 775, 0, ';' }},
-       {0x0428, 0x7C28, 257, 106, 43105, 43116, 0, 38236, 38240, 38227, 43145, {0, 0, 0, 0}, 135, 135, { 1251, 20880, 10007, 866, 0, ';' }},
-       {0x0429, 0x0029, 257, 51, 43148, 43154, 43169, 38266, 38270, 38244, 43193, {38274, 0, 0, 0}, 136, 136, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x042A, 0x002A, 257, 116, 43196, 43202, 43223, 38327, 4144, 38298, 43251, {38331, 0, 0, 0}, 137, 137, { 1258, 500, 10000, 1258, 0, ',' }},
-       {0x042B, 0x002B, 257, 3, 43254, 43260, 43279, 38373, 38377, 38346, 3804, {0, 0, 0, 0}, 138, 138, { 0, 500, 2, 1, 0, ',' }},
-       {0x042C, 0x782C, 257, 7, 43344, 43355, 43387, 38407, 38411, 14514, 43415, {38415, 0, 0, 0}, 139, 139, { 1254, 20905, 10081, 857, 0, ';' }},
-       {0x042D, 0x002D, 257, 32, 43418, 43424, 43439, 38451, 38455, 38433, 41335, {38459, 0, 0, 0}, 140, 140, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x042F, 0x002F, 257, 73, 43458, 43464, 43487, 38514, 38518, 38479, 43531, {38522, 0, 0, 0}, 141, 141, { 1251, 500, 10007, 866, 0, ';' }},
-       {0x0432, 0x0032, 257, 118, 43534, 43540, 38576, 38585, 38589, 38566, 43562, {0, 0, 0, 0}, 142, 142, { 1252, 500, 10000, 850, 0, ',' }},
-       {0x0434, 0x0034, 257, 118, 43565, 43571, 38602, 38611, 38615, 38593, 43562, {0, 0, 0, 0}, 143, 143, { 1252, 500, 10000, 850, 0, ',' }},
-       {0x0435, 0x0035, 257, 118, 43592, 43598, 43618, 38635, 38639, 38619, 43562, {38643, 0, 0, 0}, 144, 144, { 1252, 500, 10000, 850, 0, ',' }},
-       {0x0436, 0x0036, 257, 118, 43646, 43652, 43677, 38677, 38681, 38664, 43562, {38685, 0, 0, 0}, 145, 145, { 1252, 500, 10000, 850, 0, ',' }},
-       {0x0437, 0x0037, 257, 38, 43701, 43707, 43726, 38739, 38743, 38705, 43781, {38747, 0, 0, 0}, 146, 146, { 0, 500, 2, 1, 0, ';' }},
-       {0x0438, 0x0038, 257, 35, 43784, 43790, 43814, 38833, 38837, 38812, 43835, {0, 0, 0, 0}, 147, 147, { 1252, 20277, 10079, 850, 0, ';' }},
-       {0x0439, 0x0039, 257, 49, 43838, 43844, 43858, 38869, 38873, 38841, 43892, {38877, 0, 0, 0}, 148, 148, { 0, 500, 2, 1, 0, ',' }},
-       {0x043A, 0x003A, 257, 75, 43895, 43901, 43917, 38935, 38939, 38918, 43931, {38943, 0, 0, 0}, 149, 149, { 0, 500, 2, 1, 0, ',' }},
-       {0x043B, 0x003B, 257, 81, 43934, 43940, 43963, 38998, 39002, 38964, 42122, {0, 0, 0, 0}, 150, 150, { 1252, 20277, 10000, 850, 0, ';' }},
-       {0x043E, 0x003E, 257, 77, 43988, 43994, 44011, 39075, 39079, 39052, 44036, {39083, 0, 0, 0}, 151, 151, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x0440, 0x0040, 257, 58, 44039, 44045, 44066, 39204, 39208, 39180, 44102, {0, 0, 0, 0}, 152, 152, { 1251, 20880, 10007, 866, 0, ';' }},
-       {0x0441, 0x0041, 257, 57, 44105, 44111, 44127, 39233, 39237, 39212, 44145, {39241, 0, 0, 0}, 153, 153, { 1252, 500, 10000, 437, 0, ',' }},
-       {0x0443, 0x7C43, 257, 114, 44148, 44159, 44185, 39282, 39286, 39262, 44219, {0, 0, 0, 0}, 154, 154, { 1254, 500, 10029, 857, 0, ';' }},
-       {0x0445, 0x0045, 257, 49, 44222, 44228, 44244, 39317, 39321, 39290, 43892, {39325, 0, 0, 0}, 155, 155, { 0, 500, 2, 1, 0, ',' }},
-       {0x0447, 0x0047, 257, 49, 44275, 44281, 44298, 39462, 39466, 39428, 43892, {39470, 0, 0, 0}, 156, 156, { 0, 500, 2, 1, 0, ',' }},
-       {0x0448, 0x0048, 257, 49, 44335, 44341, 44355, 39548, 39552, 14520, 43892, {0, 0, 0, 0}, 157, 157, { 0, 500, 2, 1, 0, ',' }},
-       {0x0449, 0x0049, 257, 49, 44386, 44392, 44406, 39581, 39585, 39556, 43892, {39589, 0, 0, 0}, 158, 158, { 0, 500, 2, 1, 0, ',' }},
-       {0x044A, 0x004A, 257, 49, 44446, 44452, 44467, 39683, 39687, 39654, 43892, {39691, 0, 0, 0}, 159, 159, { 0, 500, 2, 1, 0, ',' }},
-       {0x044B, 0x004B, 257, 49, 44514, 44520, 44536, 39780, 39784, 35582, 43892, {39788, 0, 0, 0}, 160, 160, { 0, 500, 2, 1, 0, ',' }},
-       {0x044C, 0x004C, 257, 49, 44567, 44573, 44591, 39891, 39895, 39859, 43892, {39899, 0, 0, 0}, 161, 161, { 0, 500, 2, 1, 0, ',' }},
-       {0x044D, 0x004D, 257, 49, 44631, 44637, 44654, 39980, 39984, 14511, 43892, {39988, 0, 0, 0}, 162, 162, { 0, 500, 2, 1, 0, ',' }},
-       {0x044E, 0x004E, 257, 49, 44691, 44697, 44713, 40068, 2588, 40041, 43892, {40072, 0, 0, 0}, 163, 163, { 0, 500, 2, 1, 0, ',' }},
-       {0x0451, 0x0051, 257, 21, 44744, 44750, 44766, 40204, 40208, 40168, 13335, {0, 0, 0, 0}, 164, 164, { 0, 500, 2, 1, 0, ',' }},
-       {0x0452, 0x0052, 257, 37, 44812, 44818, 44841, 40229, 40233, 40212, 44864, {0, 0, 0, 0}, 165, 165, { 1252, 20285, 10000, 850, 0, ',' }},
-       {0x0453, 0x0053, 257, 59, 44867, 44873, 44890, 40274, 40278, 40237, 44942, {0, 0, 0, 0}, 166, 166, { 0, 500, 2, 1, 0, ',' }},
-       {0x0454, 0x0054, 257, 62, 44945, 44951, 44962, 40299, 40303, 40282, 44984, {0, 0, 0, 0}, 167, 167, { 0, 500, 2, 1, 0, ',' }},
-       {0x0456, 0x0056, 257, 32, 44987, 44993, 45010, 40326, 40330, 40307, 41335, {36713, 0, 0, 0}, 168, 168, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x0457, 0x0057, 257, 49, 45027, 45034, 45050, 40365, 40334, 40334, 43892, {0, 0, 0, 0}, 169, 169, { 0, 500, 2, 1, 0, ',' }},
-       {0x045B, 0x005B, 257, 65, 45084, 45090, 45110, 40396, 40400, 40369, 45160, {40404, 0, 0, 0}, 170, 170, { 0, 500, 2, 1, 0, ',' }},
-       {0x045E, 0x005E, 257, 33, 45163, 45169, 45188, 40447, 40451, 7860, 45219, {40455, 0, 0, 0}, 171, 171, { 0, 500, 2, 1, 0, ';' }},
-       {0x0461, 0x0061, 257, 82, 45222, 45228, 45243, 40570, 40574, 2082, 45280, {40578, 0, 0, 0}, 172, 172, { 0, 500, 2, 1, 0, ',' }},
-       {0x0463, 0x0063, 1024, 1, 45283, 45289, 45310, 40647, 40651, 40628, 45340, {0, 0, 0, 0}, 173, 173, { 0, 500, 2, 1, 1, ';' }},
-       {0x0464, 0x0064, 257, 87, 45343, 45350, 45373, 40668, 40655, 40655, 45394, {40672, 0, 0, 0}, 174, 174, { 1252, 500, 10000, 437, 0, ',' }},
-       {0x0468, 0x7C68, 257, 78, 45397, 45408, 45431, 40704, 40708, 40695, 45448, {0, 0, 0, 0}, 175, 175, { 1252, 37, 10000, 437, 0, ',' }},
-       {0x046A, 0x006A, 257, 78, 45451, 45457, 45474, 40737, 40741, 40712, 45448, {0, 0, 0, 0}, 176, 176, { 1252, 37, 10000, 437, 0, ',' }},
-       {0x046C, 0x006C, 257, 118, 45520, 45527, 40764, 40781, 40745, 40745, 43562, {0, 0, 0, 0}, 177, 177, { 1252, 500, 10000, 850, 0, ',' }},
-       {0x046F, 0x006F, 257, 39, 45557, 45563, 45587, 40812, 40816, 40785, 45618, {0, 0, 0, 0}, 178, 178, { 1252, 20277, 10000, 850, 0, ';' }},
-       {0x0470, 0x0070, 257, 78, 45621, 45627, 45627, 40825, 40829, 14505, 45448, {0, 0, 0, 0}, 179, 179, { 1252, 37, 10000, 437, 0, ',' }},
-       {0x0478, 0x0078, 257, 21, 45642, 45648, 45667, 40857, 40861, 40833, 13335, {40865, 0, 0, 0}, 180, 180, { 0, 500, 2, 1, 0, ',' }},
-       {0x047E, 0x007E, 257, 36, 45686, 45692, 45708, 40898, 40902, 40878, 41719, {40906, 0, 0, 0}, 181, 181, { 1252, 20297, 10000, 850, 0, ';' }},
-       {0x0482, 0x0082, 257, 36, 45727, 45733, 45750, 40945, 40949, 40926, 41719, {0, 0, 0, 0}, 182, 182, { 1252, 20297, 10000, 850, 0, ';' }},
-       {0x0485, 0x0085, 257, 96, 45768, 45775, 41028, 41046, 41018, 41018, 42363, {0, 0, 0, 0}, 183, 183, { 1251, 20880, 10007, 866, 0, ';' }},
-       {0x0487, 0x0087, 257, 97, 45790, 45796, 45796, 41065, 41069, 41050, 45817, {0, 0, 0, 0}, 184, 184, { 1252, 37, 10000, 437, 0, ';' }},
-       {0x0491, 0x0091, 257, 37, 45820, 45826, 45859, 41102, 41106, 41073, 44864, {41110, 0, 0, 0}, 185, 185, { 1252, 20285, 10000, 850, 0, ',' }},
-       {0x0801, 0x0001, 257, 50, 45895, 45901, 45915, 45945, 36172, 36143, 45949, {36176, 0, 0, 0}, 186, 186, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x0804, 0x0004, 257, 21, 45952, 36341, 45958, 36369, 36373, 36377, 13335, {36380, 0, 0, 0}, 187, 187, { 936, 500, 10008, 936, 0, ',' }},
-       {0x0807, 0x0007, 257, 19, 45974, 45980, 46001, 46019, 36542, 36520, 13256, {36546, 0, 0, 0}, 188, 188, { 1252, 20273, 10000, 850, 0, ';' }},
-       {0x0809, 0x0009, 257, 37, 46023, 46029, 46029, 46054, 36662, 36647, 44864, {36666, 0, 0, 0}, 189, 189, { 1252, 20285, 10000, 850, 0, ',' }},
-       {0x080A, 0x000A, 257, 76, 46058, 46064, 46081, 46100, 36709, 36685, 46104, {36713, 0, 0, 0}, 190, 190, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x080C, 0x000C, 257, 10, 46107, 46113, 46130, 46151, 36809, 36785, 46155, {36813, 0, 0, 0}, 191, 191, { 1252, 20297, 10000, 850, 0, ';' }},
-       {0x0810, 0x0010, 257, 19, 46158, 46164, 46186, 46206, 37016, 36992, 13256, {36713, 0, 0, 0}, 192, 192, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x0813, 0x0013, 257, 10, 46210, 46216, 46232, 46253, 37139, 37115, 46155, {37143, 0, 0, 0}, 193, 193, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x0814, 0x7814, 257, 81, 46257, 46263, 46290, 46306, 46310, 46314, 42122, {36499, 0, 0, 0}, 194, 194, { 1252, 20277, 10000, 850, 0, ';' }},
-       {0x0816, 0x0016, 257, 91, 46317, 46323, 46345, 46367, 37273, 37244, 46371, {37277, 0, 0, 0}, 195, 195, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x081D, 0x001D, 257, 34, 46374, 46380, 46398, 46416, 37632, 37609, 41675, {36499, 0, 0, 0}, 196, 196, { 1252, 20278, 10000, 850, 0, ';' }},
-       {0x082C, 0x742C, 257, 7, 46420, 46431, 43387, 46466, 38411, 14514, 43415, {38415, 0, 0, 0}, 197, 197, { 1251, 20880, 10007, 866, 0, ';' }},
-       {0x083C, 0x003C, 257, 47, 46470, 46476, 46492, 39023, 39027, 39006, 46508, {39031, 0, 0, 0}, 198, 198, { 1252, 500, 10000, 850, 0, ',' }},
-       {0x083E, 0x003E, 257, 13, 46511, 46517, 46532, 46555, 39079, 39052, 46559, {39083, 0, 0, 0}, 199, 199, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x0843, 0x7843, 257, 114, 46562, 46573, 44185, 39282, 39286, 39262, 44219, {0, 0, 0, 0}, 200, 200, { 1251, 20880, 10007, 866, 0, ';' }},
-       {0x0845, 0x0045, 257, 9, 46602, 46608, 46629, 46672, 39321, 39290, 46676, {39325, 0, 0, 0}, 201, 201, { 0, 500, 2, 1, 0, ',' }},
-       {0x0850, 0x7C50, 257, 21, 46679, 46690, 40147, 46719, 40164, 40134, 13335, {0, 0, 0, 0}, 202, 202, { 0, 500, 2, 1, 0, ',' }},
-       {0x0C01, 0x0001, 257, 31, 46723, 46729, 46744, 46768, 36172, 36143, 46772, {36176, 0, 0, 0}, 203, 203, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x0C04, 0x7C04, 257, 42, 46775, 46781, 46824, 46861, 36373, 36377, 46865, {41389, 0, 0, 0}, 204, 204, { 950, 500, 10002, 950, 0, ',' }},
-       {0x0C07, 0x0007, 257, 5, 46868, 46874, 46891, 46913, 36542, 36520, 46917, {36546, 0, 0, 0}, 205, 205, { 1252, 20273, 10000, 850, 0, ';' }},
-       {0x0C09, 0x0009, 257, 6, 46920, 46926, 46926, 46946, 36662, 36647, 46950, {36666, 0, 0, 0}, 206, 206, { 1252, 500, 10000, 850, 0, ',' }},
-       {0x0C0A, 0x000A, 257, 32, 46953, 46959, 46975, 46994, 36709, 36685, 41335, {36713, 0, 0, 0}, 207, 207, { 1252, 20284, 10000, 850, 0, ';' }},
-       {0x0C0C, 0x000C, 257, 18, 46998, 47004, 47020, 47039, 36809, 36785, 47043, {36813, 0, 0, 0}, 208, 208, { 1252, 20297, 10000, 850, 0, ';' }},
-       {0x0C3B, 0x003B, 257, 34, 47046, 47052, 47076, 47102, 47106, 38964, 41675, {0, 0, 0, 0}, 209, 209, { 1252, 20278, 10000, 850, 0, ';' }},
-       {0x1001, 0x0001, 257, 69, 47110, 47116, 47131, 47159, 36172, 36143, 47163, {36176, 0, 0, 0}, 210, 210, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x1004, 0x0004, 257, 100, 47166, 47172, 47204, 47223, 36373, 36377, 47227, {36380, 0, 0, 0}, 211, 211, { 936, 500, 10008, 936, 0, ',' }},
-       {0x1007, 0x0007, 257, 67, 47230, 47236, 47256, 47276, 36542, 36520, 47280, {36546, 0, 0, 0}, 212, 212, { 1252, 20273, 10000, 850, 0, ';' }},
-       {0x1009, 0x0009, 257, 18, 47283, 47289, 47289, 47306, 36662, 36647, 47043, {36666, 0, 0, 0}, 213, 213, { 1252, 37, 10000, 850, 0, ',' }},
-       {0x100A, 0x000A, 257, 41, 47310, 47316, 47336, 47357, 36709, 36685, 47361, {36713, 0, 0, 0}, 214, 214, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x100C, 0x000C, 257, 19, 47364, 47370, 47391, 47410, 36809, 36785, 13256, {36813, 0, 0, 0}, 215, 215, { 1252, 20297, 10000, 850, 0, ';' }},
-       {0x1401, 0x0001, 257, 28, 47414, 47420, 47437, 47469, 36172, 36143, 47473, {36176, 0, 0, 0}, 216, 216, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x1404, 0x7C04, 257, 74, 47476, 47482, 47521, 47558, 36373, 36377, 47562, {41389, 0, 0, 0}, 217, 217, { 950, 500, 10002, 950, 0, ',' }},
-       {0x1407, 0x0007, 257, 64, 47565, 47571, 47594, 47618, 36542, 36520, 47622, {36546, 0, 0, 0}, 218, 218, { 1252, 20273, 10000, 850, 0, ';' }},
-       {0x1409, 0x0009, 257, 83, 47625, 47631, 47631, 47653, 36662, 36647, 47657, {36666, 0, 0, 0}, 219, 219, { 1252, 500, 10000, 850, 0, ',' }},
-       {0x140A, 0x000A, 257, 23, 47660, 47666, 47687, 47709, 36709, 36685, 47713, {36713, 0, 0, 0}, 220, 220, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x140C, 0x000C, 257, 67, 47716, 47722, 47742, 47765, 36809, 36785, 47280, {36813, 0, 0, 0}, 221, 221, { 1252, 20297, 10000, 850, 0, ';' }},
-       {0x1801, 0x0001, 257, 70, 47769, 47775, 47792, 47822, 36172, 36143, 47826, {36176, 0, 0, 0}, 222, 222, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x1809, 0x0009, 257, 47, 47829, 47835, 47835, 47853, 36662, 36647, 46508, {36666, 0, 0, 0}, 223, 223, { 1252, 500, 10000, 850, 0, ',' }},
-       {0x180A, 0x000A, 257, 85, 47857, 47863, 47880, 47899, 36709, 36685, 47903, {36713, 0, 0, 0}, 224, 224, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x180C, 0x000C, 257, 71, 47906, 47912, 47928, 47947, 36809, 36785, 47951, {36813, 0, 0, 0}, 225, 225, { 1252, 20297, 10000, 850, 0, ';' }},
-       {0x181A, 0x701A, 257, 8, 47954, 47965, 48005, 48057, 48061, 48065, 48068, {48071, 0, 0, 0}, 226, 226, { 1250, 870, 10082, 852, 0, ';' }},
-       {0x1C01, 0x0001, 257, 107, 48094, 48100, 48117, 48143, 36172, 36143, 48147, {36176, 0, 0, 0}, 227, 227, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x1C09, 0x0009, 257, 118, 48150, 48156, 48156, 48179, 36662, 36647, 43562, {36666, 0, 0, 0}, 228, 228, { 1252, 500, 10000, 437, 0, ',' }},
-       {0x1C0A, 0x000A, 257, 27, 48183, 48189, 48218, 48251, 36709, 36685, 48255, {36713, 0, 0, 0}, 229, 229, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x1C1A, 0x6C1A, 257, 8, 48258, 48269, 48005, 48312, 48316, 48065, 48068, {38522, 0, 0, 0}, 230, 230, { 1251, 21025, 10007, 855, 0, ';' }},
-       {0x2001, 0x0001, 257, 84, 48320, 48326, 48340, 48368, 36172, 36143, 48372, {36176, 0, 0, 0}, 231, 231, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x2009, 0x0009, 257, 54, 48375, 48381, 48381, 48399, 36662, 36647, 48403, {36666, 0, 0, 0}, 232, 232, { 1252, 500, 10000, 850, 0, ',' }},
-       {0x200A, 0x000A, 257, 115, 48406, 48412, 48432, 48453, 36709, 36685, 48457, {36713, 0, 0, 0}, 233, 233, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x2401, 0x0001, 257, 117, 48460, 48466, 48481, 48509, 36172, 36143, 48513, {36176, 0, 0, 0}, 234, 234, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x240A, 0x000A, 257, 22, 48516, 48522, 48541, 48561, 36709, 36685, 48565, {36713, 0, 0, 0}, 235, 235, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x241A, 0x701A, 257, 95, 48568, 48579, 48603, 48631, 9238, 48065, 48635, {48071, 0, 0, 0}, 236, 236, { 1250, 500, 10029, 852, 0, ';' }},
-       {0x2801, 0x0001, 257, 104, 48638, 48644, 48659, 48687, 36172, 36143, 48691, {36176, 0, 0, 0}, 237, 237, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x2809, 0x0009, 257, 17, 48694, 48700, 48700, 48717, 36662, 36647, 48721, {36666, 0, 0, 0}, 238, 238, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x280A, 0x000A, 257, 86, 48724, 48730, 48745, 48762, 36709, 36685, 48766, {36713, 0, 0, 0}, 239, 239, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x281A, 0x6C1A, 257, 95, 48769, 48780, 48603, 48807, 9238, 48065, 48635, {38522, 0, 0, 0}, 240, 240, { 1251, 21025, 10007, 855, 0, ';' }},
-       {0x2C01, 0x0001, 257, 55, 48811, 48817, 48833, 48863, 36172, 36143, 48867, {36176, 0, 0, 0}, 241, 241, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x2C09, 0x0009, 257, 109, 48870, 48876, 48876, 48906, 36662, 36647, 48910, {36666, 0, 0, 0}, 242, 242, { 1252, 500, 10000, 850, 0, ';' }},
-       {0x2C0A, 0x000A, 257, 4, 48913, 48919, 48939, 48960, 36709, 36685, 48964, {36713, 0, 0, 0}, 243, 243, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x2C1A, 0x701A, 257, 72, 48967, 48978, 49006, 49039, 9238, 48065, 49043, {48071, 0, 0, 0}, 244, 244, { 1250, 500, 10029, 852, 0, ';' }},
-       {0x3001, 0x0001, 257, 63, 49046, 49052, 49069, 49097, 36172, 36143, 49101, {36176, 0, 0, 0}, 245, 245, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x3009, 0x0009, 257, 119, 49104, 49110, 49110, 49129, 36662, 36647, 49133, {36666, 0, 0, 0}, 246, 246, { 1252, 500, 10000, 437, 0, ',' }},
-       {0x300A, 0x000A, 257, 29, 49136, 49142, 49160, 49179, 36709, 36685, 49183, {36713, 0, 0, 0}, 247, 247, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x301A, 0x6C1A, 257, 72, 49186, 49197, 49006, 49228, 9238, 48065, 49043, {38522, 0, 0, 0}, 248, 248, { 1251, 21025, 10007, 855, 0, ';' }},
-       {0x3401, 0x0001, 257, 61, 49232, 49238, 49254, 49284, 36172, 36143, 49288, {36176, 0, 0, 0}, 249, 249, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x3409, 0x0009, 257, 87, 49291, 49297, 49297, 49319, 36662, 36647, 45394, {36666, 0, 0, 0}, 250, 250, { 1252, 500, 10000, 437, 0, ',' }},
-       {0x340A, 0x000A, 257, 20, 49323, 49329, 49345, 49362, 36709, 36685, 49366, {36713, 0, 0, 0}, 251, 251, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x3801, 0x0001, 257, 0, 49369, 49375, 49405, 49469, 36172, 36143, 49473, {36176, 0, 0, 0}, 252, 252, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x380A, 0x000A, 257, 113, 49476, 49482, 49500, 49519, 36709, 36685, 49523, {36713, 0, 0, 0}, 253, 253, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x3C01, 0x0001, 257, 12, 49526, 49532, 49549, 49581, 36172, 36143, 49585, {36176, 0, 0, 0}, 254, 254, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x3C0A, 0x000A, 257, 92, 49588, 49594, 49613, 49633, 36709, 36685, 49637, {36713, 0, 0, 0}, 255, 255, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x4001, 0x0001, 257, 93, 49640, 49646, 49661, 49685, 36172, 36143, 49689, {36176, 0, 0, 0}, 256, 256, { 1256, 20420, 10004, 720, 1, ';' }},
-       {0x4009, 0x0009, 257, 49, 49692, 49698, 49698, 49714, 36662, 36647, 43892, {36666, 0, 0, 0}, 257, 257, { 1252, 37, 10000, 437, 0, ',' }},
-       {0x400A, 0x000A, 257, 14, 49718, 49724, 49742, 49761, 36709, 36685, 49765, {36713, 0, 0, 0}, 258, 258, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x440A, 0x000A, 257, 103, 49768, 49774, 49796, 49819, 36709, 36685, 49823, {36713, 0, 0, 0}, 259, 259, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x4809, 0x0009, 257, 100, 49826, 49832, 49832, 49852, 36662, 36647, 47227, {36666, 0, 0, 0}, 260, 260, { 1252, 37, 10000, 437, 0, ',' }},
-       {0x480A, 0x000A, 257, 43, 49856, 49862, 49881, 49901, 36709, 36685, 49905, {36713, 0, 0, 0}, 261, 261, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x4C0A, 0x000A, 257, 79, 49908, 49914, 49934, 49955, 36709, 36685, 49959, {36713, 0, 0, 0}, 262, 262, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x500A, 0x000A, 257, 90, 49962, 49968, 49990, 50013, 36709, 36685, 50017, {36713, 0, 0, 0}, 263, 263, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x540A, 0x000A, 257, 112, 50020, 50026, 50050, 50076, 36709, 36685, 41634, {36713, 0, 0, 0}, 264, 264, { 1252, 20284, 10000, 850, 0, ',' }},
-       {0x6C1A, 0x7C1A, 257, -1, 50080, 50088, 50107, 48807, 9238, 48065, 0, {38522, 0, 0, 0}, 265, 265, { 1251, 21025, 10007, 855, 0, ';' }},
-       {0x701A, 0x7C1A, 257, -1, 50120, 50128, 50107, 48631, 9238, 48065, 0, {48071, 0, 0, 0}, 266, 266, { 1250, 500, 10029, 852, 0, ';' }},
-       {0x742C, 0x002C, 257, -1, 50144, 50152, 38393, 46466, 38411, 14514, 0, {38415, 0, 0, 0}, 267, 267, { 1251, 20880, 10007, 866, 0, ';' }},
-       {0x7804, 0x007F, 257, -1, 36377, 36341, 36362, 36369, 36373, 36377, 0, {36380, 0, 0, 0}, 268, 268, { 936, 500, 10008, 936, 0, ',' }},
-       {0x7814, 0x0014, 257, -1, 46314, 50175, 50193, 46306, 46310, 46314, 0, {36499, 0, 0, 0}, 269, 269, { 1252, 20277, 10000, 850, 0, ';' }},
-       {0x781A, 0x007F, 257, -1, 50201, 50204, 50212, 50221, 50225, 50201, 0, {48071, 0, 0, 0}, 270, 270, { 1250, 870, 10082, 852, 0, ';' }},
-       {0x782C, 0x002C, 257, -1, 50229, 50237, 38393, 38407, 38411, 14514, 0, {38415, 0, 0, 0}, 271, 271, { 1254, 20905, 10081, 857, 0, ';' }},
-       {0x7843, 0x0043, 257, -1, 50257, 50265, 39271, 39282, 39286, 39262, 0, {0, 0, 0, 0}, 272, 272, { 1251, 20880, 10007, 866, 0, ';' }},
-       {0x7850, 0x0050, 257, -1, 50282, 50290, 40147, 50311, 40164, 40134, 0, {0, 0, 0, 0}, 273, 273, { 1251, 20880, 10007, 866, 0, ';' }},
-       {0x7C04, 0x7C04, 257, -1, 50315, 50322, 36362, 41382, 36373, 36377, 0, {41389, 0, 0, 0}, 274, 274, { 950, 500, 10002, 950, 0, ',' }},
-       {0x7C04, 0x7804, 257, -1, 50351, 41344, 36362, 41382, 36373, 36377, 0, {41389, 0, 0, 0}, 275, 275, { 950, 500, 10002, 950, 0, ',' }},
-       {0x7C14, 0x0014, 257, -1, 37192, 50359, 50377, 37184, 37188, 37192, 0, {36499, 0, 0, 0}, 276, 276, { 1252, 20277, 10000, 850, 0, ';' }},
-       {0x7C1A, 0x007F, 257, -1, 48065, 50391, 50107, 50399, 9238, 48065, 0, {38522, 0, 0, 0}, 277, 277, { 1250, 500, 10029, 852, 0, ';' }},
-       {0x7C28, 0x0028, 257, -1, 50403, 50411, 0, 38236, 38240, 38227, 0, {0, 0, 0, 0}, 278, 278, { 1251, 20880, 10007, 866, 0, ';' }},
-       {0x7C43, 0x0043, 257, -1, 50428, 50436, 39271, 39282, 39286, 39262, 0, {0, 0, 0, 0}, 279, 279, { 1254, 500, 10029, 857, 0, ';' }},
-       {0x7C50, 0x0050, 257, -1, 50450, 50458, 40147, 46719, 40164, 40134, 0, {0, 0, 0, 0}, 280, 280, { 0, 500, 2, 1, 0, ',' }},
-       {0x7C5F, 0x005F, 257, -1, 50480, 50489, 40530, 40540, 40500, 40500, 0, {0, 0, 0, 0}, 281, 281, { 1252, 20297, 10000, 850, 0, ';' }},
-       {0x7C68, 0x0068, 257, -1, 50523, 50531, 40698, 40704, 40708, 40695, 0, {0, 0, 0, 0}, 282, 282, { 1252, 37, 10000, 437, 0, ',' }}
+       {0x0001, 0x007F, 768, -1, 36512, 36515, 36522, 36537, 36541, 36512, 0, {0, 0, 36545, 0}, 0, 0, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x0002, 0x007F, 257, -1, 36573, 36576, 36586, 36605, 36609, 36573, 0, {36613, 0, 0, 0}, 1, 1, { 1251, 21025, 10007, 866, 0, ';' }},
+       {0x0003, 0x007F, 257, -1, 36655, 36658, 36666, 36674, 36678, 36655, 0, {36682, 0, 0, 0}, 2, 2, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x0004, 0x0004, 257, -1, 36702, 36709, 36737, 36744, 36748, 36752, 0, {36755, 0, 0, 0}, 3, 3, { 936, 500, 10008, 936, 0, ',' }},
+       {0x0004, 0x7804, 257, -1, 36762, 36770, 36737, 36744, 36748, 36752, 0, {36755, 0, 0, 0}, 4, 4, { 936, 500, 10008, 936, 0, ',' }},
+       {0x0005, 0x007F, 257, -1, 36791, 36794, 36800, 36810, 36814, 36791, 0, {36818, 0, 0, 0}, 5, 5, { 1250, 500, 10029, 852, 0, ';' }},
+       {0x0006, 0x007F, 257, -1, 36844, 36847, 36854, 36860, 36864, 36844, 0, {36868, 0, 0, 0}, 6, 6, { 1252, 20277, 10000, 850, 0, ';' }},
+       {0x0007, 0x007F, 257, -1, 36889, 36892, 36899, 36907, 36911, 36889, 0, {36915, 0, 0, 0}, 7, 7, { 1252, 20273, 10000, 850, 0, ';' }},
+       {0x0008, 0x007F, 257, -1, 36940, 36943, 36949, 36966, 36970, 36940, 0, {36974, 0, 0, 0}, 8, 8, { 1253, 20273, 10006, 737, 0, ';' }},
+       {0x0009, 0x007F, 257, -1, 37016, 37019, 37019, 37027, 37031, 37016, 0, {37035, 0, 0, 0}, 9, 9, { 1252, 37, 10000, 437, 0, ',' }},
+       {0x000A, 0x007F, 257, -1, 37054, 37057, 37065, 37074, 37078, 37054, 0, {37082, 0, 0, 0}, 10, 10, { 1252, 20284, 10000, 850, 0, ';' }},
+       {0x000B, 0x007F, 257, -1, 37104, 37107, 37115, 37121, 37125, 37104, 0, {37129, 0, 0, 0}, 11, 11, { 1252, 20278, 10000, 850, 0, ';' }},
+       {0x000C, 0x007F, 257, -1, 37154, 37157, 37164, 37174, 37178, 37154, 0, {37182, 0, 0, 0}, 12, 12, { 1252, 20297, 10000, 850, 0, ';' }},
+       {0x000D, 0x007F, 257, -1, 37204, 37207, 37214, 37225, 37229, 37204, 0, {37233, 0, 0, 0}, 13, 13, { 1255, 500, 10005, 862, 1, ',' }},
+       {0x000E, 0x007F, 257, -1, 37266, 37269, 37279, 37286, 37290, 37266, 0, {37294, 0, 0, 0}, 14, 14, { 1250, 500, 10029, 852, 0, ';' }},
+       {0x000F, 0x007F, 257, -1, 37310, 37313, 37323, 37333, 37337, 37310, 0, {37341, 0, 0, 0}, 15, 15, { 1252, 20871, 10079, 850, 0, ';' }},
+       {0x0010, 0x007F, 257, -1, 37361, 37364, 37372, 37381, 37385, 37361, 0, {37082, 0, 0, 0}, 16, 16, { 1252, 20280, 10000, 850, 0, ';' }},
+       {0x0011, 0x007F, 257, -1, 37389, 37392, 37401, 37411, 37415, 37389, 0, {37419, 0, 0, 0}, 17, 17, { 932, 20290, 10001, 932, 0, ',' }},
+       {0x0012, 0x007F, 257, -1, 37446, 37449, 37456, 37466, 37470, 37446, 0, {37474, 0, 0, 0}, 18, 18, { 949, 20833, 10003, 949, 0, ',' }},
+       {0x0013, 0x007F, 257, -1, 37484, 37487, 37493, 37504, 37508, 37484, 0, {37512, 0, 0, 0}, 19, 19, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x0014, 0x007F, 257, -1, 37534, 37537, 37547, 37553, 37557, 37561, 0, {36868, 0, 0, 0}, 20, 20, { 1252, 20277, 10000, 850, 0, ';' }},
+       {0x0015, 0x007F, 257, -1, 37564, 37567, 37574, 37581, 37585, 37564, 0, {37589, 0, 0, 0}, 21, 21, { 1250, 20880, 10029, 852, 0, ';' }},
+       {0x0016, 0x007F, 257, -1, 37613, 37616, 37627, 37638, 37642, 37613, 0, {37646, 0, 0, 0}, 22, 22, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x0017, 0x007F, 257, -1, 37669, 37672, 37680, 37690, 37694, 37669, 0, {37698, 0, 0, 0}, 23, 23, { 1252, 20273, 10000, 850, 0, ';' }},
+       {0x0018, 0x007F, 257, -1, 37718, 37721, 37730, 37739, 37743, 37718, 0, {37747, 0, 0, 0}, 24, 24, { 1250, 20880, 10029, 852, 0, ';' }},
+       {0x0019, 0x007F, 257, -1, 37766, 37769, 37777, 37792, 37796, 37766, 0, {37800, 0, 0, 0}, 25, 25, { 1251, 20880, 10007, 866, 0, ';' }},
+       {0x001A, 0x007F, 257, -1, 37846, 37849, 37858, 37867, 37871, 37846, 0, {37875, 0, 0, 0}, 26, 26, { 1250, 500, 10082, 852, 0, ';' }},
+       {0x001B, 0x007F, 257, -1, 37898, 37901, 37908, 37920, 37924, 37898, 0, {37928, 0, 0, 0}, 27, 27, { 1250, 20880, 10029, 852, 0, ';' }},
+       {0x001C, 0x007F, 257, -1, 37952, 37955, 37964, 37970, 37974, 37952, 0, {0, 0, 0, 0}, 28, 28, { 1250, 20880, 10029, 852, 0, ';' }},
+       {0x001D, 0x007F, 257, -1, 37978, 37981, 37989, 37997, 38001, 37978, 0, {36868, 0, 0, 0}, 29, 29, { 1252, 20278, 10000, 850, 0, ';' }},
+       {0x001E, 0x007F, 512, -1, 38005, 38008, 38013, 38023, 38027, 38005, 0, {0, 38031, 0, 0}, 30, 30, { 874, 20838, 10021, 874, 0, ',' }},
+       {0x001F, 0x007F, 257, -1, 38062, 38065, 38073, 38082, 38086, 38062, 0, {38090, 0, 0, 0}, 31, 31, { 1254, 20905, 10081, 857, 0, ';' }},
+       {0x0020, 0x007F, 257, -1, 38104, 38107, 38112, 38121, 38125, 38104, 0, {38129, 0, 0, 0}, 32, 32, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x0021, 0x007F, 257, -1, 38159, 38162, 38173, 38190, 38194, 38159, 0, {38198, 0, 0, 0}, 33, 33, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x0022, 0x007F, 257, -1, 38217, 38220, 38230, 38251, 38255, 38217, 0, {38259, 0, 0, 0}, 34, 34, { 1251, 500, 10017, 866, 0, ';' }},
+       {0x0023, 0x007F, 257, -1, 38305, 38308, 38319, 38340, 38344, 38305, 0, {38348, 0, 0, 0}, 35, 35, { 1251, 500, 10007, 866, 0, ';' }},
+       {0x0024, 0x007F, 257, -1, 38390, 38393, 38403, 38417, 38421, 38390, 0, {38425, 0, 0, 0}, 36, 36, { 1250, 20880, 10029, 852, 0, ';' }},
+       {0x0025, 0x007F, 257, -1, 38447, 38450, 38459, 38465, 38469, 38447, 0, {38473, 0, 0, 0}, 37, 37, { 1257, 500, 10029, 775, 0, ';' }},
+       {0x0026, 0x007F, 257, -1, 38493, 38496, 38504, 38514, 38518, 38493, 0, {38522, 0, 0, 0}, 38, 38, { 1257, 500, 10029, 775, 0, ';' }},
+       {0x0027, 0x007F, 257, -1, 38541, 38544, 38555, 38565, 38569, 38541, 0, {38573, 0, 0, 0}, 39, 39, { 1257, 500, 10029, 775, 0, ';' }},
+       {0x0028, 0x007F, 257, -1, 38596, 38599, 0, 38605, 38609, 38596, 0, {0, 0, 0, 0}, 40, 40, { 1251, 20880, 10007, 866, 0, ';' }},
+       {0x0029, 0x007F, 257, -1, 38613, 38616, 38624, 38635, 38639, 38613, 0, {38643, 0, 0, 0}, 41, 41, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x002A, 0x007F, 257, -1, 38667, 38670, 38681, 38696, 4121, 38667, 0, {38700, 0, 0, 0}, 42, 42, { 1258, 500, 10000, 1258, 0, ',' }},
+       {0x002B, 0x007F, 257, -1, 38715, 38718, 38727, 38742, 38746, 38715, 0, {0, 0, 0, 0}, 43, 43, { 0, 500, 2, 1, 0, ',' }},
+       {0x002C, 0x007F, 257, -1, 14519, 38750, 38762, 38776, 38780, 14519, 0, {38784, 0, 0, 0}, 44, 44, { 1254, 20905, 10081, 857, 0, ';' }},
+       {0x002D, 0x007F, 257, -1, 38802, 38805, 38812, 38820, 38824, 38802, 0, {38828, 0, 0, 0}, 45, 45, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x002F, 0x007F, 257, -1, 38848, 38851, 38862, 38883, 38887, 38848, 0, {38891, 0, 0, 0}, 46, 46, { 1251, 500, 10007, 866, 0, ';' }},
+       {0x0032, 0x007F, 257, -1, 38935, 38938, 38945, 38954, 38958, 38935, 0, {0, 0, 0, 0}, 47, 47, { 1252, 500, 10000, 850, 0, ',' }},
+       {0x0034, 0x007F, 257, -1, 38962, 38965, 38971, 38980, 38984, 38962, 0, {0, 0, 0, 0}, 48, 48, { 1252, 500, 10000, 850, 0, ',' }},
+       {0x0035, 0x007F, 257, -1, 38988, 38991, 38996, 39004, 39008, 38988, 0, {39012, 0, 0, 0}, 49, 49, { 1252, 500, 10000, 850, 0, ',' }},
+       {0x0036, 0x007F, 257, -1, 39033, 39036, 39036, 39046, 39050, 39033, 0, {39054, 0, 0, 0}, 50, 50, { 1252, 500, 10000, 850, 0, ',' }},
+       {0x0037, 0x007F, 257, -1, 39074, 39077, 39086, 39108, 39112, 39074, 0, {39116, 0, 0, 0}, 51, 51, { 0, 500, 2, 1, 0, ';' }},
+       {0x0038, 0x007F, 257, -1, 39181, 39184, 39192, 39202, 39206, 39181, 0, {0, 0, 0, 0}, 52, 52, { 1252, 20277, 10079, 850, 0, ';' }},
+       {0x0039, 0x007F, 257, -1, 39210, 39213, 39219, 39238, 39242, 39210, 0, {39246, 0, 0, 0}, 53, 53, { 0, 500, 2, 1, 0, ',' }},
+       {0x003A, 0x007F, 257, -1, 39287, 39290, 39298, 39304, 39308, 39287, 0, {39312, 0, 0, 0}, 54, 54, { 0, 500, 2, 1, 0, ',' }},
+       {0x003B, 0x007F, 257, -1, 39333, 39336, 39350, 39367, 39371, 39333, 0, {0, 0, 0, 0}, 55, 55, { 1252, 20277, 10000, 850, 0, ';' }},
+       {0x003C, 0x007F, 257, -1, 39375, 39378, 39384, 39392, 39396, 39375, 0, {39400, 0, 0, 0}, 56, 56, { 1252, 500, 10000, 850, 0, ',' }},
+       {0x003E, 0x007F, 257, -1, 39421, 39424, 39430, 39444, 39448, 39421, 0, {39452, 0, 0, 0}, 57, 57, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x003F, 0x007F, 257, -1, 39469, 39472, 39479, 39499, 39503, 39469, 0, {39507, 0, 0, 0}, 58, 58, { 0, 500, 2, 1, 0, ';' }},
+       {0x0040, 0x007F, 257, -1, 39549, 39552, 39560, 39573, 39577, 39549, 0, {0, 0, 0, 0}, 59, 59, { 1251, 20880, 10007, 866, 0, ';' }},
+       {0x0041, 0x007F, 257, -1, 39581, 39584, 39592, 39602, 39606, 39581, 0, {39610, 0, 0, 0}, 60, 60, { 1252, 500, 10000, 437, 0, ',' }},
+       {0x0043, 0x007F, 257, -1, 39631, 39634, 39640, 39651, 39655, 39631, 0, {0, 0, 0, 0}, 61, 61, { 1254, 500, 10029, 857, 0, ';' }},
+       {0x0045, 0x007F, 257, -1, 39659, 39662, 39670, 39686, 39690, 39659, 0, {39694, 0, 0, 0}, 62, 62, { 0, 500, 2, 1, 0, ',' }},
+       {0x0046, 0x007F, 257, -1, 39759, 39762, 39770, 39789, 39793, 39759, 0, {0, 0, 0, 0}, 63, 63, { 0, 500, 2, 1, 0, ',' }},
+       {0x0047, 0x007F, 257, -1, 39797, 39800, 39809, 39831, 39835, 39797, 0, {39839, 0, 0, 0}, 64, 64, { 0, 500, 2, 1, 0, ',' }},
+       {0x0048, 0x007F, 257, -1, 14525, 39895, 39901, 39917, 39921, 14525, 0, {0, 0, 0, 0}, 65, 65, { 0, 500, 2, 1, 0, ',' }},
+       {0x0049, 0x007F, 257, -1, 39925, 39928, 39934, 39950, 39954, 39925, 0, {39958, 0, 0, 0}, 66, 66, { 0, 500, 2, 1, 0, ',' }},
+       {0x004A, 0x007F, 257, -1, 40023, 40026, 40033, 40052, 40056, 40023, 0, {40060, 0, 0, 0}, 67, 67, { 0, 500, 2, 1, 0, ',' }},
+       {0x004B, 0x007F, 257, -1, 35857, 40125, 40133, 40149, 40153, 35857, 0, {40157, 0, 0, 0}, 68, 68, { 0, 500, 2, 1, 0, ',' }},
+       {0x004C, 0x007F, 257, -1, 40228, 40231, 40241, 40260, 40264, 40228, 0, {40268, 0, 0, 0}, 69, 69, { 0, 500, 2, 1, 0, ',' }},
+       {0x004D, 0x007F, 257, -1, 14516, 40318, 40327, 40349, 40353, 14516, 0, {40357, 0, 0, 0}, 70, 70, { 0, 500, 2, 1, 0, ',' }},
+       {0x004E, 0x007F, 257, -1, 40410, 40413, 40421, 40437, 2565, 40410, 0, {40441, 0, 0, 0}, 71, 71, { 0, 500, 2, 1, 0, ',' }},
+       {0x0050, 0x007F, 257, -1, 40503, 40506, 40516, 40529, 40533, 40503, 0, {0, 0, 0, 0}, 72, 72, { 1251, 20880, 10007, 866, 0, ';' }},
+       {0x0051, 0x007F, 257, -1, 40537, 40540, 40548, 40573, 40577, 40537, 0, {0, 0, 0, 0}, 73, 73, { 0, 500, 2, 1, 0, ',' }},
+       {0x0052, 0x007F, 257, -1, 40581, 40584, 40590, 40598, 40602, 40581, 0, {0, 0, 0, 0}, 74, 74, { 1252, 20285, 10000, 850, 0, ',' }},
+       {0x0053, 0x007F, 257, -1, 40606, 40609, 40615, 40643, 40647, 40606, 0, {0, 0, 0, 0}, 75, 75, { 0, 500, 2, 1, 0, ',' }},
+       {0x0054, 0x007F, 257, -1, 40651, 40654, 40658, 40668, 40672, 40651, 0, {0, 0, 0, 0}, 76, 76, { 0, 500, 2, 1, 0, ',' }},
+       {0x0056, 0x007F, 257, -1, 40676, 40679, 40688, 40695, 40699, 40676, 0, {37082, 0, 0, 0}, 77, 77, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x0057, 0x007F, 257, -1, 40703, 40707, 40715, 40734, 40703, 40703, 0, {0, 0, 0, 0}, 78, 78, { 0, 500, 2, 1, 0, ',' }},
+       {0x005B, 0x007F, 257, -1, 40738, 40741, 40749, 40765, 40769, 40738, 0, {40773, 0, 0, 0}, 79, 79, { 0, 500, 2, 1, 0, ',' }},
+       {0x005E, 0x007F, 257, -1, 7865, 40795, 40803, 40816, 40820, 7865, 0, {40824, 0, 0, 0}, 80, 80, { 0, 500, 2, 1, 0, ';' }},
+       {0x005F, 0x007F, 257, -1, 40869, 40873, 40899, 40909, 40869, 40869, 0, {0, 0, 0, 0}, 81, 81, { 1252, 20297, 10000, 850, 0, ';' }},
+       {0x0061, 0x007F, 257, -1, 2059, 40913, 40920, 40939, 40943, 2059, 0, {40947, 0, 0, 0}, 82, 82, { 0, 500, 2, 1, 0, ',' }},
+       {0x0063, 0x007F, 1024, -1, 40997, 41000, 41007, 41016, 41020, 40997, 0, {0, 0, 0, 0}, 83, 83, { 0, 500, 2, 1, 1, ';' }},
+       {0x0064, 0x007F, 257, -1, 41024, 41028, 41028, 41037, 41024, 41024, 0, {41041, 0, 0, 0}, 84, 84, { 1252, 500, 10000, 437, 0, ',' }},
+       {0x0068, 0x007F, 257, -1, 41064, 41067, 41067, 41073, 41077, 41064, 0, {0, 0, 0, 0}, 85, 85, { 1252, 37, 10000, 437, 0, ',' }},
+       {0x006A, 0x007F, 257, -1, 41081, 41084, 41091, 41106, 41110, 41081, 0, {0, 0, 0, 0}, 86, 86, { 1252, 37, 10000, 437, 0, ',' }},
+       {0x006C, 0x007F, 257, -1, 41114, 41118, 41133, 41150, 41114, 41114, 0, {0, 0, 0, 0}, 87, 87, { 1252, 500, 10000, 850, 0, ',' }},
+       {0x006F, 0x007F, 257, -1, 41154, 41157, 41169, 41181, 41185, 41154, 0, {0, 0, 0, 0}, 88, 88, { 1252, 20277, 10000, 850, 0, ';' }},
+       {0x0070, 0x007F, 257, -1, 14510, 41189, 41189, 41194, 41198, 14510, 0, {0, 0, 0, 0}, 89, 89, { 1252, 37, 10000, 437, 0, ',' }},
+       {0x0078, 0x007F, 257, -1, 41202, 41205, 41216, 41226, 41230, 41202, 0, {41234, 0, 0, 0}, 90, 90, { 0, 500, 2, 1, 0, ',' }},
+       {0x007E, 0x007F, 257, -1, 41247, 41250, 41257, 41267, 41271, 41247, 0, {41275, 0, 0, 0}, 91, 91, { 1252, 20297, 10000, 850, 0, ';' }},
+       {0x0082, 0x007F, 257, -1, 41295, 41298, 41306, 41314, 41318, 41295, 0, {0, 0, 0, 0}, 92, 92, { 1252, 20297, 10000, 850, 0, ';' }},
+       {0x0084, 0x007F, 257, -1, 41322, 41326, 41339, 41358, 41322, 41322, 0, {41362, 0, 0, 0}, 93, 93, { 1252, 20297, 10000, 850, 0, ';' }},
+       {0x0085, 0x007F, 257, -1, 41387, 41391, 41397, 41415, 41387, 41387, 0, {0, 0, 0, 0}, 94, 94, { 1251, 20880, 10007, 866, 0, ';' }},
+       {0x0087, 0x007F, 257, -1, 41419, 41422, 41422, 41434, 41438, 41419, 0, {0, 0, 0, 0}, 95, 95, { 1252, 37, 10000, 437, 0, ';' }},
+       {0x0091, 0x007F, 257, -1, 41442, 41445, 41461, 41471, 41475, 41442, 0, {41479, 0, 0, 0}, 96, 96, { 1252, 20285, 10000, 850, 0, ',' }},
+       {0x0401, 0x0001, 768, 98, 41504, 41510, 41532, 36537, 36541, 36512, 13258, {0, 0, 36545, 0}, 97, 97, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x0402, 0x0002, 257, 11, 41596, 41602, 41623, 36605, 36609, 36573, 41661, {36613, 0, 0, 0}, 98, 98, { 1251, 21025, 10007, 866, 0, ';' }},
+       {0x0403, 0x0003, 257, 32, 41664, 41670, 41686, 36674, 36678, 36655, 41704, {36682, 0, 0, 0}, 99, 99, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x0404, 0x7C04, 257, 110, 41707, 41713, 41735, 41751, 36748, 36752, 41755, {41758, 0, 0, 0}, 100, 100, { 950, 500, 10002, 950, 0, ',' }},
+       {0x0405, 0x0005, 257, 24, 41765, 41771, 41794, 36810, 36814, 36791, 41824, {36818, 0, 0, 0}, 101, 101, { 1250, 500, 10029, 852, 0, ';' }},
+       {0x0406, 0x0006, 257, 26, 41827, 41833, 41850, 36860, 36864, 36844, 41866, {36868, 0, 0, 0}, 102, 102, { 1252, 20277, 10000, 850, 0, ';' }},
+       {0x0407, 0x0007, 257, 25, 41869, 41875, 41892, 36907, 36911, 36889, 41914, {36915, 0, 0, 0}, 103, 103, { 1252, 20273, 10000, 850, 0, ';' }},
+       {0x0408, 0x0008, 257, 40, 41917, 41923, 41938, 36966, 36970, 36940, 41970, {36974, 0, 0, 0}, 104, 104, { 1253, 20273, 10006, 737, 0, ';' }},
+       {0x0409, 0x0009, 257, 112, 41973, 41979, 41979, 37027, 37031, 37016, 42003, {37035, 0, 0, 0}, 105, 105, { 1252, 37, 10000, 437, 0, ',' }},
+       {0x040B, 0x000B, 257, 34, 42006, 42012, 42030, 37121, 37125, 37104, 42044, {37129, 0, 0, 0}, 106, 106, { 1252, 20278, 10000, 850, 0, ';' }},
+       {0x040C, 0x000C, 257, 36, 42047, 42053, 42069, 37174, 37178, 37154, 42088, {37182, 0, 0, 0}, 107, 107, { 1252, 20297, 10000, 850, 0, ';' }},
+       {0x040D, 0x000D, 257, 48, 42091, 42097, 42113, 37225, 37229, 37204, 42137, {37233, 0, 0, 0}, 108, 108, { 1255, 500, 10005, 862, 1, ',' }},
+       {0x040E, 0x000E, 257, 45, 42140, 42146, 42166, 37286, 37290, 37266, 42189, {37294, 0, 0, 0}, 109, 109, { 1250, 500, 10029, 852, 0, ';' }},
+       {0x040F, 0x000F, 257, 52, 42192, 42198, 42218, 37333, 37337, 37310, 42238, {37341, 0, 0, 0}, 110, 110, { 1252, 20871, 10079, 850, 0, ';' }},
+       {0x0410, 0x0010, 257, 53, 42241, 42247, 42263, 37381, 37385, 37361, 42281, {37082, 0, 0, 0}, 111, 111, { 1252, 20280, 10000, 850, 0, ';' }},
+       {0x0411, 0x0011, 257, 56, 42284, 42290, 42307, 37411, 37415, 37389, 42326, {37419, 0, 0, 0}, 112, 112, { 932, 20290, 10001, 932, 0, ',' }},
+       {0x0412, 0x0012, 257, 60, 42329, 42335, 42356, 37466, 37470, 37446, 42381, {37474, 0, 0, 0}, 113, 113, { 949, 20833, 10003, 949, 0, ',' }},
+       {0x0413, 0x0013, 257, 80, 42384, 42390, 42410, 37504, 37508, 37484, 42433, {37512, 0, 0, 0}, 114, 114, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x0414, 0x7C14, 257, 81, 42436, 42442, 42469, 37553, 37557, 37561, 42491, {36868, 0, 0, 0}, 115, 115, { 1252, 20277, 10000, 850, 0, ';' }},
+       {0x0415, 0x0015, 257, 89, 42494, 42500, 42516, 37581, 37585, 37564, 42532, {37589, 0, 0, 0}, 116, 116, { 1250, 20880, 10029, 852, 0, ';' }},
+       {0x0416, 0x0016, 257, 15, 42535, 42541, 42561, 37638, 37642, 37613, 42581, {37646, 0, 0, 0}, 117, 117, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x0417, 0x0017, 257, 19, 42584, 42590, 42612, 37690, 37694, 37669, 13261, {37698, 0, 0, 0}, 118, 118, { 1252, 20273, 10000, 850, 0, ';' }},
+       {0x0418, 0x0018, 257, 94, 42631, 42637, 42656, 37739, 37743, 37718, 42676, {37747, 0, 0, 0}, 119, 119, { 1250, 20880, 10029, 852, 0, ';' }},
+       {0x0419, 0x0019, 257, 96, 42679, 42685, 42702, 37792, 37796, 37766, 42732, {37800, 0, 0, 0}, 120, 120, { 1251, 20880, 10007, 866, 0, ';' }},
+       {0x041A, 0x001A, 257, 44, 42735, 42741, 42760, 37867, 37871, 37846, 42780, {37875, 0, 0, 0}, 121, 121, { 1250, 500, 10082, 852, 0, ';' }},
+       {0x041B, 0x001B, 257, 102, 42783, 42789, 42807, 37920, 37924, 37898, 42842, {37928, 0, 0, 0}, 122, 122, { 1250, 20880, 10029, 852, 0, ';' }},
+       {0x041C, 0x001C, 257, 2, 42845, 42851, 42870, 37970, 37974, 37952, 42889, {0, 0, 0, 0}, 123, 123, { 1250, 20880, 10029, 852, 0, ';' }},
+       {0x041D, 0x001D, 257, 99, 42892, 42898, 42915, 37997, 38001, 37978, 42933, {36868, 0, 0, 0}, 124, 124, { 1252, 20278, 10000, 850, 0, ';' }},
+       {0x041E, 0x001E, 512, 105, 42936, 42942, 42958, 38023, 38027, 38005, 42980, {0, 38031, 0, 0}, 125, 125, { 874, 20838, 10021, 874, 0, ',' }},
+       {0x041F, 0x001F, 257, 108, 42983, 42989, 43006, 38082, 38086, 38062, 43026, {38090, 0, 0, 0}, 126, 126, { 1254, 20905, 10081, 857, 0, ';' }},
+       {0x0420, 0x0020, 257, 88, 43029, 43035, 43051, 38121, 38125, 38104, 43077, {38129, 0, 0, 0}, 127, 127, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x0421, 0x0021, 257, 46, 43080, 43086, 43109, 38190, 38194, 38159, 43138, {38198, 0, 0, 0}, 128, 128, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x0422, 0x0022, 257, 111, 43141, 43147, 43167, 38251, 38255, 38217, 43205, {38259, 0, 0, 0}, 129, 129, { 1251, 500, 10017, 866, 0, ';' }},
+       {0x0423, 0x0023, 257, 16, 43208, 43214, 43235, 38340, 38344, 38305, 43275, {38348, 0, 0, 0}, 130, 130, { 1251, 500, 10007, 866, 0, ';' }},
+       {0x0424, 0x0024, 257, 101, 43278, 43284, 43305, 38417, 38421, 38390, 43331, {38425, 0, 0, 0}, 131, 131, { 1250, 20880, 10029, 852, 0, ';' }},
+       {0x0425, 0x0025, 257, 30, 43334, 43340, 43359, 38465, 38469, 38447, 43373, {38473, 0, 0, 0}, 132, 132, { 1257, 500, 10029, 775, 0, ';' }},
+       {0x0426, 0x0026, 257, 68, 43376, 43382, 43399, 38514, 38518, 38493, 43419, {38522, 0, 0, 0}, 133, 133, { 1257, 500, 10029, 775, 0, ';' }},
+       {0x0427, 0x0027, 257, 66, 43422, 43428, 43451, 38565, 38569, 38541, 43471, {38573, 0, 0, 0}, 134, 134, { 1257, 500, 10029, 775, 0, ';' }},
+       {0x0428, 0x7C28, 257, 106, 43474, 43485, 0, 38605, 38609, 38596, 43514, {0, 0, 0, 0}, 135, 135, { 1251, 20880, 10007, 866, 0, ';' }},
+       {0x0429, 0x0029, 257, 51, 43517, 43523, 43538, 38635, 38639, 38613, 43562, {38643, 0, 0, 0}, 136, 136, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x042A, 0x002A, 257, 116, 43565, 43571, 43592, 38696, 4121, 38667, 43620, {38700, 0, 0, 0}, 137, 137, { 1258, 500, 10000, 1258, 0, ',' }},
+       {0x042B, 0x002B, 257, 3, 43623, 43629, 43648, 38742, 38746, 38715, 3781, {0, 0, 0, 0}, 138, 138, { 0, 500, 2, 1, 0, ',' }},
+       {0x042C, 0x782C, 257, 7, 43713, 43724, 43756, 38776, 38780, 14519, 43784, {38784, 0, 0, 0}, 139, 139, { 1254, 20905, 10081, 857, 0, ';' }},
+       {0x042D, 0x002D, 257, 32, 43787, 43793, 43808, 38820, 38824, 38802, 41704, {38828, 0, 0, 0}, 140, 140, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x042F, 0x002F, 257, 73, 43827, 43833, 43856, 38883, 38887, 38848, 43900, {38891, 0, 0, 0}, 141, 141, { 1251, 500, 10007, 866, 0, ';' }},
+       {0x0432, 0x0032, 257, 118, 43903, 43909, 38945, 38954, 38958, 38935, 43931, {0, 0, 0, 0}, 142, 142, { 1252, 500, 10000, 850, 0, ',' }},
+       {0x0434, 0x0034, 257, 118, 43934, 43940, 38971, 38980, 38984, 38962, 43931, {0, 0, 0, 0}, 143, 143, { 1252, 500, 10000, 850, 0, ',' }},
+       {0x0435, 0x0035, 257, 118, 43961, 43967, 43987, 39004, 39008, 38988, 43931, {39012, 0, 0, 0}, 144, 144, { 1252, 500, 10000, 850, 0, ',' }},
+       {0x0436, 0x0036, 257, 118, 44015, 44021, 44046, 39046, 39050, 39033, 43931, {39054, 0, 0, 0}, 145, 145, { 1252, 500, 10000, 850, 0, ',' }},
+       {0x0437, 0x0037, 257, 38, 44070, 44076, 44095, 39108, 39112, 39074, 44150, {39116, 0, 0, 0}, 146, 146, { 0, 500, 2, 1, 0, ';' }},
+       {0x0438, 0x0038, 257, 35, 44153, 44159, 44183, 39202, 39206, 39181, 44204, {0, 0, 0, 0}, 147, 147, { 1252, 20277, 10079, 850, 0, ';' }},
+       {0x0439, 0x0039, 257, 49, 44207, 44213, 44227, 39238, 39242, 39210, 44261, {39246, 0, 0, 0}, 148, 148, { 0, 500, 2, 1, 0, ',' }},
+       {0x043A, 0x003A, 257, 75, 44264, 44270, 44286, 39304, 39308, 39287, 44300, {39312, 0, 0, 0}, 149, 149, { 0, 500, 2, 1, 0, ',' }},
+       {0x043B, 0x003B, 257, 81, 44303, 44309, 44332, 39367, 39371, 39333, 42491, {0, 0, 0, 0}, 150, 150, { 1252, 20277, 10000, 850, 0, ';' }},
+       {0x043E, 0x003E, 257, 77, 44357, 44363, 44380, 39444, 39448, 39421, 44405, {39452, 0, 0, 0}, 151, 151, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x0440, 0x0040, 257, 58, 44408, 44414, 44435, 39573, 39577, 39549, 44471, {0, 0, 0, 0}, 152, 152, { 1251, 20880, 10007, 866, 0, ';' }},
+       {0x0441, 0x0041, 257, 57, 44474, 44480, 44496, 39602, 39606, 39581, 44514, {39610, 0, 0, 0}, 153, 153, { 1252, 500, 10000, 437, 0, ',' }},
+       {0x0443, 0x7C43, 257, 114, 44517, 44528, 44554, 39651, 39655, 39631, 44588, {0, 0, 0, 0}, 154, 154, { 1254, 500, 10029, 857, 0, ';' }},
+       {0x0445, 0x0045, 257, 49, 44591, 44597, 44613, 39686, 39690, 39659, 44261, {39694, 0, 0, 0}, 155, 155, { 0, 500, 2, 1, 0, ',' }},
+       {0x0447, 0x0047, 257, 49, 44644, 44650, 44667, 39831, 39835, 39797, 44261, {39839, 0, 0, 0}, 156, 156, { 0, 500, 2, 1, 0, ',' }},
+       {0x0448, 0x0048, 257, 49, 44704, 44710, 44724, 39917, 39921, 14525, 44261, {0, 0, 0, 0}, 157, 157, { 0, 500, 2, 1, 0, ',' }},
+       {0x0449, 0x0049, 257, 49, 44755, 44761, 44775, 39950, 39954, 39925, 44261, {39958, 0, 0, 0}, 158, 158, { 0, 500, 2, 1, 0, ',' }},
+       {0x044A, 0x004A, 257, 49, 44815, 44821, 44836, 40052, 40056, 40023, 44261, {40060, 0, 0, 0}, 159, 159, { 0, 500, 2, 1, 0, ',' }},
+       {0x044B, 0x004B, 257, 49, 44883, 44889, 44905, 40149, 40153, 35857, 44261, {40157, 0, 0, 0}, 160, 160, { 0, 500, 2, 1, 0, ',' }},
+       {0x044C, 0x004C, 257, 49, 44936, 44942, 44960, 40260, 40264, 40228, 44261, {40268, 0, 0, 0}, 161, 161, { 0, 500, 2, 1, 0, ',' }},
+       {0x044D, 0x004D, 257, 49, 45000, 45006, 45023, 40349, 40353, 14516, 44261, {40357, 0, 0, 0}, 162, 162, { 0, 500, 2, 1, 0, ',' }},
+       {0x044E, 0x004E, 257, 49, 45060, 45066, 45082, 40437, 2565, 40410, 44261, {40441, 0, 0, 0}, 163, 163, { 0, 500, 2, 1, 0, ',' }},
+       {0x0451, 0x0051, 257, 21, 45113, 45119, 45135, 40573, 40577, 40537, 13340, {0, 0, 0, 0}, 164, 164, { 0, 500, 2, 1, 0, ',' }},
+       {0x0452, 0x0052, 257, 37, 45181, 45187, 45210, 40598, 40602, 40581, 45233, {0, 0, 0, 0}, 165, 165, { 1252, 20285, 10000, 850, 0, ',' }},
+       {0x0453, 0x0053, 257, 59, 45236, 45242, 45259, 40643, 40647, 40606, 45311, {0, 0, 0, 0}, 166, 166, { 0, 500, 2, 1, 0, ',' }},
+       {0x0454, 0x0054, 257, 62, 45314, 45320, 45331, 40668, 40672, 40651, 45353, {0, 0, 0, 0}, 167, 167, { 0, 500, 2, 1, 0, ',' }},
+       {0x0456, 0x0056, 257, 32, 45356, 45362, 45379, 40695, 40699, 40676, 41704, {37082, 0, 0, 0}, 168, 168, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x0457, 0x0057, 257, 49, 45396, 45403, 45419, 40734, 40703, 40703, 44261, {0, 0, 0, 0}, 169, 169, { 0, 500, 2, 1, 0, ',' }},
+       {0x045B, 0x005B, 257, 65, 45453, 45459, 45479, 40765, 40769, 40738, 45529, {40773, 0, 0, 0}, 170, 170, { 0, 500, 2, 1, 0, ',' }},
+       {0x045E, 0x005E, 257, 33, 45532, 45538, 45557, 40816, 40820, 7865, 45588, {40824, 0, 0, 0}, 171, 171, { 0, 500, 2, 1, 0, ';' }},
+       {0x0461, 0x0061, 257, 82, 45591, 45597, 45612, 40939, 40943, 2059, 45649, {40947, 0, 0, 0}, 172, 172, { 0, 500, 2, 1, 0, ',' }},
+       {0x0463, 0x0063, 1024, 1, 45652, 45658, 45679, 41016, 41020, 40997, 45709, {0, 0, 0, 0}, 173, 173, { 0, 500, 2, 1, 1, ';' }},
+       {0x0464, 0x0064, 257, 87, 45712, 45719, 45742, 41037, 41024, 41024, 45763, {41041, 0, 0, 0}, 174, 174, { 1252, 500, 10000, 437, 0, ',' }},
+       {0x0468, 0x7C68, 257, 78, 45766, 45777, 45800, 41073, 41077, 41064, 45817, {0, 0, 0, 0}, 175, 175, { 1252, 37, 10000, 437, 0, ',' }},
+       {0x046A, 0x006A, 257, 78, 45820, 45826, 45843, 41106, 41110, 41081, 45817, {0, 0, 0, 0}, 176, 176, { 1252, 37, 10000, 437, 0, ',' }},
+       {0x046C, 0x006C, 257, 118, 45889, 45896, 41133, 41150, 41114, 41114, 43931, {0, 0, 0, 0}, 177, 177, { 1252, 500, 10000, 850, 0, ',' }},
+       {0x046F, 0x006F, 257, 39, 45926, 45932, 45956, 41181, 41185, 41154, 45987, {0, 0, 0, 0}, 178, 178, { 1252, 20277, 10000, 850, 0, ';' }},
+       {0x0470, 0x0070, 257, 78, 45990, 45996, 45996, 41194, 41198, 14510, 45817, {0, 0, 0, 0}, 179, 179, { 1252, 37, 10000, 437, 0, ',' }},
+       {0x0478, 0x0078, 257, 21, 46011, 46017, 46036, 41226, 41230, 41202, 13340, {41234, 0, 0, 0}, 180, 180, { 0, 500, 2, 1, 0, ',' }},
+       {0x047E, 0x007E, 257, 36, 46055, 46061, 46077, 41267, 41271, 41247, 42088, {41275, 0, 0, 0}, 181, 181, { 1252, 20297, 10000, 850, 0, ';' }},
+       {0x0482, 0x0082, 257, 36, 46096, 46102, 46119, 41314, 41318, 41295, 42088, {0, 0, 0, 0}, 182, 182, { 1252, 20297, 10000, 850, 0, ';' }},
+       {0x0485, 0x0085, 257, 96, 46137, 46144, 41397, 41415, 41387, 41387, 42732, {0, 0, 0, 0}, 183, 183, { 1251, 20880, 10007, 866, 0, ';' }},
+       {0x0487, 0x0087, 257, 97, 46159, 46165, 46165, 41434, 41438, 41419, 46186, {0, 0, 0, 0}, 184, 184, { 1252, 37, 10000, 437, 0, ';' }},
+       {0x0491, 0x0091, 257, 37, 46189, 46195, 46228, 41471, 41475, 41442, 45233, {41479, 0, 0, 0}, 185, 185, { 1252, 20285, 10000, 850, 0, ',' }},
+       {0x0801, 0x0001, 257, 50, 46264, 46270, 46284, 46314, 36541, 36512, 46318, {36545, 0, 0, 0}, 186, 186, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x0804, 0x0004, 257, 21, 46321, 36770, 46327, 36744, 36748, 36752, 13340, {36755, 0, 0, 0}, 187, 187, { 936, 500, 10008, 936, 0, ',' }},
+       {0x0807, 0x0007, 257, 19, 46343, 46349, 46370, 46388, 36911, 36889, 13261, {36915, 0, 0, 0}, 188, 188, { 1252, 20273, 10000, 850, 0, ';' }},
+       {0x0809, 0x0009, 257, 37, 46392, 46398, 46398, 46423, 37031, 37016, 45233, {37035, 0, 0, 0}, 189, 189, { 1252, 20285, 10000, 850, 0, ',' }},
+       {0x080A, 0x000A, 257, 76, 46427, 46433, 46450, 46469, 37078, 37054, 46473, {37082, 0, 0, 0}, 190, 190, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x080C, 0x000C, 257, 10, 46476, 46482, 46499, 46520, 37178, 37154, 46524, {37182, 0, 0, 0}, 191, 191, { 1252, 20297, 10000, 850, 0, ';' }},
+       {0x0810, 0x0010, 257, 19, 46527, 46533, 46555, 46575, 37385, 37361, 13261, {37082, 0, 0, 0}, 192, 192, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x0813, 0x0013, 257, 10, 46579, 46585, 46601, 46622, 37508, 37484, 46524, {37512, 0, 0, 0}, 193, 193, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x0814, 0x7814, 257, 81, 46626, 46632, 46659, 46675, 46679, 46683, 42491, {36868, 0, 0, 0}, 194, 194, { 1252, 20277, 10000, 850, 0, ';' }},
+       {0x0816, 0x0016, 257, 91, 46686, 46692, 46714, 46736, 37642, 37613, 46740, {37646, 0, 0, 0}, 195, 195, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x081D, 0x001D, 257, 34, 46743, 46749, 46767, 46785, 38001, 37978, 42044, {36868, 0, 0, 0}, 196, 196, { 1252, 20278, 10000, 850, 0, ';' }},
+       {0x082C, 0x742C, 257, 7, 46789, 46800, 43756, 46835, 38780, 14519, 43784, {38784, 0, 0, 0}, 197, 197, { 1251, 20880, 10007, 866, 0, ';' }},
+       {0x083C, 0x003C, 257, 47, 46839, 46845, 46861, 39392, 39396, 39375, 46877, {39400, 0, 0, 0}, 198, 198, { 1252, 500, 10000, 850, 0, ',' }},
+       {0x083E, 0x003E, 257, 13, 46880, 46886, 46901, 46924, 39448, 39421, 46928, {39452, 0, 0, 0}, 199, 199, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x0843, 0x7843, 257, 114, 46931, 46942, 44554, 39651, 39655, 39631, 44588, {0, 0, 0, 0}, 200, 200, { 1251, 20880, 10007, 866, 0, ';' }},
+       {0x0845, 0x0045, 257, 9, 46971, 46977, 46998, 47041, 39690, 39659, 47045, {39694, 0, 0, 0}, 201, 201, { 0, 500, 2, 1, 0, ',' }},
+       {0x0850, 0x7C50, 257, 21, 47048, 47059, 40516, 47088, 40533, 40503, 13340, {0, 0, 0, 0}, 202, 202, { 0, 500, 2, 1, 0, ',' }},
+       {0x0C01, 0x0001, 257, 31, 47092, 47098, 47113, 47137, 36541, 36512, 47141, {36545, 0, 0, 0}, 203, 203, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x0C04, 0x7C04, 257, 42, 47144, 47150, 47193, 47230, 36748, 36752, 47234, {41758, 0, 0, 0}, 204, 204, { 950, 500, 10002, 950, 0, ',' }},
+       {0x0C07, 0x0007, 257, 5, 47237, 47243, 47260, 47282, 36911, 36889, 47286, {36915, 0, 0, 0}, 205, 205, { 1252, 20273, 10000, 850, 0, ';' }},
+       {0x0C09, 0x0009, 257, 6, 47289, 47295, 47295, 47315, 37031, 37016, 47319, {37035, 0, 0, 0}, 206, 206, { 1252, 500, 10000, 850, 0, ',' }},
+       {0x0C0A, 0x000A, 257, 32, 47322, 47328, 47344, 47363, 37078, 37054, 41704, {37082, 0, 0, 0}, 207, 207, { 1252, 20284, 10000, 850, 0, ';' }},
+       {0x0C0C, 0x000C, 257, 18, 47367, 47373, 47389, 47408, 37178, 37154, 47412, {37182, 0, 0, 0}, 208, 208, { 1252, 20297, 10000, 850, 0, ';' }},
+       {0x0C3B, 0x003B, 257, 34, 47415, 47421, 47445, 47471, 47475, 39333, 42044, {0, 0, 0, 0}, 209, 209, { 1252, 20278, 10000, 850, 0, ';' }},
+       {0x1001, 0x0001, 257, 69, 47479, 47485, 47500, 47528, 36541, 36512, 47532, {36545, 0, 0, 0}, 210, 210, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x1004, 0x0004, 257, 100, 47535, 47541, 47573, 47592, 36748, 36752, 47596, {36755, 0, 0, 0}, 211, 211, { 936, 500, 10008, 936, 0, ',' }},
+       {0x1007, 0x0007, 257, 67, 47599, 47605, 47625, 47645, 36911, 36889, 47649, {36915, 0, 0, 0}, 212, 212, { 1252, 20273, 10000, 850, 0, ';' }},
+       {0x1009, 0x0009, 257, 18, 47652, 47658, 47658, 47675, 37031, 37016, 47412, {37035, 0, 0, 0}, 213, 213, { 1252, 37, 10000, 850, 0, ',' }},
+       {0x100A, 0x000A, 257, 41, 47679, 47685, 47705, 47726, 37078, 37054, 47730, {37082, 0, 0, 0}, 214, 214, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x100C, 0x000C, 257, 19, 47733, 47739, 47760, 47779, 37178, 37154, 13261, {37182, 0, 0, 0}, 215, 215, { 1252, 20297, 10000, 850, 0, ';' }},
+       {0x1401, 0x0001, 257, 28, 47783, 47789, 47806, 47838, 36541, 36512, 47842, {36545, 0, 0, 0}, 216, 216, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x1404, 0x7C04, 257, 74, 47845, 47851, 47890, 47927, 36748, 36752, 47931, {41758, 0, 0, 0}, 217, 217, { 950, 500, 10002, 950, 0, ',' }},
+       {0x1407, 0x0007, 257, 64, 47934, 47940, 47963, 47987, 36911, 36889, 47991, {36915, 0, 0, 0}, 218, 218, { 1252, 20273, 10000, 850, 0, ';' }},
+       {0x1409, 0x0009, 257, 83, 47994, 48000, 48000, 48022, 37031, 37016, 48026, {37035, 0, 0, 0}, 219, 219, { 1252, 500, 10000, 850, 0, ',' }},
+       {0x140A, 0x000A, 257, 23, 48029, 48035, 48056, 48078, 37078, 37054, 48082, {37082, 0, 0, 0}, 220, 220, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x140C, 0x000C, 257, 67, 48085, 48091, 48111, 48134, 37178, 37154, 47649, {37182, 0, 0, 0}, 221, 221, { 1252, 20297, 10000, 850, 0, ';' }},
+       {0x1801, 0x0001, 257, 70, 48138, 48144, 48161, 48191, 36541, 36512, 48195, {36545, 0, 0, 0}, 222, 222, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x1809, 0x0009, 257, 47, 48198, 48204, 48204, 48222, 37031, 37016, 46877, {37035, 0, 0, 0}, 223, 223, { 1252, 500, 10000, 850, 0, ',' }},
+       {0x180A, 0x000A, 257, 85, 48226, 48232, 48249, 48268, 37078, 37054, 48272, {37082, 0, 0, 0}, 224, 224, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x180C, 0x000C, 257, 71, 48275, 48281, 48297, 48316, 37178, 37154, 48320, {37182, 0, 0, 0}, 225, 225, { 1252, 20297, 10000, 850, 0, ';' }},
+       {0x181A, 0x701A, 257, 8, 48323, 48334, 48374, 48426, 48430, 48434, 48437, {48440, 0, 0, 0}, 226, 226, { 1250, 870, 10082, 852, 0, ';' }},
+       {0x1C01, 0x0001, 257, 107, 48463, 48469, 48486, 48512, 36541, 36512, 48516, {36545, 0, 0, 0}, 227, 227, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x1C09, 0x0009, 257, 118, 48519, 48525, 48525, 48548, 37031, 37016, 43931, {37035, 0, 0, 0}, 228, 228, { 1252, 500, 10000, 437, 0, ',' }},
+       {0x1C0A, 0x000A, 257, 27, 48552, 48558, 48587, 48620, 37078, 37054, 48624, {37082, 0, 0, 0}, 229, 229, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x1C1A, 0x6C1A, 257, 8, 48627, 48638, 48374, 48681, 48685, 48434, 48437, {38891, 0, 0, 0}, 230, 230, { 1251, 21025, 10007, 855, 0, ';' }},
+       {0x2001, 0x0001, 257, 84, 48689, 48695, 48709, 48737, 36541, 36512, 48741, {36545, 0, 0, 0}, 231, 231, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x2009, 0x0009, 257, 54, 48744, 48750, 48750, 48768, 37031, 37016, 48772, {37035, 0, 0, 0}, 232, 232, { 1252, 500, 10000, 850, 0, ',' }},
+       {0x200A, 0x000A, 257, 115, 48775, 48781, 48801, 48822, 37078, 37054, 48826, {37082, 0, 0, 0}, 233, 233, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x2401, 0x0001, 257, 117, 48829, 48835, 48850, 48878, 36541, 36512, 48882, {36545, 0, 0, 0}, 234, 234, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x240A, 0x000A, 257, 22, 48885, 48891, 48910, 48930, 37078, 37054, 48934, {37082, 0, 0, 0}, 235, 235, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x241A, 0x701A, 257, 95, 48937, 48948, 48972, 49000, 9243, 48434, 49004, {48440, 0, 0, 0}, 236, 236, { 1250, 500, 10029, 852, 0, ';' }},
+       {0x2801, 0x0001, 257, 104, 49007, 49013, 49028, 49056, 36541, 36512, 49060, {36545, 0, 0, 0}, 237, 237, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x2809, 0x0009, 257, 17, 49063, 49069, 49069, 49086, 37031, 37016, 49090, {37035, 0, 0, 0}, 238, 238, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x280A, 0x000A, 257, 86, 49093, 49099, 49114, 49131, 37078, 37054, 49135, {37082, 0, 0, 0}, 239, 239, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x281A, 0x6C1A, 257, 95, 49138, 49149, 48972, 49176, 9243, 48434, 49004, {38891, 0, 0, 0}, 240, 240, { 1251, 21025, 10007, 855, 0, ';' }},
+       {0x2C01, 0x0001, 257, 55, 49180, 49186, 49202, 49232, 36541, 36512, 49236, {36545, 0, 0, 0}, 241, 241, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x2C09, 0x0009, 257, 109, 49239, 49245, 49245, 49275, 37031, 37016, 49279, {37035, 0, 0, 0}, 242, 242, { 1252, 500, 10000, 850, 0, ';' }},
+       {0x2C0A, 0x000A, 257, 4, 49282, 49288, 49308, 49329, 37078, 37054, 49333, {37082, 0, 0, 0}, 243, 243, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x2C1A, 0x701A, 257, 72, 49336, 49347, 49375, 49408, 9243, 48434, 49412, {48440, 0, 0, 0}, 244, 244, { 1250, 500, 10029, 852, 0, ';' }},
+       {0x3001, 0x0001, 257, 63, 49415, 49421, 49438, 49466, 36541, 36512, 49470, {36545, 0, 0, 0}, 245, 245, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x3009, 0x0009, 257, 119, 49473, 49479, 49479, 49498, 37031, 37016, 49502, {37035, 0, 0, 0}, 246, 246, { 1252, 500, 10000, 437, 0, ',' }},
+       {0x300A, 0x000A, 257, 29, 49505, 49511, 49529, 49548, 37078, 37054, 49552, {37082, 0, 0, 0}, 247, 247, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x301A, 0x6C1A, 257, 72, 49555, 49566, 49375, 49597, 9243, 48434, 49412, {38891, 0, 0, 0}, 248, 248, { 1251, 21025, 10007, 855, 0, ';' }},
+       {0x3401, 0x0001, 257, 61, 49601, 49607, 49623, 49653, 36541, 36512, 49657, {36545, 0, 0, 0}, 249, 249, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x3409, 0x0009, 257, 87, 49660, 49666, 49666, 49688, 37031, 37016, 45763, {37035, 0, 0, 0}, 250, 250, { 1252, 500, 10000, 437, 0, ',' }},
+       {0x340A, 0x000A, 257, 20, 49692, 49698, 49714, 49731, 37078, 37054, 49735, {37082, 0, 0, 0}, 251, 251, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x3801, 0x0001, 257, 0, 49738, 49744, 49774, 49838, 36541, 36512, 49842, {36545, 0, 0, 0}, 252, 252, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x380A, 0x000A, 257, 113, 49845, 49851, 49869, 49888, 37078, 37054, 49892, {37082, 0, 0, 0}, 253, 253, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x3C01, 0x0001, 257, 12, 49895, 49901, 49918, 49950, 36541, 36512, 49954, {36545, 0, 0, 0}, 254, 254, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x3C0A, 0x000A, 257, 92, 49957, 49963, 49982, 50002, 37078, 37054, 50006, {37082, 0, 0, 0}, 255, 255, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x4001, 0x0001, 257, 93, 50009, 50015, 50030, 50054, 36541, 36512, 50058, {36545, 0, 0, 0}, 256, 256, { 1256, 20420, 10004, 720, 1, ';' }},
+       {0x4009, 0x0009, 257, 49, 50061, 50067, 50067, 50083, 37031, 37016, 44261, {37035, 0, 0, 0}, 257, 257, { 1252, 37, 10000, 437, 0, ',' }},
+       {0x400A, 0x000A, 257, 14, 50087, 50093, 50111, 50130, 37078, 37054, 50134, {37082, 0, 0, 0}, 258, 258, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x440A, 0x000A, 257, 103, 50137, 50143, 50165, 50188, 37078, 37054, 50192, {37082, 0, 0, 0}, 259, 259, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x4809, 0x0009, 257, 100, 50195, 50201, 50201, 50221, 37031, 37016, 47596, {37035, 0, 0, 0}, 260, 260, { 1252, 37, 10000, 437, 0, ',' }},
+       {0x480A, 0x000A, 257, 43, 50225, 50231, 50250, 50270, 37078, 37054, 50274, {37082, 0, 0, 0}, 261, 261, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x4C0A, 0x000A, 257, 79, 50277, 50283, 50303, 50324, 37078, 37054, 50328, {37082, 0, 0, 0}, 262, 262, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x500A, 0x000A, 257, 90, 50331, 50337, 50359, 50382, 37078, 37054, 50386, {37082, 0, 0, 0}, 263, 263, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x540A, 0x000A, 257, 112, 50389, 50395, 50419, 50445, 37078, 37054, 42003, {37082, 0, 0, 0}, 264, 264, { 1252, 20284, 10000, 850, 0, ',' }},
+       {0x6C1A, 0x7C1A, 257, -1, 50449, 50457, 50476, 49176, 9243, 48434, 0, {38891, 0, 0, 0}, 265, 265, { 1251, 21025, 10007, 855, 0, ';' }},
+       {0x701A, 0x7C1A, 257, -1, 50489, 50497, 50476, 49000, 9243, 48434, 0, {48440, 0, 0, 0}, 266, 266, { 1250, 500, 10029, 852, 0, ';' }},
+       {0x742C, 0x002C, 257, -1, 50513, 50521, 38762, 46835, 38780, 14519, 0, {38784, 0, 0, 0}, 267, 267, { 1251, 20880, 10007, 866, 0, ';' }},
+       {0x7804, 0x007F, 257, -1, 36752, 36770, 36737, 36744, 36748, 36752, 0, {36755, 0, 0, 0}, 268, 268, { 936, 500, 10008, 936, 0, ',' }},
+       {0x7814, 0x0014, 257, -1, 46683, 50544, 50562, 46675, 46679, 46683, 0, {36868, 0, 0, 0}, 269, 269, { 1252, 20277, 10000, 850, 0, ';' }},
+       {0x781A, 0x007F, 257, -1, 50570, 50573, 50581, 50590, 50594, 50570, 0, {48440, 0, 0, 0}, 270, 270, { 1250, 870, 10082, 852, 0, ';' }},
+       {0x782C, 0x002C, 257, -1, 50598, 50606, 38762, 38776, 38780, 14519, 0, {38784, 0, 0, 0}, 271, 271, { 1254, 20905, 10081, 857, 0, ';' }},
+       {0x7843, 0x0043, 257, -1, 50626, 50634, 39640, 39651, 39655, 39631, 0, {0, 0, 0, 0}, 272, 272, { 1251, 20880, 10007, 866, 0, ';' }},
+       {0x7850, 0x0050, 257, -1, 50651, 50659, 40516, 50680, 40533, 40503, 0, {0, 0, 0, 0}, 273, 273, { 1251, 20880, 10007, 866, 0, ';' }},
+       {0x7C04, 0x7804, 257, -1, 50684, 41713, 36737, 41751, 36748, 36752, 0, {41758, 0, 0, 0}, 274, 274, { 950, 500, 10002, 950, 0, ',' }},
+       {0x7C04, 0x7C04, 257, -1, 50692, 50699, 36737, 41751, 36748, 36752, 0, {41758, 0, 0, 0}, 275, 275, { 950, 500, 10002, 950, 0, ',' }},
+       {0x7C14, 0x0014, 257, -1, 37561, 50728, 50746, 37553, 37557, 37561, 0, {36868, 0, 0, 0}, 276, 276, { 1252, 20277, 10000, 850, 0, ';' }},
+       {0x7C1A, 0x007F, 257, -1, 48434, 50760, 50476, 50768, 9243, 48434, 0, {38891, 0, 0, 0}, 277, 277, { 1250, 500, 10029, 852, 0, ';' }},
+       {0x7C28, 0x0028, 257, -1, 50772, 50780, 0, 38605, 38609, 38596, 0, {0, 0, 0, 0}, 278, 278, { 1251, 20880, 10007, 866, 0, ';' }},
+       {0x7C43, 0x0043, 257, -1, 50797, 50805, 39640, 39651, 39655, 39631, 0, {0, 0, 0, 0}, 279, 279, { 1254, 500, 10029, 857, 0, ';' }},
+       {0x7C50, 0x0050, 257, -1, 50819, 50827, 40516, 47088, 40533, 40503, 0, {0, 0, 0, 0}, 280, 280, { 0, 500, 2, 1, 0, ',' }},
+       {0x7C5F, 0x005F, 257, -1, 50849, 50858, 40899, 40909, 40869, 40869, 0, {0, 0, 0, 0}, 281, 281, { 1252, 20297, 10000, 850, 0, ';' }},
+       {0x7C68, 0x0068, 257, -1, 50892, 50900, 41067, 41073, 41077, 41064, 0, {0, 0, 0, 0}, 282, 282, { 1252, 37, 10000, 437, 0, ',' }}
 };
 
 
 static const CultureInfoNameEntry culture_name_entries [] = {
-       {38664, 50},     /* af */
-       {50545, 145},    /* af-za */
-       {7860, 80},      /* am */
-       {50551, 171},    /* am-et */
-       {36143, 0},      /* ar */
-       {50557, 252},    /* ar-ae */
-       {50563, 254},    /* ar-bh */
-       {50569, 216},    /* ar-dz */
-       {50575, 203},    /* ar-eg */
-       {50581, 186},    /* ar-iq */
-       {50587, 241},    /* ar-jo */
-       {50593, 249},    /* ar-kw */
-       {50599, 245},    /* ar-lb */
-       {50605, 210},    /* ar-ly */
-       {50611, 222},    /* ar-ma */
-       {50617, 231},    /* ar-om */
-       {50623, 256},    /* ar-qa */
-       {50629, 97},     /* ar-sa */
-       {50635, 237},    /* ar-sy */
-       {50641, 227},    /* ar-tn */
-       {50647, 234},    /* ar-ye */
-       {14511, 70},     /* as */
-       {50653, 162},    /* as-in */
-       {14514, 44},     /* az */
-       {50659, 267},    /* az-cyrl */
-       {50667, 197},    /* az-cyrl-az */
-       {50678, 271},    /* az-latn */
-       {50686, 139},    /* az-latn-az */
-       {37936, 35},     /* be */
-       {50697, 130},    /* be-by */
-       {36204, 1},      /* bg */
-       {50703, 98},     /* bg-bg */
-       {39290, 62},     /* bn */
-       {50709, 201},    /* bn-bd */
-       {50715, 155},    /* bn-in */
-       {40168, 73},     /* bo */
-       {50721, 164},    /* bo-cn */
-       {40878, 91},     /* br */
-       {50727, 181},    /* br-fr */
-       {50201, 270},    /* bs */
-       {36286, 2},      /* ca */
-       {50733, 99},     /* ca-es */
-       {36422, 5},      /* cs */
-       {50739, 101},    /* cs-cz */
-       {40212, 74},     /* cy */
-       {50745, 165},    /* cy-gb */
-       {36475, 6},      /* da */
-       {50751, 102},    /* da-dk */
-       {36520, 7},      /* de */
-       {50757, 205},    /* de-at */
-       {50763, 188},    /* de-ch */
-       {50769, 103},    /* de-de */
-       {50775, 218},    /* de-li */
-       {50781, 212},    /* de-lu */
-       {36571, 8},      /* el */
-       {50787, 104},    /* el-gr */
-       {36647, 9},      /* en */
-       {50793, 206},    /* en-au */
-       {50799, 238},    /* en-bz */
-       {50805, 213},    /* en-ca */
-       {50811, 189},    /* en-gb */
-       {50817, 223},    /* en-ie */
-       {50823, 257},    /* en-in */
-       {50829, 232},    /* en-jm */
-       {50835, 219},    /* en-nz */
-       {50841, 250},    /* en-ph */
-       {50847, 260},    /* en-sg */
-       {50853, 242},    /* en-tt */
-       {50859, 105},    /* en-us */
-       {50865, 228},    /* en-za */
-       {50871, 246},    /* en-zw */
-       {36685, 10},     /* es */
-       {50877, 243},    /* es-ar */
-       {50883, 258},    /* es-bo */
-       {50889, 251},    /* es-cl */
-       {50895, 235},    /* es-co */
-       {50901, 220},    /* es-cr */
-       {50907, 229},    /* es-do */
-       {50913, 247},    /* es-ec */
-       {50919, 207},    /* es-es */
-       {50925, 214},    /* es-gt */
-       {50931, 261},    /* es-hn */
-       {50937, 190},    /* es-mx */
-       {50943, 262},    /* es-ni */
-       {50949, 224},    /* es-pa */
-       {50955, 239},    /* es-pe */
-       {50961, 263},    /* es-pr */
-       {50967, 255},    /* es-py */
-       {50973, 259},    /* es-sv */
-       {50979, 264},    /* es-us */
-       {50985, 253},    /* es-uy */
-       {50991, 233},    /* es-ve */
-       {38078, 37},     /* et */
-       {50997, 132},    /* et-ee */
-       {38433, 45},     /* eu */
-       {51003, 140},    /* eu-es */
-       {38244, 41},     /* fa */
-       {51009, 136},    /* fa-ir */
-       {36735, 11},     /* fi */
-       {51015, 106},    /* fi-fi */
-       {40655, 84},     /* fil */
-       {51021, 174},    /* fil-ph */
-       {38812, 52},     /* fo */
-       {51028, 147},    /* fo-fo */
-       {36785, 12},     /* fr */
-       {51034, 191},    /* fr-be */
-       {51040, 208},    /* fr-ca */
-       {51046, 215},    /* fr-ch */
-       {51052, 107},    /* fr-fr */
-       {51058, 221},    /* fr-lu */
-       {51064, 225},    /* fr-mc */
-       {39006, 56},     /* ga */
-       {51070, 198},    /* ga-ie */
-       {41073, 96},     /* gd */
-       {51076, 185},    /* gd-gb */
-       {40307, 77},     /* gl */
-       {51082, 168},    /* gl-es */
-       {40953, 93},     /* gsw */
-       {39428, 64},     /* gu */
-       {51088, 156},    /* gu-in */
-       {40695, 85},     /* ha */
-       {51094, 282},    /* ha-latn */
-       {51102, 175},    /* ha-latn-ng */
-       {36835, 13},     /* he */
-       {51113, 108},    /* he-il */
-       {38841, 53},     /* hi */
-       {51119, 148},    /* hi-in */
-       {37477, 26},     /* hr */
-       {51125, 121},    /* hr-hr */
-       {36897, 14},     /* hu */
-       {51131, 109},    /* hu-hu */
-       {38346, 43},     /* hy */
-       {51137, 138},    /* hy-am */
-       {37790, 33},     /* id */
-       {51143, 128},    /* id-id */
-       {14505, 89},     /* ig */
-       {51149, 179},    /* ig-ng */
-       {40833, 90},     /* ii */
-       {51155, 180},    /* ii-cn */
-       {36941, 15},     /* is */
-       {51161, 110},    /* is-is */
-       {36992, 16},     /* it */
-       {51167, 192},    /* it-ch */
-       {51173, 111},    /* it-it */
-       {37020, 17},     /* ja */
-       {51179, 112},    /* ja-jp */
-       {38705, 51},     /* ka */
-       {51185, 146},    /* ka-ge */
-       {39100, 58},     /* kk */
-       {40785, 88},     /* kl */
-       {51191, 178},    /* kl-gl */
-       {40237, 75},     /* km */
-       {51197, 166},    /* km-kh */
-       {35582, 68},     /* kn */
-       {51203, 160},    /* kn-in */
-       {37077, 18},     /* ko */
-       {51209, 113},    /* ko-kr */
-       {40334, 78},     /* kok */
-       {51215, 169},    /* kok-in */
-       {39180, 59},     /* ky */
-       {51222, 152},    /* ky-kg */
-       {40282, 76},     /* lo */
-       {51228, 167},    /* lo-la */
-       {38172, 39},     /* lt */
-       {51234, 134},    /* lt-lt */
-       {38124, 38},     /* lv */
-       {51240, 133},    /* lv-lv */
-       {38479, 46},     /* mk */
-       {51246, 141},    /* mk-mk */
-       {39859, 69},     /* ml */
-       {51252, 161},    /* ml-in */
-       {40134, 72},     /* mn */
-       {51258, 273},    /* mn-cyrl */
-       {51266, 280},    /* mn-mong */
-       {51274, 202},    /* mn-mong-cn */
-       {40041, 71},     /* mr */
-       {51285, 163},    /* mr-in */
-       {39052, 57},     /* ms */
-       {51291, 199},    /* ms-bn */
-       {51297, 151},    /* ms-my */
-       {38918, 54},     /* mt */
-       {51303, 149},    /* mt-mt */
-       {37192, 276},    /* nb */
-       {51309, 115},    /* nb-no */
-       {2082, 82},      /* ne */
-       {51315, 172},    /* ne-np */
-       {37115, 19},     /* nl */
-       {51321, 193},    /* nl-be */
-       {51327, 114},    /* nl-nl */
-       {46314, 269},    /* nn */
-       {51333, 194},    /* nn-no */
-       {37165, 20},     /* no */
-       {40745, 87},     /* nso */
-       {51339, 177},    /* nso-za */
-       {40926, 92},     /* oc */
-       {51346, 182},    /* oc-fr */
-       {14520, 65},     /* or */
-       {51352, 157},    /* or-in */
-       {39390, 63},     /* pa */
-       {37195, 21},     /* pl */
-       {51358, 116},    /* pl-pl */
-       {40628, 83},     /* ps */
-       {51364, 173},    /* ps-af */
-       {37244, 22},     /* pt */
-       {51370, 117},    /* pt-br */
-       {51376, 195},    /* pt-pt */
-       {37300, 23},     /* rm */
-       {51382, 118},    /* rm-ch */
-       {37349, 24},     /* ro */
-       {51388, 119},    /* ro-ro */
-       {37397, 25},     /* ru */
-       {51394, 120},    /* ru-ru */
-       {41050, 95},     /* rw */
-       {51400, 184},    /* rw-rw */
-       {41018, 94},     /* sah */
-       {51406, 183},    /* sah-ru */
-       {38964, 55},     /* se */
-       {51413, 209},    /* se-fi */
-       {51419, 150},    /* se-no */
-       {40369, 79},     /* si */
-       {51425, 170},    /* si-lk */
-       {37529, 27},     /* sk */
-       {51431, 122},    /* sk-sk */
-       {38021, 36},     /* sl */
-       {51437, 131},    /* sl-si */
-       {37583, 28},     /* sq */
-       {51443, 123},    /* sq-al */
-       {48065, 277},    /* sr */
-       {51449, 265},    /* sr-cyrl */
-       {51457, 230},    /* sr-cyrl-ba */
-       {51468, 248},    /* sr-cyrl-me */
-       {51479, 240},    /* sr-cyrl-rs */
-       {51490, 266},    /* sr-latn */
-       {51498, 226},    /* sr-latn-ba */
-       {51509, 244},    /* sr-latn-me */
-       {51520, 236},    /* sr-latn-rs */
-       {37609, 29},     /* sv */
-       {51531, 196},    /* sv-fi */
-       {51537, 124},    /* sv-se */
-       {39212, 60},     /* sw */
-       {51543, 153},    /* sw-ke */
-       {39556, 66},     /* ta */
-       {51549, 158},    /* ta-in */
-       {39654, 67},     /* te */
-       {51555, 159},    /* te-in */
-       {38227, 40},     /* tg */
-       {51561, 278},    /* tg-cyrl */
-       {51569, 135},    /* tg-cyrl-tj */
-       {37636, 30},     /* th */
-       {51580, 125},    /* th-th */
-       {38566, 47},     /* tn */
-       {51586, 142},    /* tn-za */
-       {37693, 31},     /* tr */
-       {51592, 126},    /* tr-tr */
-       {40500, 81},     /* tzm */
-       {51598, 281},    /* tzm-latn */
-       {37848, 34},     /* uk */
-       {51607, 129},    /* uk-ua */
-       {37735, 32},     /* ur */
-       {51613, 127},    /* ur-pk */
-       {39262, 61},     /* uz */
-       {51619, 272},    /* uz-cyrl */
-       {51627, 200},    /* uz-cyrl-uz */
-       {51638, 279},    /* uz-latn */
-       {51646, 154},    /* uz-latn-uz */
-       {38298, 42},     /* vi */
-       {51657, 137},    /* vi-vn */
-       {38593, 48},     /* xh */
-       {51663, 143},    /* xh-za */
-       {40712, 86},     /* yo */
-       {51669, 176},    /* yo-ng */
-       {36377, 268},    /* zh */
-       {51675, 4},      /* zh-chs */
-       {51682, 274},    /* zh-cht */
-       {51689, 187},    /* zh-cn */
-       {51695, 3},      /* zh-hans */
-       {51703, 275},    /* zh-hant */
-       {51711, 204},    /* zh-hk */
-       {51717, 217},    /* zh-mo */
-       {51723, 211},    /* zh-sg */
-       {51729, 100},    /* zh-tw */
-       {38619, 49},     /* zu */
-       {51735, 144}     /* zu-za */
+       {39033, 50},     /* af */
+       {50914, 145},    /* af-za */
+       {7865, 80},      /* am */
+       {50920, 171},    /* am-et */
+       {36512, 0},      /* ar */
+       {50926, 252},    /* ar-ae */
+       {50932, 254},    /* ar-bh */
+       {50938, 216},    /* ar-dz */
+       {50944, 203},    /* ar-eg */
+       {50950, 186},    /* ar-iq */
+       {50956, 241},    /* ar-jo */
+       {50962, 249},    /* ar-kw */
+       {50968, 245},    /* ar-lb */
+       {50974, 210},    /* ar-ly */
+       {50980, 222},    /* ar-ma */
+       {50986, 231},    /* ar-om */
+       {50992, 256},    /* ar-qa */
+       {50998, 97},     /* ar-sa */
+       {51004, 237},    /* ar-sy */
+       {51010, 227},    /* ar-tn */
+       {51016, 234},    /* ar-ye */
+       {14516, 70},     /* as */
+       {51022, 162},    /* as-in */
+       {14519, 44},     /* az */
+       {51028, 267},    /* az-cyrl */
+       {51036, 197},    /* az-cyrl-az */
+       {51047, 271},    /* az-latn */
+       {51055, 139},    /* az-latn-az */
+       {38305, 35},     /* be */
+       {51066, 130},    /* be-by */
+       {36573, 1},      /* bg */
+       {51072, 98},     /* bg-bg */
+       {39659, 62},     /* bn */
+       {51078, 201},    /* bn-bd */
+       {51084, 155},    /* bn-in */
+       {40537, 73},     /* bo */
+       {51090, 164},    /* bo-cn */
+       {41247, 91},     /* br */
+       {51096, 181},    /* br-fr */
+       {50570, 270},    /* bs */
+       {36655, 2},      /* ca */
+       {51102, 99},     /* ca-es */
+       {36791, 5},      /* cs */
+       {51108, 101},    /* cs-cz */
+       {40581, 74},     /* cy */
+       {51114, 165},    /* cy-gb */
+       {36844, 6},      /* da */
+       {51120, 102},    /* da-dk */
+       {36889, 7},      /* de */
+       {51126, 205},    /* de-at */
+       {51132, 188},    /* de-ch */
+       {51138, 103},    /* de-de */
+       {51144, 218},    /* de-li */
+       {51150, 212},    /* de-lu */
+       {36940, 8},      /* el */
+       {51156, 104},    /* el-gr */
+       {37016, 9},      /* en */
+       {51162, 206},    /* en-au */
+       {51168, 238},    /* en-bz */
+       {51174, 213},    /* en-ca */
+       {51180, 189},    /* en-gb */
+       {51186, 223},    /* en-ie */
+       {51192, 257},    /* en-in */
+       {51198, 232},    /* en-jm */
+       {51204, 219},    /* en-nz */
+       {51210, 250},    /* en-ph */
+       {51216, 260},    /* en-sg */
+       {51222, 242},    /* en-tt */
+       {51228, 105},    /* en-us */
+       {51234, 228},    /* en-za */
+       {51240, 246},    /* en-zw */
+       {37054, 10},     /* es */
+       {51246, 243},    /* es-ar */
+       {51252, 258},    /* es-bo */
+       {51258, 251},    /* es-cl */
+       {51264, 235},    /* es-co */
+       {51270, 220},    /* es-cr */
+       {51276, 229},    /* es-do */
+       {51282, 247},    /* es-ec */
+       {51288, 207},    /* es-es */
+       {51294, 214},    /* es-gt */
+       {51300, 261},    /* es-hn */
+       {51306, 190},    /* es-mx */
+       {51312, 262},    /* es-ni */
+       {51318, 224},    /* es-pa */
+       {51324, 239},    /* es-pe */
+       {51330, 263},    /* es-pr */
+       {51336, 255},    /* es-py */
+       {51342, 259},    /* es-sv */
+       {51348, 264},    /* es-us */
+       {51354, 253},    /* es-uy */
+       {51360, 233},    /* es-ve */
+       {38447, 37},     /* et */
+       {51366, 132},    /* et-ee */
+       {38802, 45},     /* eu */
+       {51372, 140},    /* eu-es */
+       {38613, 41},     /* fa */
+       {51378, 136},    /* fa-ir */
+       {37104, 11},     /* fi */
+       {51384, 106},    /* fi-fi */
+       {41024, 84},     /* fil */
+       {51390, 174},    /* fil-ph */
+       {39181, 52},     /* fo */
+       {51397, 147},    /* fo-fo */
+       {37154, 12},     /* fr */
+       {51403, 191},    /* fr-be */
+       {51409, 208},    /* fr-ca */
+       {51415, 215},    /* fr-ch */
+       {51421, 107},    /* fr-fr */
+       {51427, 221},    /* fr-lu */
+       {51433, 225},    /* fr-mc */
+       {39375, 56},     /* ga */
+       {51439, 198},    /* ga-ie */
+       {41442, 96},     /* gd */
+       {51445, 185},    /* gd-gb */
+       {40676, 77},     /* gl */
+       {51451, 168},    /* gl-es */
+       {41322, 93},     /* gsw */
+       {39797, 64},     /* gu */
+       {51457, 156},    /* gu-in */
+       {41064, 85},     /* ha */
+       {51463, 282},    /* ha-latn */
+       {51471, 175},    /* ha-latn-ng */
+       {37204, 13},     /* he */
+       {51482, 108},    /* he-il */
+       {39210, 53},     /* hi */
+       {51488, 148},    /* hi-in */
+       {37846, 26},     /* hr */
+       {51494, 121},    /* hr-hr */
+       {37266, 14},     /* hu */
+       {51500, 109},    /* hu-hu */
+       {38715, 43},     /* hy */
+       {51506, 138},    /* hy-am */
+       {38159, 33},     /* id */
+       {51512, 128},    /* id-id */
+       {14510, 89},     /* ig */
+       {51518, 179},    /* ig-ng */
+       {41202, 90},     /* ii */
+       {51524, 180},    /* ii-cn */
+       {37310, 15},     /* is */
+       {51530, 110},    /* is-is */
+       {37361, 16},     /* it */
+       {51536, 192},    /* it-ch */
+       {51542, 111},    /* it-it */
+       {37389, 17},     /* ja */
+       {51548, 112},    /* ja-jp */
+       {39074, 51},     /* ka */
+       {51554, 146},    /* ka-ge */
+       {39469, 58},     /* kk */
+       {41154, 88},     /* kl */
+       {51560, 178},    /* kl-gl */
+       {40606, 75},     /* km */
+       {51566, 166},    /* km-kh */
+       {35857, 68},     /* kn */
+       {51572, 160},    /* kn-in */
+       {37446, 18},     /* ko */
+       {51578, 113},    /* ko-kr */
+       {40703, 78},     /* kok */
+       {51584, 169},    /* kok-in */
+       {39549, 59},     /* ky */
+       {51591, 152},    /* ky-kg */
+       {40651, 76},     /* lo */
+       {51597, 167},    /* lo-la */
+       {38541, 39},     /* lt */
+       {51603, 134},    /* lt-lt */
+       {38493, 38},     /* lv */
+       {51609, 133},    /* lv-lv */
+       {38848, 46},     /* mk */
+       {51615, 141},    /* mk-mk */
+       {40228, 69},     /* ml */
+       {51621, 161},    /* ml-in */
+       {40503, 72},     /* mn */
+       {51627, 273},    /* mn-cyrl */
+       {51635, 280},    /* mn-mong */
+       {51643, 202},    /* mn-mong-cn */
+       {40410, 71},     /* mr */
+       {51654, 163},    /* mr-in */
+       {39421, 57},     /* ms */
+       {51660, 199},    /* ms-bn */
+       {51666, 151},    /* ms-my */
+       {39287, 54},     /* mt */
+       {51672, 149},    /* mt-mt */
+       {37561, 276},    /* nb */
+       {51678, 115},    /* nb-no */
+       {2059, 82},      /* ne */
+       {51684, 172},    /* ne-np */
+       {37484, 19},     /* nl */
+       {51690, 193},    /* nl-be */
+       {51696, 114},    /* nl-nl */
+       {46683, 269},    /* nn */
+       {51702, 194},    /* nn-no */
+       {37534, 20},     /* no */
+       {41114, 87},     /* nso */
+       {51708, 177},    /* nso-za */
+       {41295, 92},     /* oc */
+       {51715, 182},    /* oc-fr */
+       {14525, 65},     /* or */
+       {51721, 157},    /* or-in */
+       {39759, 63},     /* pa */
+       {37564, 21},     /* pl */
+       {51727, 116},    /* pl-pl */
+       {40997, 83},     /* ps */
+       {51733, 173},    /* ps-af */
+       {37613, 22},     /* pt */
+       {51739, 117},    /* pt-br */
+       {51745, 195},    /* pt-pt */
+       {37669, 23},     /* rm */
+       {51751, 118},    /* rm-ch */
+       {37718, 24},     /* ro */
+       {51757, 119},    /* ro-ro */
+       {37766, 25},     /* ru */
+       {51763, 120},    /* ru-ru */
+       {41419, 95},     /* rw */
+       {51769, 184},    /* rw-rw */
+       {41387, 94},     /* sah */
+       {51775, 183},    /* sah-ru */
+       {39333, 55},     /* se */
+       {51782, 209},    /* se-fi */
+       {51788, 150},    /* se-no */
+       {40738, 79},     /* si */
+       {51794, 170},    /* si-lk */
+       {37898, 27},     /* sk */
+       {51800, 122},    /* sk-sk */
+       {38390, 36},     /* sl */
+       {51806, 131},    /* sl-si */
+       {37952, 28},     /* sq */
+       {51812, 123},    /* sq-al */
+       {48434, 277},    /* sr */
+       {51818, 265},    /* sr-cyrl */
+       {51826, 230},    /* sr-cyrl-ba */
+       {51837, 248},    /* sr-cyrl-me */
+       {51848, 240},    /* sr-cyrl-rs */
+       {51859, 266},    /* sr-latn */
+       {51867, 226},    /* sr-latn-ba */
+       {51878, 244},    /* sr-latn-me */
+       {51889, 236},    /* sr-latn-rs */
+       {37978, 29},     /* sv */
+       {51900, 196},    /* sv-fi */
+       {51906, 124},    /* sv-se */
+       {39581, 60},     /* sw */
+       {51912, 153},    /* sw-ke */
+       {39925, 66},     /* ta */
+       {51918, 158},    /* ta-in */
+       {40023, 67},     /* te */
+       {51924, 159},    /* te-in */
+       {38596, 40},     /* tg */
+       {51930, 278},    /* tg-cyrl */
+       {51938, 135},    /* tg-cyrl-tj */
+       {38005, 30},     /* th */
+       {51949, 125},    /* th-th */
+       {38935, 47},     /* tn */
+       {51955, 142},    /* tn-za */
+       {38062, 31},     /* tr */
+       {51961, 126},    /* tr-tr */
+       {40869, 81},     /* tzm */
+       {51967, 281},    /* tzm-latn */
+       {38217, 34},     /* uk */
+       {51976, 129},    /* uk-ua */
+       {38104, 32},     /* ur */
+       {51982, 127},    /* ur-pk */
+       {39631, 61},     /* uz */
+       {51988, 272},    /* uz-cyrl */
+       {51996, 200},    /* uz-cyrl-uz */
+       {52007, 279},    /* uz-latn */
+       {52015, 154},    /* uz-latn-uz */
+       {38667, 42},     /* vi */
+       {52026, 137},    /* vi-vn */
+       {38962, 48},     /* xh */
+       {52032, 143},    /* xh-za */
+       {41081, 86},     /* yo */
+       {52038, 176},    /* yo-ng */
+       {36752, 268},    /* zh */
+       {52044, 3},      /* zh-chs */
+       {52051, 275},    /* zh-cht */
+       {52058, 187},    /* zh-cn */
+       {52064, 4},      /* zh-hans */
+       {52072, 274},    /* zh-hant */
+       {52080, 204},    /* zh-hk */
+       {52086, 217},    /* zh-mo */
+       {52092, 211},    /* zh-sg */
+       {52098, 100},    /* zh-tw */
+       {38988, 49},     /* zu */
+       {52104, 144}     /* zu-za */
 };
 
 
 static const RegionInfoEntry region_entries [] = {
-       { 224,49473,46768,46768,51741,51762,36079,51809,51813,51841},
-       { 3,45340,51865,51865,51869,51881,35859,51900,51904,51919},
-       { 6,42520,51932,51932,51936,51944,35585,51955,51959,0},
-       { 7,3804,47822,47822,51972,51980,35659,52028,52032,0},
-       { 11,48964,47469,47469,52046,52046,35488,48687,52056,52071},
-       { 14,46917,52086,52086,52090,52098,35473,52110,52114,52114},
-       { 12,46950,52119,52119,52123,52123,35488,52133,52137,52137},
-       { 5,43415,38407,38407,52155,52166,35887,52178,52182,52200},
-       { 25,48068,52220,52220,52224,52247,35977,52284,52288,52324},
-       { 23,46676,52367,52367,52371,52382,35925,52407,52411,52428},
-       { 21,46155,37971,37971,52469,52477,35473,52110,52114,52486},
-       { 35,41292,36236,36236,52491,52500,35457,52517,52521,52535},
-       { 17,49585,52561,52561,52565,52573,36089,52588,52592,52607},
-       { 37,46559,52631,52631,52635,52635,35488,52642,52646,52660},
-       { 26,49765,52673,52673,52677,52677,36113,40204,52685,52704},
-       { 32,42212,52714,52714,52718,52725,35551,52732,52736,52751},
-       { 29,42906,52767,52767,52771,52779,0,52796,52800,52817},
-       { 24,48721,52849,52849,52853,52853,35488,52860,52864,52864},
-       { 39,47043,52878,52878,52882,52882,35488,52889,52893,52909},
-       { 223,13256,52925,52925,52929,52941,0,52948,52952,52964},
-       { 46,49366,52978,52978,52982,52982,35488,52988,52992,53005},
-       { 45,13335,53018,53018,53022,53028,35815,53047,53051,53064},
-       { 51,48565,53083,53083,53087,53087,35488,53096,53100,53115},
-       { 54,47713,53131,53131,53135,53135,35959,53146,53150,53169},
-       { 75,41455,53190,53190,53194,53209,35481,53227,53231,53253},
-       { 94,41545,36538,36538,53268,53276,35473,52110,52114,52114},
-       { 61,41497,53288,53288,53292,53300,35485,53308,53312,53325},
-       { 65,48255,53337,53337,53341,53360,35488,53382,53386,53401},
-       { 4,47473,53417,53417,53421,53429,35949,53444,53448,53463},
-       { 66,49183,53487,53487,53491,53491,35488,53499,53503,53513},
-       { 70,43004,50076,50076,53535,53543,35473,52110,52114,52486},
-       { 67,46772,53549,53549,53553,53559,35929,53566,53570,53585},
-       { 217,41335,36705,36705,53603,53609,35473,52110,52114,52486},
-       { 73,45219,53617,53617,53621,53630,35839,53646,53650,53665},
-       { 77,41675,36752,36752,53691,53699,35473,52110,52114,52486},
-       { 81,43835,53705,53705,53709,53723,35485,53308,53312,53732},
-       { 84,41719,36805,36805,53745,53745,35473,52110,52114,52486},
-       { 242,44864,53752,53752,53756,53771,35820,53784,53788,53811},
-       { 88,43781,53833,53833,53837,53845,0,53876,53880,53894},
-       { 93,45618,53929,53929,53933,53943,35485,53308,53312,53960},
-       { 98,41601,53978,53978,53982,53989,35473,52110,52114,54002},
-       { 99,47361,54011,54011,54015,54015,7769,54025,54029,54048},
-       { 104,46865,54069,54069,54073,54093,35488,54121,54125,54142},
-       { 106,49905,54149,54149,54153,54153,2494,54162,54166,54183},
-       { 108,42411,37498,37498,54202,54210,35582,54219,54223,54237},
-       { 109,41820,36917,36917,54242,54250,35503,54264,54268,54285},
-       { 111,42769,54299,54299,54303,54303,35608,54313,54317,54335},
-       { 68,46508,54352,54352,54356,54364,35473,52110,52114,52114},
-       { 117,41768,54370,54370,54374,54381,35499,54392,54396,54415},
-       { 113,43892,37821,37821,54422,54428,35665,54441,54445,54458},
-       { 121,45949,54493,54493,54497,54502,35898,54515,54519,54531},
-       { 116,43193,54553,54553,54557,54562,35651,54573,54577,54590},
-       { 110,41869,36964,36964,54610,54618,35485,54626,54630,54647},
-       { 118,41912,37012,37012,54663,54669,35473,52110,52114,52114},
-       { 124,48403,54676,54676,54680,54680,35488,54688,54692,54692},
-       { 126,48867,54708,54708,54712,54719,36049,54732,54736,54752},
-       { 122,41957,37042,37042,54774,54780,35477,54787,54791,54804},
-       { 129,44145,54814,54814,54818,54818,35679,54824,54828,54844},
-       { 130,44102,54862,54862,54866,54877,35672,54898,54902,0},
-       { 40,44942,40274,40274,54917,54926,35823,54948,54952,54967},
-       { 134,42012,37097,37097,54972,54984,35543,54997,55001,55018},
-       { 136,49288,55035,55035,55039,55046,36069,55059,55063,55077},
-       { 138,44984,40299,40299,55099,40289,35827,55104,55108,55120},
-       { 139,49101,55130,55130,55134,55142,36059,55153,55157,55172},
-       { 145,47622,55194,55194,55198,55198,0,52948,52952,55212},
-       { 42,45160,55230,55230,55234,55244,35831,55276,55280,55297},
-       { 141,43102,55332,55332,55336,55346,35648,55354,55358,55375},
-       { 147,47280,55381,55381,55385,55396,35473,52110,52114,52114},
-       { 140,43050,55406,55406,55410,55417,35631,55425,55429,55442},
-       { 148,47163,55456,55456,55460,55466,35939,55477,55481,55494},
-       { 159,47826,40068,40068,55514,55522,35963,55535,55539,55555},
-       { 158,47951,55575,55575,55579,55579,35473,52110,52114,52486},
-       { 270,49043,55586,55586,55590,55601,35473,52110,52114,55619},
-       { 19618,43531,55624,55624,55628,55638,0,55624,55659,55676},
-       { 151,47562,55708,55708,55712,55728,0,55756,55760,55776},
-       { 163,43931,38935,38935,55786,55786,35473,52110,52114,55792},
-       { 166,46104,55797,55797,55801,55808,35488,55816,55820,55833},
-       { 167,44036,55847,55847,55851,55851,35669,55860,55864,55882},
-       { 175,45448,55899,55899,55903,55911,35866,55920,55924,55939},
-       { 182,49959,55945,55945,55949,55949,36120,55959,55963,55983},
-       { 176,42064,37135,37135,56006,56018,35473,52110,52114,52114},
-       { 177,42122,37184,37184,56028,56035,35485,56041,56045,56061},
-       { 178,45280,56075,56075,56079,56085,35846,56101,56105,0},
-       { 183,47657,56120,56120,56124,56124,35488,56136,56140,56140},
-       { 164,48372,56159,56159,56163,56168,35996,56179,56183,56194},
-       { 192,47903,39420,39420,56214,56221,35973,56229,56233,56251},
-       { 187,48766,56268,56268,56272,56277,36037,56283,56287,56306},
-       { 201,45394,56324,56324,56328,56340,35862,56350,56354,56354},
-       { 190,42708,56370,56370,56374,56383,35603,56398,56402,56418},
-       { 191,42163,56446,56446,56450,56457,35547,56464,56468,56481},
-       { 202,50017,56495,56495,56499,56499,35488,53499,53503,53513},
-       { 193,46371,56511,56511,56515,56515,35473,52110,52114,52114},
-       { 185,49637,56524,56524,56528,56528,36099,56537,56541,56560},
-       { 197,49689,56579,56579,56583,56589,36103,56596,56600,56612},
-       { 200,42307,56630,56630,56634,56642,0,56651,56655,56668},
-       { 271,48635,50399,50399,56682,56689,36022,56702,56706,56720},
-       { 203,42363,37423,37423,56733,56740,35558,56753,56757,56771},
-       { 204,45817,56803,56803,56807,56807,35870,56814,56818,0},
-       { 205,13253,56832,56832,56836,56849,35401,56896,56900,56912},
-       { 221,42564,56932,56932,56936,56943,35485,56951,56955,56969},
-       { 215,47227,56982,56982,56986,56996,0,57006,57010,57027},
-       { 212,42962,57040,57040,57044,57053,35473,52110,52114,57063},
-       { 143,42473,57068,57068,57072,57081,35473,52110,52114,52114},
-       { 72,49823,38048,38048,57102,57102,36116,53499,53503,53513},
-       { 222,48691,57114,57114,57118,57124,36027,57135,57139,57152},
-       { 227,42611,37654,37654,57172,37644,35596,57181,57185,57195},
-       { 228,43145,57214,57214,57218,0,35672,57229,57233,57252},
-       { 234,48147,57265,57265,57269,57277,35980,57286,57290,57305},
-       { 235,42657,57326,57326,57330,57337,35600,57346,57350,57363},
-       { 225,48910,57377,57377,57381,57381,35488,57401,57405,57405},
-       { 237,41386,57432,57432,57436,57443,35873,57450,57454,57472},
-       { 241,42836,37882,37882,57482,57490,35611,57505,57509,57527},
-       { 244,41634,57561,57561,57565,57565,35488,53499,53503,53503},
-       { 246,49523,57579,57579,57583,57583,35488,57591,57595,57610},
-       { 247,44219,39282,39282,57624,57635,35892,57656,57660,57675},
-       { 249,48457,57694,57694,57698,57698,36006,57708,57712,57732},
-       { 251,43251,57752,57752,57756,57764,35655,57775,57779,57795},
-       { 261,48513,57803,57803,57807,57813,36012,57824,57828,57840},
-       { 209,43562,57858,57858,57862,0,10506,57875,57879,0},
-       { 264,49133,57898,57898,57902,57902,35488,53499,53503,53503}
+       { 224,49842,47137,47137,52110,52131,36448,52178,52182,52210},
+       { 3,45709,52234,52234,52238,52250,36228,52269,52273,52288},
+       { 6,42889,52301,52301,52305,52313,35860,52324,52328,0},
+       { 7,3781,48191,48191,52341,52349,36009,52397,52401,0},
+       { 11,49333,47838,47838,52415,52415,35586,49056,52425,52440},
+       { 14,47286,52455,52455,52459,52467,35481,52479,52483,52483},
+       { 12,47319,52488,52488,52492,52492,35586,52502,52506,52506},
+       { 5,43784,38776,38776,52524,52535,36256,52547,52551,52569},
+       { 25,48437,52589,52589,52593,52616,36346,52653,52657,52693},
+       { 23,47045,52736,52736,52740,52751,36294,52776,52780,52797},
+       { 21,46524,38340,38340,52838,52846,35481,52479,52483,52855},
+       { 35,41661,36605,36605,52860,52869,35465,52886,52890,52904},
+       { 17,49954,52930,52930,52934,52942,36458,52957,52961,52976},
+       { 37,46928,53000,53000,53004,53004,35586,53011,53015,53029},
+       { 26,50134,53042,53042,53046,53046,36482,40573,53054,53073},
+       { 32,42581,53083,53083,53087,53094,35751,53101,53105,53120},
+       { 29,43275,53136,53136,53140,53148,0,53165,53169,53186},
+       { 24,49090,53218,53218,53222,53222,35586,53229,53233,53233},
+       { 39,47412,53247,53247,53251,53251,35586,53258,53262,53278},
+       { 223,13261,53294,53294,53298,53310,0,53317,53321,53333},
+       { 46,49735,53347,53347,53351,53351,35586,53357,53361,53374},
+       { 45,13340,53387,53387,53391,53397,36184,53416,53420,53433},
+       { 51,48934,53452,53452,53456,53456,35586,53465,53469,53484},
+       { 54,48082,53500,53500,53504,53504,36328,53515,53519,53538},
+       { 75,41824,53559,53559,53563,53578,35506,53596,53600,53622},
+       { 94,41914,36907,36907,53637,53645,35481,52479,52483,52483},
+       { 61,41866,53657,53657,53661,53669,35534,53677,53681,53694},
+       { 65,48624,53706,53706,53710,53729,35586,53751,53755,53770},
+       { 4,47842,53786,53786,53790,53798,36318,53813,53817,53832},
+       { 66,49552,53856,53856,53860,53860,35586,53868,53872,53882},
+       { 70,43373,50445,50445,53904,53912,35481,52479,52483,52855},
+       { 67,47141,53918,53918,53922,53928,36298,53935,53939,53954},
+       { 217,41704,37074,37074,53972,53978,35481,52479,52483,52855},
+       { 73,45588,53986,53986,53990,53999,36208,54015,54019,54034},
+       { 77,42044,37121,37121,54060,54068,35481,52479,52483,52855},
+       { 81,44204,54074,54074,54078,54092,35534,53677,53681,54101},
+       { 84,42088,37174,37174,54114,54114,35481,52479,52483,52855},
+       { 242,45233,54121,54121,54125,54140,36189,54153,54157,54180},
+       { 88,44150,54202,54202,54206,54214,0,54245,54249,54263},
+       { 93,45987,54298,54298,54302,54312,35534,53677,53681,54329},
+       { 98,41970,54347,54347,54351,54358,35481,52479,52483,54371},
+       { 99,47730,54380,54380,54384,54384,7774,54394,54398,54417},
+       { 104,47234,54438,54438,54442,54462,35586,54490,54494,54511},
+       { 106,50274,54518,54518,54522,54522,2471,54531,54535,54552},
+       { 108,42780,37867,37867,54571,54579,35857,54588,54592,54606},
+       { 109,42189,37286,37286,54611,54619,35636,54633,54637,54654},
+       { 111,43138,54668,54668,54672,54672,35883,54682,54686,54704},
+       { 68,46877,54721,54721,54725,54733,35481,52479,52483,52483},
+       { 117,42137,54739,54739,54743,54750,35632,54761,54765,54784},
+       { 113,44261,38190,38190,54791,54797,36034,54810,54814,54827},
+       { 121,46318,54862,54862,54866,54871,36267,54884,54888,54900},
+       { 116,43562,54922,54922,54926,54931,36001,54942,54946,54959},
+       { 110,42238,37333,37333,54979,54987,35534,54995,54999,55016},
+       { 118,42281,37381,37381,55032,55038,35481,52479,52483,52483},
+       { 124,48772,55045,55045,55049,55049,35586,55057,55061,55061},
+       { 126,49236,55077,55077,55081,55088,36418,55101,55105,55121},
+       { 122,42326,37411,37411,55143,55149,35502,55156,55160,55173},
+       { 129,44514,55183,55183,55187,55187,36048,55193,55197,55213},
+       { 130,44471,55231,55231,55235,55246,36041,55267,55271,0},
+       { 40,45311,40643,40643,55286,55295,36192,55317,55321,55336},
+       { 134,42381,37466,37466,55341,55353,35686,55366,55370,55387},
+       { 136,49657,55404,55404,55408,55415,36438,55428,55432,55446},
+       { 138,45353,40668,40668,55468,40658,36196,55473,55477,55489},
+       { 139,49470,55499,55499,55503,55511,36428,55522,55526,55541},
+       { 145,47991,55563,55563,55567,55567,0,53317,53321,55581},
+       { 42,45529,55599,55599,55603,55613,36200,55645,55649,55666},
+       { 141,43471,55701,55701,55705,55715,35975,55723,55727,55744},
+       { 147,47649,55750,55750,55754,55765,35481,52479,52483,52483},
+       { 140,43419,55775,55775,55779,55786,35933,55794,55798,55811},
+       { 148,47532,55825,55825,55829,55835,36308,55846,55850,55863},
+       { 159,48195,40437,40437,55883,55891,36332,55904,55908,55924},
+       { 158,48320,55944,55944,55948,55948,35481,52479,52483,52855},
+       { 270,49412,55955,55955,55959,55970,35481,52479,52483,55988},
+       { 19618,43900,55993,55993,55997,56007,0,55993,56028,56045},
+       { 151,47931,56077,56077,56081,56097,0,56125,56129,56145},
+       { 163,44300,39304,39304,56155,56155,35481,52479,52483,56161},
+       { 166,46473,56166,56166,56170,56177,35586,56185,56189,56202},
+       { 167,44405,56216,56216,56220,56220,36038,56229,56233,56251},
+       { 175,45817,56268,56268,56272,56280,36235,56289,56293,56308},
+       { 182,50328,56314,56314,56318,56318,36489,56328,56332,56352},
+       { 176,42433,37504,37504,56375,56387,35481,52479,52483,52483},
+       { 177,42491,37553,37553,56397,56404,35534,56410,56414,56430},
+       { 178,45649,56444,56444,56448,56454,36215,56470,56474,0},
+       { 183,48026,56489,56489,56493,56493,35586,56505,56509,56509},
+       { 164,48741,56528,56528,56532,56537,36365,56548,56552,56563},
+       { 192,48272,39789,39789,56583,56590,36342,56598,56602,56620},
+       { 187,49135,56637,56637,56641,56646,36406,56652,56656,56675},
+       { 201,45763,56693,56693,56697,56709,36231,56719,56723,56723},
+       { 190,43077,56739,56739,56743,56752,35878,56767,56771,56787},
+       { 191,42532,56815,56815,56819,56826,35709,56833,56837,56850},
+       { 202,50386,56864,56864,56868,56868,35586,53868,53872,53882},
+       { 193,46740,56880,56880,56884,56884,35481,52479,52483,52483},
+       { 185,50006,56893,56893,56897,56897,36468,56906,56910,56929},
+       { 197,50058,56948,56948,56952,56958,36472,56965,56969,56981},
+       { 200,42676,56999,56999,57003,57011,0,57020,57024,57037},
+       { 271,49004,50768,50768,57051,57058,36391,57071,57075,57089},
+       { 203,42732,37792,37792,57102,57109,35778,57122,57126,57140},
+       { 204,46186,57172,57172,57176,57176,36239,57183,57187,0},
+       { 205,13258,57201,57201,57205,57218,35409,57265,57269,57281},
+       { 221,42933,57301,57301,57305,57312,35534,57320,57324,57338},
+       { 215,47596,57351,57351,57355,57365,0,57375,57379,57396},
+       { 212,43331,57409,57409,57413,57422,35481,52479,52483,57432},
+       { 143,42842,57437,57437,57441,57450,35481,52479,52483,52483},
+       { 72,50192,38417,38417,57471,57471,36485,53868,53872,53882},
+       { 222,49060,57483,57483,57487,57493,36396,57504,57508,57521},
+       { 227,42980,38023,38023,57541,38013,35871,57550,57554,57564},
+       { 228,43514,57583,57583,57587,0,36041,57598,57602,57621},
+       { 234,48516,57634,57634,57638,57646,36349,57655,57659,57674},
+       { 235,43026,57695,57695,57699,57706,35875,57715,57719,57732},
+       { 225,49279,57746,57746,57750,57750,35586,57770,57774,57774},
+       { 237,41755,57801,57801,57805,57812,36242,57819,57823,57841},
+       { 241,43205,38251,38251,57851,57859,35886,57874,57878,57896},
+       { 244,42003,57930,57930,57934,57934,35586,53868,53872,53872},
+       { 246,49892,57948,57948,57952,57952,35586,57960,57964,57979},
+       { 247,44588,39651,39651,57993,58004,36261,58025,58029,58044},
+       { 249,48826,58063,58063,58067,58067,36375,58077,58081,58101},
+       { 251,43620,58121,58121,58125,58133,36005,58144,58148,58164},
+       { 261,48882,58172,58172,58176,58182,36381,58193,58197,58209},
+       { 209,43931,58227,58227,58231,0,10511,58244,58248,0},
+       { 264,49502,58267,58267,58271,58271,35586,53868,53872,53872}
 };
 
 
 static const RegionInfoNameEntry region_name_entries [] = {
-       {49473, 0},      /* AE */
-       {45340, 1},      /* AF */
-       {42520, 2},      /* AL */
-       {3804, 3},       /* AM */
-       {48964, 4},      /* AR */
-       {46917, 5},      /* AT */
-       {46950, 6},      /* AU */
-       {43415, 7},      /* AZ */
-       {48068, 8},      /* BA */
-       {46676, 9},      /* BD */
-       {46155, 10},     /* BE */
-       {41292, 11},     /* BG */
-       {49585, 12},     /* BH */
-       {46559, 13},     /* BN */
-       {49765, 14},     /* BO */
-       {42212, 15},     /* BR */
-       {42906, 16},     /* BY */
-       {48721, 17},     /* BZ */
-       {47043, 18},     /* CA */
-       {13256, 19},     /* CH */
-       {49366, 20},     /* CL */
-       {13335, 21},     /* CN */
-       {48565, 22},     /* CO */
-       {47713, 23},     /* CR */
-       {41455, 24},     /* CZ */
-       {41545, 25},     /* DE */
-       {41497, 26},     /* DK */
-       {48255, 27},     /* DO */
-       {47473, 28},     /* DZ */
-       {49183, 29},     /* EC */
-       {43004, 30},     /* EE */
-       {46772, 31},     /* EG */
-       {41335, 32},     /* ES */
-       {45219, 33},     /* ET */
-       {41675, 34},     /* FI */
-       {43835, 35},     /* FO */
-       {41719, 36},     /* FR */
-       {44864, 37},     /* GB */
-       {43781, 38},     /* GE */
-       {45618, 39},     /* GL */
-       {41601, 40},     /* GR */
-       {47361, 41},     /* GT */
-       {46865, 42},     /* HK */
-       {49905, 43},     /* HN */
-       {42411, 44},     /* HR */
-       {41820, 45},     /* HU */
-       {42769, 46},     /* ID */
-       {46508, 47},     /* IE */
-       {41768, 48},     /* IL */
-       {43892, 49},     /* IN */
-       {45949, 50},     /* IQ */
-       {43193, 51},     /* IR */
-       {41869, 52},     /* IS */
-       {41912, 53},     /* IT */
-       {48403, 54},     /* JM */
-       {48867, 55},     /* JO */
-       {41957, 56},     /* JP */
-       {44145, 57},     /* KE */
-       {44102, 58},     /* KG */
-       {44942, 59},     /* KH */
-       {42012, 60},     /* KR */
-       {49288, 61},     /* KW */
-       {44984, 62},     /* LA */
-       {49101, 63},     /* LB */
-       {47622, 64},     /* LI */
-       {45160, 65},     /* LK */
-       {43102, 66},     /* LT */
-       {47280, 67},     /* LU */
-       {43050, 68},     /* LV */
-       {47163, 69},     /* LY */
-       {47826, 70},     /* MA */
-       {47951, 71},     /* MC */
-       {49043, 72},     /* ME */
-       {43531, 73},     /* MK */
-       {47562, 74},     /* MO */
-       {43931, 75},     /* MT */
-       {46104, 76},     /* MX */
-       {44036, 77},     /* MY */
-       {45448, 78},     /* NG */
-       {49959, 79},     /* NI */
-       {42064, 80},     /* NL */
-       {42122, 81},     /* NO */
-       {45280, 82},     /* NP */
-       {47657, 83},     /* NZ */
-       {48372, 84},     /* OM */
-       {47903, 85},     /* PA */
-       {48766, 86},     /* PE */
-       {45394, 87},     /* PH */
-       {42708, 88},     /* PK */
-       {42163, 89},     /* PL */
-       {50017, 90},     /* PR */
-       {46371, 91},     /* PT */
-       {49637, 92},     /* PY */
-       {49689, 93},     /* QA */
-       {42307, 94},     /* RO */
-       {48635, 95},     /* RS */
-       {42363, 96},     /* RU */
-       {45817, 97},     /* RW */
-       {13253, 98},     /* SA */
-       {42564, 99},     /* SE */
-       {47227, 100},    /* SG */
-       {42962, 101},    /* SI */
-       {42473, 102},    /* SK */
-       {49823, 103},    /* SV */
-       {48691, 104},    /* SY */
-       {42611, 105},    /* TH */
-       {43145, 106},    /* TJ */
-       {48147, 107},    /* TN */
-       {42657, 108},    /* TR */
-       {48910, 109},    /* TT */
-       {41386, 110},    /* TW */
-       {42836, 111},    /* UA */
-       {41634, 112},    /* US */
-       {49523, 113},    /* UY */
-       {44219, 114},    /* UZ */
-       {48457, 115},    /* VE */
-       {43251, 116},    /* VN */
-       {48513, 117},    /* YE */
-       {43562, 118},    /* ZA */
-       {49133, 119}     /* ZW */
+       {49842, 0},      /* AE */
+       {45709, 1},      /* AF */
+       {42889, 2},      /* AL */
+       {3781, 3},       /* AM */
+       {49333, 4},      /* AR */
+       {47286, 5},      /* AT */
+       {47319, 6},      /* AU */
+       {43784, 7},      /* AZ */
+       {48437, 8},      /* BA */
+       {47045, 9},      /* BD */
+       {46524, 10},     /* BE */
+       {41661, 11},     /* BG */
+       {49954, 12},     /* BH */
+       {46928, 13},     /* BN */
+       {50134, 14},     /* BO */
+       {42581, 15},     /* BR */
+       {43275, 16},     /* BY */
+       {49090, 17},     /* BZ */
+       {47412, 18},     /* CA */
+       {13261, 19},     /* CH */
+       {49735, 20},     /* CL */
+       {13340, 21},     /* CN */
+       {48934, 22},     /* CO */
+       {48082, 23},     /* CR */
+       {41824, 24},     /* CZ */
+       {41914, 25},     /* DE */
+       {41866, 26},     /* DK */
+       {48624, 27},     /* DO */
+       {47842, 28},     /* DZ */
+       {49552, 29},     /* EC */
+       {43373, 30},     /* EE */
+       {47141, 31},     /* EG */
+       {41704, 32},     /* ES */
+       {45588, 33},     /* ET */
+       {42044, 34},     /* FI */
+       {44204, 35},     /* FO */
+       {42088, 36},     /* FR */
+       {45233, 37},     /* GB */
+       {44150, 38},     /* GE */
+       {45987, 39},     /* GL */
+       {41970, 40},     /* GR */
+       {47730, 41},     /* GT */
+       {47234, 42},     /* HK */
+       {50274, 43},     /* HN */
+       {42780, 44},     /* HR */
+       {42189, 45},     /* HU */
+       {43138, 46},     /* ID */
+       {46877, 47},     /* IE */
+       {42137, 48},     /* IL */
+       {44261, 49},     /* IN */
+       {46318, 50},     /* IQ */
+       {43562, 51},     /* IR */
+       {42238, 52},     /* IS */
+       {42281, 53},     /* IT */
+       {48772, 54},     /* JM */
+       {49236, 55},     /* JO */
+       {42326, 56},     /* JP */
+       {44514, 57},     /* KE */
+       {44471, 58},     /* KG */
+       {45311, 59},     /* KH */
+       {42381, 60},     /* KR */
+       {49657, 61},     /* KW */
+       {45353, 62},     /* LA */
+       {49470, 63},     /* LB */
+       {47991, 64},     /* LI */
+       {45529, 65},     /* LK */
+       {43471, 66},     /* LT */
+       {47649, 67},     /* LU */
+       {43419, 68},     /* LV */
+       {47532, 69},     /* LY */
+       {48195, 70},     /* MA */
+       {48320, 71},     /* MC */
+       {49412, 72},     /* ME */
+       {43900, 73},     /* MK */
+       {47931, 74},     /* MO */
+       {44300, 75},     /* MT */
+       {46473, 76},     /* MX */
+       {44405, 77},     /* MY */
+       {45817, 78},     /* NG */
+       {50328, 79},     /* NI */
+       {42433, 80},     /* NL */
+       {42491, 81},     /* NO */
+       {45649, 82},     /* NP */
+       {48026, 83},     /* NZ */
+       {48741, 84},     /* OM */
+       {48272, 85},     /* PA */
+       {49135, 86},     /* PE */
+       {45763, 87},     /* PH */
+       {43077, 88},     /* PK */
+       {42532, 89},     /* PL */
+       {50386, 90},     /* PR */
+       {46740, 91},     /* PT */
+       {50006, 92},     /* PY */
+       {50058, 93},     /* QA */
+       {42676, 94},     /* RO */
+       {49004, 95},     /* RS */
+       {42732, 96},     /* RU */
+       {46186, 97},     /* RW */
+       {13258, 98},     /* SA */
+       {42933, 99},     /* SE */
+       {47596, 100},    /* SG */
+       {43331, 101},    /* SI */
+       {42842, 102},    /* SK */
+       {50192, 103},    /* SV */
+       {49060, 104},    /* SY */
+       {42980, 105},    /* TH */
+       {43514, 106},    /* TJ */
+       {48516, 107},    /* TN */
+       {43026, 108},    /* TR */
+       {49279, 109},    /* TT */
+       {41755, 110},    /* TW */
+       {43205, 111},    /* UA */
+       {42003, 112},    /* US */
+       {49892, 113},    /* UY */
+       {44588, 114},    /* UZ */
+       {48826, 115},    /* VE */
+       {43620, 116},    /* VN */
+       {48882, 117},    /* YE */
+       {43931, 118},    /* ZA */
+       {49502, 119}     /* ZW */
 };
 
 
@@ -1424,18 +1424,6 @@ static const char locale_strings [] = {
        "\xd8\xb4\xd9\x88\xd8\xa7\xd9\x84\0"
        "\xd8\xb0\xd9\x88 \xd8\xa7\xd9\x84\xd9\x82\xd8\xb9\xd8\xaf\xd8\xa9\0"
        "\xd8\xb0\xd9\x88 \xd8\xa7\xd9\x84\xd8\xad\xd8\xac\xd8\xa9\0"
-       "1\0"
-       "2\0"
-       "3\0"
-       "4\0"
-       "5\0"
-       "6\0"
-       "7\0"
-       "8\0"
-       "9\0"
-       "10\0"
-       "11\0"
-       "12\0"
        "/\0"
        ":\0"
        "dd/MM/yyyy\0"
@@ -1563,9 +1551,9 @@ static const char locale_strings [] = {
        "d'/'MMMM'/'yyyy\0"
        "d' 'MMMM' 'yyyy\0"
        "H:mm\0"
-       "HH'H'mm'''\0"
+       "HH'H'mm'\\''\0"
        "H:mm:ss\0"
-       "HH'H'mm'''ss''''\0"
+       "HH'H'mm'\\''ss'\\'\\''\0"
        "yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'd'\xe6\x97\xa5'\0"
        "yyyy/M/d\0"
        "yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'\0"
@@ -2148,7 +2136,7 @@ static const char locale_strings [] = {
        "n\xc3\xb3v\0"
        "des\0"
        "d. M. yyyy.\0"
-       "d. M. '''yy.\0"
+       "d. M. '\\''yy.\0"
        "yy MM dd\0"
        "m.\0"
        "p.\0"
@@ -2209,6 +2197,18 @@ static const char locale_strings [] = {
        "\xe6\x9c\xa8\0"
        "\xe9\x87\x91\0"
        "\xe5\x9c\x9f\0"
+       "1\0"
+       "2\0"
+       "3\0"
+       "4\0"
+       "5\0"
+       "6\0"
+       "7\0"
+       "8\0"
+       "9\0"
+       "10\0"
+       "11\0"
+       "12\0"
        "yy/MM/dd' ('ddd')'\0"
        "yy/M/d' ('ddd')'\0"
        "yyyy/MM/dd' ('ddd')'\0"
@@ -3373,8 +3373,8 @@ static const char locale_strings [] = {
        "\xe0\xa4\x85\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa5\x82\xe0\xa4\xac\xe0\xa4\xb0\0"
        "\xe0\xa4\xa8\xe0\xa4\xb5\xe0\xa4\xae\xe0\xa5\x8d\xe0\xa4\xac\xe0\xa4\xb0\0"
        "\xe0\xa4\xa6\xe0\xa4\xbf\xe0\xa4\xb8\xe0\xa4\xae\xe0\xa5\x8d\xe0\xa4\xac\xe0\xa4\xb0\0"
-       "dddd, d' ta' 'MMMM yyyy\0"
-       "d' ta' 'MMMM\0"
+       "dddd, d' ta\\' 'MMMM yyyy\0"
+       "d' ta\\' 'MMMM\0"
        "QN\0"
        "WN\0"
        "Il-\xc4\xa6\x61\x64\x64\0"
@@ -3413,7 +3413,7 @@ static const char locale_strings [] = {
        "Ott\0"
        "Di\xc4\x8b\0"
        "ddMMyyyy\0"
-       "d' ta' 'MMMM yyyy\0"
+       "d' ta\\' 'MMMM yyyy\0"
        "MMMM d'. b. 'yyyy\0"
        "MMMM d'. b. '\0"
        "i.b.\0"
@@ -4927,23 +4927,44 @@ static const char locale_strings [] = {
        "NaN\0"
        "\xe2\x80\xb0\0"
        "\xe2\x82\xac\0"
+       "-Infinit\0"
+       "Infinit\0"
        "\xef\xbf\xa5\0"
        "K\xc4\x8d\0"
+       "-nekone\xc4\x8dno\0"
+       "+nekone\xc4\x8dno\0"
        "kr\0"
+       "-unendlich\0"
+       "+unendlich\0"
+       "-\xce\x86\xcf\x80\xce\xb5\xce\xb9\xcf\x81\xce\xbf\0"
+       "\xce\x86\xcf\x80\xce\xb5\xce\xb9\xcf\x81\xce\xbf\0"
        "$\0"
+       "-Infinito\0"
+       "Infinito\0"
        "ep\xc3\xa4luku\0"
+       "-Infini\0"
+       "+Infini\0"
        "\xe2\x82\xaa\0"
        "Ft\0"
        "EiTa\0"
        "\xe2\x88\x92Infinity\0"
        "\xe2\x88\x92\0"
+       "+Infinito\0"
        "NaN\xef\xbc\x88\xe9\x9d\x9e\xe6\x95\xb0\xef\xbc\x89\0"
        "\xe2\x82\xa9\0"
+       "-oneindig\0"
+       "oneindig\0"
        "z\xc5\x82\0"
+       "-niesko\xc5\x84\x63zono\xc5\x9b\xc4\x87\0"
+       "+niesko\xc5\x84\x63zono\xc5\x9b\xc4\x87\0"
        "R$\0"
        "\xe2\x80\x99\0"
+       "\xe2\x88\x92infinit\0"
+       "+infinit\0"
        "\xd1\x80\xd1\x83\xd0\xb1.\0"
        "\xd0\xbd\xd0\xb5 \xd1\x87\xd0\xb8\xd1\x81\xd0\xbb\xd0\xbe\0"
+       "-\xd0\xb1\xd0\xb5\xd1\x81\xd0\xba\xd0\xbe\xd0\xbd\xd0\xb5\xd1\x87\xd0\xbd\xd0\xbe\xd1\x81\xd1\x82\xd1\x8c\0"
+       "\xd0\xb1\xd0\xb5\xd1\x81\xd0\xba\xd0\xbe\xd0\xbd\xd0\xb5\xd1\x87\xd0\xbd\xd0\xbe\xd1\x81\xd1\x82\xd1\x8c\0"
        "kn\0"
        "Lek\0"
        "\xc2\xa4\xc2\xa4\xc2\xa4\0"
@@ -4953,12 +4974,20 @@ static const char locale_strings [] = {
        "Rp\0"
        "\xe2\x82\xb4\0"
        "\xd0\x9d\xd0\xb5 \xd1\x87\xd0\xb8\xd1\x81\xd0\xbb\xd0\xbe\0"
+       "-neskon\xc4\x8dnost\0"
+       "neskon\xc4\x8dnost\0"
        "Ls\0"
        "nav\xc2\xa0skaitlis\0"
+       "\xe2\x88\x92\x62\x65zgal\xc4\xab\x62\x61\0"
+       "bezgal\xc4\xab\x62\x61\0"
        "Lt\0"
+       "\xe2\x88\x92\x62\x65galyb\xc4\x97\0"
+       "begalyb\xc4\x97\0"
        "\xef\xb7\xbc\0"
        "\xe2\x82\xab\0"
        "\xd5\xa4\xd6\x80.\0"
+       "-Infinitu\0"
+       "Infinitu\0"
        "\xe2\x82\xb9\0"
        "RM\0"
        "\xd1\x81\xd0\xbe\xd0\xbc\0"
@@ -5037,15 +5066,15 @@ static const char locale_strings [] = {
        "CAT\0"
        "cat\0"
        "calendari gregori\xc3\xa0\0"
-       "zh-Hans\0"
-       "Chinese (Simplified)\0"
+       "zh-CHS\0"
+       "Chinese (Simplified) Legacy\0"
        "\xe4\xb8\xad\xe6\x96\x87\0"
        "CHS\0"
        "zho\0"
        "zh\0"
        "\xe5\x85\xac\xe5\x8e\x86\0"
-       "zh-CHS\0"
-       "Chinese (Simplified) Legacy\0"
+       "zh-Hans\0"
+       "Chinese (Simplified)\0"
        "cs\0"
        "Czech\0"
        "\xc4\x8d\x65\xc5\xa1tina\0"
@@ -6244,9 +6273,9 @@ static const char locale_strings [] = {
        "mn-Cyrl\0"
        "Mongolian (Cyrillic)\0"
        "MNN\0"
+       "zh-Hant\0"
        "zh-CHT\0"
        "Chinese (Traditional) Legacy\0"
-       "zh-Hant\0"
        "Norwegian Bokm\xc3\xa5l\0"
        "norsk bokm\xc3\xa5l\0"
        "Serbian\0"
index a923ff70eb7662e63848bd5867edf725ea1d9b63..0e6a7b3df1cacdbbbefbd369506d49a3295dde22 100644 (file)
@@ -552,11 +552,15 @@ DECINLINE static void rshift192(guint64* pclo, guint64* pcmi, guint64* pchi)
     *pchi >>= 1;
 }
 
+#if defined(__native_client__) && (defined(__i386__) || defined(__x86_64))
+#define USE_X86_32BIT_INSTRUCTIONS 1
+#endif
+
 static inline gint
 my_g_bit_nth_msf (gsize mask)
 {
        /* Mask is expected to be != 0 */
-#if defined(__i386__) && defined(__GNUC__)
+#if (defined(__i386__) && defined(__GNUC__)) || defined(USE_X86_32BIT_INSTRUCTIONS)
        int r;
 
        __asm__("bsrl %1,%0\n\t"
@@ -1580,4 +1584,3 @@ gint32 mono_decimalSetExponent(/*[In, Out]*/decimal_repr* pA, gint32 texp)
 }
 
 #endif /* DISABLE_DECIMAL */
-
index 24880dd582069d86913aa22193264a92e5ec2eb8..4cd959a1933268700cde589640e1339c9880837a 100644 (file)
@@ -220,7 +220,7 @@ typedef struct {
 } AllocatorWrapperInfo;
 
 MonoMethod* mono_gc_get_managed_allocator (MonoVTable *vtable, gboolean for_box) MONO_INTERNAL;
-MonoMethod* mono_gc_get_managed_array_allocator (MonoVTable *vtable, int rank) MONO_INTERNAL;
+MonoMethod* mono_gc_get_managed_array_allocator (MonoClass *klass) MONO_INTERNAL;
 MonoMethod *mono_gc_get_managed_allocator_by_type (int atype) MONO_INTERNAL;
 
 guint32 mono_gc_get_managed_allocator_types (void) MONO_INTERNAL;
index f0a6ef10c95fe8714d6884224cb9c6574eff6d69..5d0584bb810a58e2b86f540571bfe76ef025eb92 100644 (file)
@@ -36,6 +36,7 @@
 #include <mono/utils/mono-counters.h>
 #include <mono/utils/dtrace.h>
 #include <mono/utils/mono-threads.h>
+#include <mono/utils/atomic.h>
 
 #ifndef HOST_WIN32
 #include <pthread.h>
@@ -341,6 +342,10 @@ mono_domain_finalize (MonoDomain *domain, guint32 timeout)
        HANDLE done_event;
        MonoInternalThread *thread = mono_thread_internal_current ();
 
+#if defined(__native_client__)
+       return FALSE;
+#endif
+
        if (mono_thread_internal_current () == gc_thread)
                /* We are called from inside a finalizer, not much we can do here */
                return FALSE;
@@ -1136,6 +1141,7 @@ mono_gc_init (void)
        MONO_GC_REGISTER_ROOT_FIXED (gc_handles [HANDLE_NORMAL].entries);
        MONO_GC_REGISTER_ROOT_FIXED (gc_handles [HANDLE_PINNED].entries);
 
+       mono_counters_register ("Created object count", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &mono_stats.new_object_count);
        mono_counters_register ("Minor GC collections", MONO_COUNTER_GC | MONO_COUNTER_INT, &gc_stats.minor_gc_count);
        mono_counters_register ("Major GC collections", MONO_COUNTER_GC | MONO_COUNTER_INT, &gc_stats.major_gc_count);
        mono_counters_register ("Minor GC time", MONO_COUNTER_GC | MONO_COUNTER_TIME_INTERVAL, &gc_stats.minor_gc_time_usecs);
index 93569b9d56ba442b3f05d59377c9815e1adc9f76..5d62466ffbc6fbd04a0a3599d5832bd14a420ba5 100644 (file)
@@ -715,11 +715,6 @@ ICALL(MARSHAL_22, "QueryInterfaceInternal", ves_icall_System_Runtime_InteropServ
 #endif
 ICALL(MARSHAL_43, "ReAllocCoTaskMem", ves_icall_System_Runtime_InteropServices_Marshal_ReAllocCoTaskMem)
 ICALL(MARSHAL_23, "ReAllocHGlobal", ves_icall_System_Runtime_InteropServices_Marshal_ReAllocHGlobal)
-ICALL(MARSHAL_24, "ReadByte", ves_icall_System_Runtime_InteropServices_Marshal_ReadByte)
-ICALL(MARSHAL_25, "ReadInt16", ves_icall_System_Runtime_InteropServices_Marshal_ReadInt16)
-ICALL(MARSHAL_26, "ReadInt32", ves_icall_System_Runtime_InteropServices_Marshal_ReadInt32)
-ICALL(MARSHAL_27, "ReadInt64", ves_icall_System_Runtime_InteropServices_Marshal_ReadInt64)
-ICALL(MARSHAL_28, "ReadIntPtr", ves_icall_System_Runtime_InteropServices_Marshal_ReadIntPtr)
 #ifndef DISABLE_COM
 ICALL(MARSHAL_49, "ReleaseComObjectInternal", ves_icall_System_Runtime_InteropServices_Marshal_ReleaseComObjectInternal)
 ICALL(MARSHAL_29, "ReleaseInternal", ves_icall_System_Runtime_InteropServices_Marshal_ReleaseInternal)
@@ -730,11 +725,6 @@ ICALL(MARSHAL_32, "StringToHGlobalAnsi", ves_icall_System_Runtime_InteropService
 ICALL(MARSHAL_33, "StringToHGlobalUni", ves_icall_System_Runtime_InteropServices_Marshal_StringToHGlobalUni)
 ICALL(MARSHAL_34, "StructureToPtr", ves_icall_System_Runtime_InteropServices_Marshal_StructureToPtr)
 ICALL(MARSHAL_35, "UnsafeAddrOfPinnedArrayElement", ves_icall_System_Runtime_InteropServices_Marshal_UnsafeAddrOfPinnedArrayElement)
-ICALL(MARSHAL_36, "WriteByte", ves_icall_System_Runtime_InteropServices_Marshal_WriteByte)
-ICALL(MARSHAL_37, "WriteInt16", ves_icall_System_Runtime_InteropServices_Marshal_WriteInt16)
-ICALL(MARSHAL_38, "WriteInt32", ves_icall_System_Runtime_InteropServices_Marshal_WriteInt32)
-ICALL(MARSHAL_39, "WriteInt64", ves_icall_System_Runtime_InteropServices_Marshal_WriteInt64)
-ICALL(MARSHAL_40, "WriteIntPtr", ves_icall_System_Runtime_InteropServices_Marshal_WriteIntPtr)
 ICALL(MARSHAL_41, "copy_from_unmanaged", ves_icall_System_Runtime_InteropServices_Marshal_copy_from_unmanaged)
 ICALL(MARSHAL_42, "copy_to_unmanaged", ves_icall_System_Runtime_InteropServices_Marshal_copy_to_unmanaged)
 
index 2388fbc4d93540090982a03641a218b5e1667aea..0bfe73bd4b78bb1b1dfe2334115386d1ec63b23c 100644 (file)
@@ -4853,6 +4853,7 @@ ves_icall_System_Reflection_Assembly_GetExecutingAssembly (void)
        MONO_ARCH_SAVE_REGS;
 
        mono_stack_walk_no_il (get_executing, &dest);
+       g_assert (dest);
        return mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);
 }
 
@@ -6530,6 +6531,11 @@ ves_icall_System_Environment_Exit (int result)
 {
        MONO_ARCH_SAVE_REGS;
 
+/* FIXME: There are some cleanup hangs that should be worked out, but
+ * if the program is going to exit, everything will be cleaned up when
+ * NaCl exits anyway.
+ */
+#ifndef __native_client__
        mono_runtime_shutdown ();
 
        /* This will kill the tp threads which cannot be suspended */
@@ -6539,6 +6545,7 @@ ves_icall_System_Environment_Exit (int result)
        mono_thread_suspend_all_other_threads ();
 
        mono_runtime_quit ();
+#endif
 
        /* we may need to do some cleanup here... */
        exit (result);
@@ -7213,6 +7220,12 @@ mono_ArgIterator_IntGetNextArg (MonoArgIterator *iter)
        iter->args = (guint8*)(((gsize)iter->args + (align) - 1) & ~(align - 1));
 #endif
        res.value = iter->args;
+#if defined(__native_client__) && SIZEOF_REGISTER == 8
+       /* Values are stored as 8 byte register sized objects, but 'value'
+        * is dereferenced as a pointer in other routines.
+        */
+       res.value = (char*)res.value + 4;
+#endif
 #if G_BYTE_ORDER != G_LITTLE_ENDIAN
        if (arg_size <= sizeof (gpointer)) {
                int dummy;
index 69e53b496c20cec8950e87718d13449268aba194..5847544f469cf97e71c666717fee74bb506acde1 100644 (file)
@@ -31,6 +31,7 @@
 #include <mono/utils/mono-path.h>
 #include <mono/utils/mono-mmap.h>
 #include <mono/utils/mono-io-portability.h>
+#include <mono/utils/atomic.h>
 #include <mono/metadata/class-internals.h>
 #include <mono/metadata/assembly.h>
 #include <mono/metadata/object-internals.h>
index 3dd967b4534c7541de8bac8b0297ec68ca94f2a7..1eaf06255699f9214cd564edb6b19bac65fb0aec 100644 (file)
@@ -38,6 +38,7 @@
 #include "mono/utils/mono-counters.h"
 #include "mono/utils/mono-tls.h"
 #include "mono/utils/mono-memory-model.h"
+#include "mono/utils/atomic.h"
 #include <string.h>
 #include <errno.h>
 
@@ -584,11 +585,13 @@ mono_array_to_savearray (MonoArray *array)
 gpointer
 mono_array_to_lparray (MonoArray *array)
 {
+#ifndef DISABLE_COM
        gpointer *nativeArray = NULL;
        int nativeArraySize = 0;
 
        int i = 0;
        MonoClass *klass;
+#endif
 
        if (!array)
                return NULL;
@@ -600,14 +603,12 @@ mono_array_to_lparray (MonoArray *array)
        case MONO_TYPE_VOID:
                g_assert_not_reached ();
                break;
-#ifndef DISABLE_COM
        case MONO_TYPE_CLASS:
                nativeArraySize = array->max_length;
                nativeArray = malloc(sizeof(gpointer) * nativeArraySize);
                for(i = 0; i < nativeArraySize; ++i)    
                        nativeArray[i] = ves_icall_System_Runtime_InteropServices_Marshal_GetIUnknownForObjectInternal(((gpointer*)array->vector)[i]);
                return nativeArray;
-#endif
        case MONO_TYPE_U1:
        case MONO_TYPE_BOOLEAN:
        case MONO_TYPE_I1:
@@ -9767,7 +9768,10 @@ mono_marshal_get_isinst (MonoClass *klass)
        static MonoMethodSignature *isint_sig = NULL;
        GHashTable *cache;
        MonoMethod *res;
-       int pos_was_ok, pos_failed, pos_end, pos_end2;
+       int pos_was_ok, pos_end;
+#ifndef DISABLE_REMOTING
+       int pos_end2, pos_failed;
+#endif
        char *name;
        MonoMethodBuilder *mb;
 
@@ -9870,7 +9874,9 @@ mono_marshal_get_castclass (MonoClass *klass)
        static MonoMethodSignature *castclass_sig = NULL;
        GHashTable *cache;
        MonoMethod *res;
+#ifndef DISABLE_REMOTING
        int pos_was_ok, pos_was_ok2;
+#endif
        char *name;
        MonoMethodBuilder *mb;
        WrapperInfo *info;
@@ -11443,122 +11449,6 @@ ves_icall_System_Runtime_InteropServices_Marshal_copy_from_unmanaged (gpointer s
        memcpy (dest_addr, src, length * element_size);
 }
 
-#if NO_UNALIGNED_ACCESS
-#define RETURN_UNALIGNED(type, addr) \
-       { \
-               type val; \
-               memcpy(&val, p + offset, sizeof(val)); \
-               return val; \
-       }
-#define WRITE_UNALIGNED(type, addr, val) \
-       memcpy(addr, &val, sizeof(type))
-#else
-#define RETURN_UNALIGNED(type, addr) \
-       return *(type*)(p + offset);
-#define WRITE_UNALIGNED(type, addr, val) \
-       (*(type *)(addr) = (val))
-#endif
-
-gpointer
-ves_icall_System_Runtime_InteropServices_Marshal_ReadIntPtr (gpointer ptr, gint32 offset)
-{
-       char *p = ptr;
-
-       MONO_ARCH_SAVE_REGS;
-
-       RETURN_UNALIGNED(gpointer, p + offset);
-}
-
-unsigned char
-ves_icall_System_Runtime_InteropServices_Marshal_ReadByte (gpointer ptr, gint32 offset)
-{
-       char *p = ptr;
-
-       MONO_ARCH_SAVE_REGS;
-
-       return *(unsigned char*)(p + offset);
-}
-
-gint16
-ves_icall_System_Runtime_InteropServices_Marshal_ReadInt16 (gpointer ptr, gint32 offset)
-{
-       char *p = ptr;
-
-       MONO_ARCH_SAVE_REGS;
-
-       RETURN_UNALIGNED(gint16, p + offset);
-}
-
-gint32
-ves_icall_System_Runtime_InteropServices_Marshal_ReadInt32 (gpointer ptr, gint32 offset)
-{
-       char *p = ptr;
-
-       MONO_ARCH_SAVE_REGS;
-
-       RETURN_UNALIGNED(gint32, p + offset);
-}
-
-gint64
-ves_icall_System_Runtime_InteropServices_Marshal_ReadInt64 (gpointer ptr, gint32 offset)
-{
-       char *p = ptr;
-
-       MONO_ARCH_SAVE_REGS;
-
-       RETURN_UNALIGNED(gint64, p + offset);
-}
-
-void
-ves_icall_System_Runtime_InteropServices_Marshal_WriteByte (gpointer ptr, gint32 offset, unsigned char val)
-{
-       char *p = ptr;
-
-       MONO_ARCH_SAVE_REGS;
-
-       *(unsigned char*)(p + offset) = val;
-}
-
-void
-ves_icall_System_Runtime_InteropServices_Marshal_WriteIntPtr (gpointer ptr, gint32 offset, gpointer val)
-{
-       char *p = ptr;
-
-       MONO_ARCH_SAVE_REGS;
-
-       WRITE_UNALIGNED(gpointer, p + offset, val);
-}
-
-void
-ves_icall_System_Runtime_InteropServices_Marshal_WriteInt16 (gpointer ptr, gint32 offset, gint16 val)
-{
-       char *p = ptr;
-
-       MONO_ARCH_SAVE_REGS;
-
-       WRITE_UNALIGNED(gint16, p + offset, val);
-}
-
-void
-ves_icall_System_Runtime_InteropServices_Marshal_WriteInt32 (gpointer ptr, gint32 offset, gint32 val)
-{
-       char *p = ptr;
-
-       MONO_ARCH_SAVE_REGS;
-
-       WRITE_UNALIGNED(gint32, p + offset, val);
-}
-
-void
-ves_icall_System_Runtime_InteropServices_Marshal_WriteInt64 (gpointer ptr, gint32 offset, gint64 val)
-{
-       char *p = ptr;
-
-       MONO_ARCH_SAVE_REGS;
-
-       WRITE_UNALIGNED(gint64, p + offset, val);
-}
-
 MonoString *
 ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi (char *ptr)
 {
@@ -11728,7 +11618,8 @@ ves_icall_System_Runtime_InteropServices_Marshal_PtrToStructure_type (gpointer s
 
        MONO_ARCH_SAVE_REGS;
 
-       MONO_CHECK_ARG_NULL (src);
+       if (src == NULL)
+               return NULL;
        MONO_CHECK_ARG_NULL (type);
 
        klass = mono_class_from_mono_type (type->type);
index a8f7057d6294272322cbde71319577a086d3f966..3a99ac60bd70a39c93de836470411ce8cab0925e 100644 (file)
@@ -394,36 +394,6 @@ void
 ves_icall_System_Runtime_InteropServices_Marshal_copy_from_unmanaged (gpointer src, gint32 start_index,
                                                                      MonoArray *dest, gint32 length) MONO_INTERNAL;
 
-gpointer
-ves_icall_System_Runtime_InteropServices_Marshal_ReadIntPtr (gpointer ptr, gint32 offset) MONO_INTERNAL;
-
-unsigned char
-ves_icall_System_Runtime_InteropServices_Marshal_ReadByte (gpointer ptr, gint32 offset) MONO_INTERNAL;
-
-gint16
-ves_icall_System_Runtime_InteropServices_Marshal_ReadInt16 (gpointer ptr, gint32 offset) MONO_INTERNAL;
-
-gint32
-ves_icall_System_Runtime_InteropServices_Marshal_ReadInt32 (gpointer ptr, gint32 offset) MONO_INTERNAL;
-
-gint64
-ves_icall_System_Runtime_InteropServices_Marshal_ReadInt64 (gpointer ptr, gint32 offset) MONO_INTERNAL;
-
-void
-ves_icall_System_Runtime_InteropServices_Marshal_WriteByte (gpointer ptr, gint32 offset, unsigned char val) MONO_INTERNAL;
-
-void
-ves_icall_System_Runtime_InteropServices_Marshal_WriteIntPtr (gpointer ptr, gint32 offset, gpointer val) MONO_INTERNAL;
-
-void
-ves_icall_System_Runtime_InteropServices_Marshal_WriteInt16 (gpointer ptr, gint32 offset, gint16 val) MONO_INTERNAL;
-
-void
-ves_icall_System_Runtime_InteropServices_Marshal_WriteInt32 (gpointer ptr, gint32 offset, gint32 val) MONO_INTERNAL;
-
-void
-ves_icall_System_Runtime_InteropServices_Marshal_WriteInt64 (gpointer ptr, gint32 offset, gint64 val) MONO_INTERNAL;
-
 MonoString *
 ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringAnsi (char *ptr) MONO_INTERNAL;
 
index 75e5ceaf2e2b95abeab0ab08f66ff35cbf8f6c37..9933f1dd48730ba5f4d5ae377a67752543063a85 100644 (file)
@@ -26,6 +26,7 @@
 #include <mono/metadata/marshal.h>
 #include <mono/metadata/profiler-private.h>
 #include <mono/utils/mono-time.h>
+#include <mono/utils/atomic.h>
 
 /*
  * Pull the list of opcodes
index 01be2ef71f21fb348c8d664a0aecc1e0f0952070..3ab5bf6ffe571be8b63f84b1a93b07d7a7a410ad 100644 (file)
@@ -12,6 +12,7 @@
 #include <mono/metadata/mono-cq.h>
 #include <mono/metadata/mono-mlist.h>
 #include <mono/utils/mono-memory-model.h>
+#include <mono/utils/atomic.h>
 
 #define CQ_DEBUG(...)
 //#define CQ_DEBUG(...) g_message(__VA_ARGS__)
index 700cd9e498abc011709e879426d4189357fb14bf..ec72516a2b394f8fc4db25163ad9a6354000bbf7 100644 (file)
@@ -38,6 +38,7 @@
 #include "utils/mono-proclib.h"
 #include "utils/mono-networkinterfaces.h"
 #include "utils/mono-error-internals.h"
+#include "utils/atomic.h"
 #include <mono/io-layer/io-layer.h>
 
 /* map of CounterSample.cs */
index 0cfec34e1424db8ab2408e320de71f161593f5dd..157b529fe9bcefc159684ec955de792f8c3e9fcf 100644 (file)
@@ -13,6 +13,7 @@
 #include <mono/metadata/mono-wsq.h>
 #include <mono/utils/mono-semaphore.h>
 #include <mono/utils/mono-tls.h>
+#include <mono/utils/atomic.h>
 
 #define INITIAL_LENGTH 32
 #define WSQ_DEBUG(...)
index 83494def459eb6b950edf09339c7466e8d4ff56f..a1a3514f4fe1bc4639b7ffba80a807e5c05bc8df 100644 (file)
@@ -13,4 +13,35 @@ struct group *getgrgid(gid_t gid) { errno=EIO; return NULL; }
 int fsync(int fd) { errno=EINVAL; return -1; }
 dev_t makedev(guint32 maj, guint32 min) { return (maj)*256+(min); }
 
+#ifdef USE_NEWLIB
+int getdtablesize(void) {
+#ifdef OPEN_MAX
+  return OPEN_MAX;
+#else
+  return 256;
+#endif
+}
+
+size_t getpagesize(void) {
+#ifdef PAGE_SIZE
+  return PAGE_SIZE;
+#else
+  return 4096;
+#endif
+}
+
+#include <semaphore.h>
+
+int sem_trywait(sem_t *sem) {
+  g_assert_not_reached ();
+  return -1;
+}
+
+int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout) {
+  g_assert_not_reached ();
+  return -1;
+}
+
+#endif
+
 #endif
index 4d48eb50adc2f72ede553b7a8d1518908fd1e073..4076d65d183acca8e502cffb4db0a6f4a96cb439 100644 (file)
@@ -11,6 +11,7 @@
 #include <mono/metadata/mono-gc.h>
 #include <mono/metadata/gc-internal.h>
 #include <mono/metadata/runtime.h>
+#include <mono/utils/mono-threads.h>
 
 #ifdef HAVE_NULL_GC
 
@@ -22,6 +23,8 @@ mono_gc_base_init (void)
        memset (&cb, 0, sizeof (cb));
        cb.mono_method_is_critical = mono_runtime_is_critical_method;
        cb.mono_gc_pthread_create = (gpointer)mono_gc_pthread_create;
+
+       mono_threads_init (&cb, sizeof (MonoThreadInfo));
 }
 
 void
@@ -221,7 +224,7 @@ mono_gc_get_managed_allocator (MonoVTable *vtable, gboolean for_box)
 }
 
 MonoMethod*
-mono_gc_get_managed_array_allocator (MonoVTable *vtable, int rank)
+mono_gc_get_managed_array_allocator (MonoClass *klass)
 {
        return NULL;
 }
index 97b264b6a31bdd7d17025754557a160bc7d6e630..4ed1203f85df3390b9d75bd5c597ec955c0c6dea 100644 (file)
@@ -182,6 +182,8 @@ ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngClose (gpoint
 
 #elif defined (__native_client__)
 
+#include <time.h>
+
 MonoBoolean
 ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngOpen (void)
 {
index 55cd85bc75b084f63ec8caa3c40f9e1aaf15d814..55a472ffa44e561703d9a3ac271fdaccce8355c7 100644 (file)
@@ -953,11 +953,9 @@ mono_gc_get_managed_allocator (MonoVTable *vtable, gboolean for_box)
 }
 
 MonoMethod*
-mono_gc_get_managed_array_allocator (MonoVTable *vtable, int rank)
+mono_gc_get_managed_array_allocator (MonoClass *klass)
 {
 #ifdef MANAGED_ALLOCATION
-       MonoClass *klass = vtable->klass;
-
 #ifdef HAVE_KW_THREAD
        int tlab_next_offset = -1;
        int tlab_temp_end_offset = -1;
@@ -968,7 +966,7 @@ mono_gc_get_managed_array_allocator (MonoVTable *vtable, int rank)
                return NULL;
 #endif
 
-       if (rank != 1)
+       if (klass->rank != 1)
                return NULL;
        if (!mono_runtime_has_tls_get ())
                return NULL;
index 949d722cc2ccac2a7f07c17cd1e23c8c86838c4a..4ce7384f1cd3cdd5b3916a7d25afc447929f2922 100644 (file)
@@ -47,6 +47,7 @@
 
 guint8 *sgen_cardtable;
 
+static gboolean need_mod_union;
 
 #ifdef HEAVY_STATISTICS
 long long marked_cards;
@@ -82,7 +83,7 @@ static void
 sgen_card_table_wbarrier_set_field (MonoObject *obj, gpointer field_ptr, MonoObject* value)
 {
        *(void**)field_ptr = value;
-       if (sgen_ptr_in_nursery (value))
+       if (need_mod_union || sgen_ptr_in_nursery (value))
                sgen_card_table_mark_address ((mword)field_ptr);
        sgen_dummy_use (value);
 }
@@ -91,7 +92,7 @@ static void
 sgen_card_table_wbarrier_set_arrayref (MonoArray *arr, gpointer slot_ptr, MonoObject* value)
 {
        *(void**)slot_ptr = value;
-       if (sgen_ptr_in_nursery (value))
+       if (need_mod_union || sgen_ptr_in_nursery (value))
                sgen_card_table_mark_address ((mword)slot_ptr);
        sgen_dummy_use (value); 
 }
@@ -111,7 +112,7 @@ sgen_card_table_wbarrier_arrayref_copy (gpointer dest_ptr, gpointer src_ptr, int
                for (; dest >= start; --src, --dest) {
                        gpointer value = *src;
                        *dest = value;
-                       if (sgen_ptr_in_nursery (value))
+                       if (need_mod_union || sgen_ptr_in_nursery (value))
                                sgen_card_table_mark_address ((mword)dest);
                        sgen_dummy_use (value);
                }
@@ -120,7 +121,7 @@ sgen_card_table_wbarrier_arrayref_copy (gpointer dest_ptr, gpointer src_ptr, int
                for (; dest < end; ++src, ++dest) {
                        gpointer value = *src;
                        *dest = value;
-                       if (sgen_ptr_in_nursery (value))
+                       if (need_mod_union || sgen_ptr_in_nursery (value))
                                sgen_card_table_mark_address ((mword)dest);
                        sgen_dummy_use (value);
                }
@@ -278,6 +279,74 @@ sgen_card_table_find_address (char *addr)
        return sgen_card_table_address_is_marked ((mword)addr);
 }
 
+static gboolean
+sgen_card_table_find_address_with_cards (char *cards_start, guint8 *cards, char *addr)
+{
+       cards_start = sgen_card_table_align_pointer (cards_start);
+       return cards [(addr - cards_start) >> CARD_BITS];
+}
+
+static void
+update_mod_union (guint8 *dest, gboolean init, guint8 *start_card, guint8 *end_card)
+{
+       size_t num_cards = end_card - start_card;
+       if (init) {
+               memcpy (dest, start_card, num_cards);
+       } else {
+               int i;
+               for (i = 0; i < num_cards; ++i)
+                       dest [i] |= start_card [i];
+       }
+}
+
+static guint8*
+alloc_mod_union (size_t num_cards)
+{
+       return sgen_alloc_internal_dynamic (num_cards, INTERNAL_MEM_CARDTABLE_MOD_UNION, TRUE);
+}
+
+guint8*
+sgen_card_table_update_mod_union (guint8 *dest, char *obj, mword obj_size, size_t *out_num_cards)
+{
+       guint8 *result = dest;
+       guint8 *start_card = sgen_card_table_get_card_address ((mword)obj);
+       guint8 *end_card = sgen_card_table_get_card_address ((mword)obj + obj_size - 1) + 1;
+       gboolean init = dest == NULL;
+       size_t num_cards;
+
+#ifdef SGEN_HAVE_OVERLAPPING_CARDS
+       if (end_card < start_card) {
+               guint8 *edge_card = sgen_cardtable + CARD_COUNT_IN_BYTES;
+               size_t num_cards_to_edge = edge_card - start_card;
+
+               num_cards = (end_card + CARD_COUNT_IN_BYTES) - start_card;
+               if (init) {
+                       result = dest = alloc_mod_union (num_cards);
+                       //g_print ("%d cards for %d bytes: %p\n", num_cards, num_bytes, dest);
+               }
+
+               update_mod_union (dest, init, start_card, edge_card);
+
+               SGEN_ASSERT (0, num_cards == (edge_card - start_card) + (end_card - sgen_cardtable), "wrong number of cards");
+
+               dest += num_cards_to_edge;
+               start_card = sgen_cardtable;
+       } else
+#endif
+       {
+               num_cards = end_card - start_card;
+               if (init)
+                       result = dest = alloc_mod_union (num_cards);
+       }
+
+       update_mod_union (dest, init, start_card, end_card);
+
+       if (out_num_cards)
+               *out_num_cards = num_cards;
+
+       return result;
+}
+
 #ifdef SGEN_HAVE_OVERLAPPING_CARDS
 
 static void
@@ -710,26 +779,9 @@ sgen_card_table_init (SgenRemeberedSet *remset)
        remset->prepare_for_major_collection = sgen_card_table_prepare_for_major_collection;
 
        remset->find_address = sgen_card_table_find_address;
-}
-
-#else
-
-void
-sgen_card_table_mark_address (mword address)
-{
-       g_assert_not_reached ();
-}
+       remset->find_address_with_cards = sgen_card_table_find_address_with_cards;
 
-void
-sgen_card_table_mark_range (mword address, mword size)
-{
-       g_assert_not_reached ();
-}
-
-guint8*
-mono_gc_get_card_table (int *shift_bits, gpointer *mask)
-{
-       return NULL;
+       need_mod_union = sgen_get_major_collector ()->is_concurrent;
 }
 
 #endif /*HAVE_SGEN_GC*/
index efdd8f90584bd45fd0bf34a06f1693d228a9fa32..4e74206d44fb44258480293d4d995be145116fb1 100644 (file)
@@ -32,6 +32,8 @@ void sgen_cardtable_scan_object (char *obj, mword obj_size, guint8 *cards,
 
 gboolean sgen_card_table_get_card_data (guint8 *dest, mword address, mword cards) MONO_INTERNAL;
 
+guint8* sgen_card_table_update_mod_union (guint8 *dest, char *obj, mword obj_size, size_t *out_num_cards) MONO_INTERNAL;
+
 void sgen_card_table_init (SgenRemeberedSet *remset) MONO_INTERNAL;
 
 /*How many bytes a single card covers*/
index c5e5db48463a4beb43f3e39a7632ee994fcfe8bf..45c6f2093a8283b09b439abc391e9b57379eb67d 100644 (file)
@@ -200,6 +200,59 @@ sgen_check_consistency (void)
                g_assert (!missing_remsets);
 }
 
+static gboolean
+is_major_or_los_object_marked (char *obj)
+{
+       if (sgen_safe_object_get_size ((MonoObject*)obj) > SGEN_MAX_SMALL_OBJ_SIZE) {
+               return sgen_los_object_is_pinned (obj);
+       } else {
+               return sgen_get_major_collector ()->is_object_live (obj);
+       }
+}
+
+#undef HANDLE_PTR
+#define HANDLE_PTR(ptr,obj)    do {    \
+       if (*(ptr) && !sgen_ptr_in_nursery ((char*)*(ptr)) && !is_major_or_los_object_marked ((char*)*(ptr))) { \
+               if (!sgen_get_remset ()->find_address_with_cards (start, cards, (char*)(ptr))) { \
+                       SGEN_LOG (0, "major->major reference %p at offset %td in object %p (%s.%s) not found in remsets.", *(ptr), (char*)(ptr) - (char*)(obj), (obj), ((MonoObject*)(obj))->vtable->klass->name_space, ((MonoObject*)(obj))->vtable->klass->name); \
+                       binary_protocol_missing_remset ((obj), (gpointer)LOAD_VTABLE ((obj)), (char*)(ptr) - (char*)(obj), *(ptr), (gpointer)LOAD_VTABLE(*(ptr)), object_is_pinned (*(ptr))); \
+               }                                                                                                                               \
+       }                                                                                                                                       \
+       } while (0)
+
+static void
+check_mod_union_callback (char *start, size_t size, void *dummy)
+{
+       gboolean in_los = (gboolean) (size_t) dummy;
+       GCVTable *vt = (GCVTable*)LOAD_VTABLE (start);
+       guint8 *cards;
+       SGEN_LOG (8, "Scanning object %p, vtable: %p (%s)", start, vt, vt->klass->name);
+
+       if (!is_major_or_los_object_marked (start))
+               return;
+
+       if (in_los)
+               cards = sgen_los_header_for_object (start)->cardtable_mod_union;
+       else
+               cards = sgen_get_major_collector ()->get_cardtable_mod_union_for_object (start);
+
+       SGEN_ASSERT (0, cards, "we must have mod union for marked major objects");
+
+#include "sgen-scan-object.h"
+}
+
+void
+sgen_check_mod_union_consistency (void)
+{
+       missing_remsets = FALSE;
+
+       major_collector.iterate_objects (TRUE, TRUE, (IterateObjectCallbackFunc)check_mod_union_callback, (void*)FALSE);
+
+       sgen_los_iterate_objects ((IterateObjectCallbackFunc)check_mod_union_callback, (void*)TRUE);
+
+       if (!binary_protocol_is_enabled ())
+               g_assert (!missing_remsets);
+}
 
 #undef HANDLE_PTR
 #define HANDLE_PTR(ptr,obj)    do {                                    \
@@ -365,7 +418,7 @@ FIXME Flag missing remsets due to pinning as non fatal
 static void
 verify_object_pointers_callback (char *start, size_t size, void *data)
 {
-       gboolean allow_missing_pinned = (gboolean)data;
+       gboolean allow_missing_pinned = (gboolean) (size_t) data;
 
 #include "sgen-scan-object.h"
 }
@@ -381,9 +434,9 @@ sgen_check_whole_heap (gboolean allow_missing_pinned)
        setup_valid_nursery_objects ();
 
        broken_heap = FALSE;
-       sgen_scan_area_with_callback (nursery_section->data, nursery_section->end_data, verify_object_pointers_callback, (void*)allow_missing_pinned, FALSE);
-       major_collector.iterate_objects (TRUE, TRUE, verify_object_pointers_callback, (void*)allow_missing_pinned);
-       sgen_los_iterate_objects (verify_object_pointers_callback, (void*)allow_missing_pinned);
+       sgen_scan_area_with_callback (nursery_section->data, nursery_section->end_data, verify_object_pointers_callback, (void*) (size_t) allow_missing_pinned, FALSE);
+       major_collector.iterate_objects (TRUE, TRUE, verify_object_pointers_callback, (void*) (size_t) allow_missing_pinned);
+       sgen_los_iterate_objects (verify_object_pointers_callback, (void*) (size_t) allow_missing_pinned);
 
        g_assert (!broken_heap);
 }
@@ -488,7 +541,7 @@ find_pinning_reference (char *obj, size_t size)
 static void
 check_marked_callback (char *start, size_t size, void *dummy)
 {
-       gboolean is_los = (gboolean)dummy;
+       gboolean is_los = (gboolean) (size_t) dummy;
 
        if (is_los) {
                if (!sgen_los_object_is_pinned (start))
@@ -513,7 +566,7 @@ sgen_check_major_heap_marked (void)
 static void
 check_nursery_objects_pinned_callback (char *obj, size_t size, void *data /* ScanCopyContext *ctx */)
 {
-       gboolean pinned = (gboolean)data;
+       gboolean pinned = (gboolean) (size_t) data;
 
        g_assert (!SGEN_OBJECT_IS_FORWARDED (obj));
        if (pinned)
@@ -527,7 +580,7 @@ sgen_check_nursery_objects_pinned (gboolean pinned)
 {
        sgen_clear_nursery_fragments ();
        sgen_scan_area_with_callback (nursery_section->data, nursery_section->end_data,
-                       (IterateObjectCallbackFunc)check_nursery_objects_pinned_callback, (void*)pinned /* (void*)&ctx */, FALSE);
+                       (IterateObjectCallbackFunc)check_nursery_objects_pinned_callback, (void*) (size_t) pinned /* (void*)&ctx */, FALSE);
 }
 
 #endif /*HAVE_SGEN_GC*/
index acb5f552567e4179ccc3b957cd95bb3f11704e31..88c5308bcdd71fdcf05b3dbcdee54e0e8638ad6e 100644 (file)
@@ -263,6 +263,8 @@ guint32 collect_before_allocs = 0;
 static gboolean whole_heap_check_before_collection = FALSE;
 /* If set, do a heap consistency check before each minor collection */
 static gboolean consistency_check_at_minor_collection = FALSE;
+/* If set, do a mod union consistency check before each finishing collection pause */
+static gboolean mod_union_consistency_check = FALSE;
 /* If set, check whether mark bits are consistent after major collections */
 static gboolean check_mark_bits_after_major_collection = FALSE;
 /* If set, check that all nursery objects are pinned/not pinned, depending on context */
@@ -3315,6 +3317,9 @@ major_update_or_finish_concurrent_collection (gboolean force_finish)
                return FALSE;
        }
 
+       if (mod_union_consistency_check)
+               sgen_check_mod_union_consistency ();
+
        collect_nursery (&unpin_queue, TRUE);
 
        current_collection_generation = GENERATION_OLD;
@@ -3387,6 +3392,8 @@ sgen_perform_collection (size_t requested_size, int generation_to_collect, const
        const char *overflow_reason = NULL;
 
        MONO_GC_REQUESTED (generation_to_collect, requested_size, wait_to_finish ? 1 : 0);
+       if (wait_to_finish)
+               binary_protocol_collection_force (generation_to_collect);
 
        g_assert (generation_to_collect == GENERATION_NURSERY || generation_to_collect == GENERATION_OLD);
 
@@ -5169,6 +5176,12 @@ mono_gc_base_init (void)
                        } else if (!strcmp (opt, "check-at-minor-collections")) {
                                consistency_check_at_minor_collection = TRUE;
                                nursery_clear_policy = CLEAR_AT_GC;
+                       } else if (!strcmp (opt, "mod-union-consistency-check")) {
+                               if (!major_collector.is_concurrent) {
+                                       sgen_env_var_error (MONO_GC_DEBUG_NAME, "Ignoring.", "`mod-union-consistency-check` only works with concurrent major collector.");
+                                       continue;
+                               }
+                               mod_union_consistency_check = TRUE;
                        } else if (!strcmp (opt, "check-mark-bits")) {
                                check_mark_bits_after_major_collection = TRUE;
                        } else if (!strcmp (opt, "check-nursery-pinned")) {
index 9a5d71415abf4018989c5d264925b9091920df6f..f0f010c4d8011cbfeca19a07d1453484542a9268 100644 (file)
@@ -39,6 +39,7 @@ typedef struct _SgenThreadInfo SgenThreadInfo;
 #include <mono/utils/mono-threads.h>
 #include <mono/utils/dtrace.h>
 #include <mono/utils/mono-logger-internal.h>
+#include <mono/utils/atomic.h>
 #include <mono/io-layer/mono-mutex.h>
 #include <mono/metadata/class-internals.h>
 #include <mono/metadata/object-internals.h>
@@ -404,6 +405,7 @@ enum {
        INTERNAL_MEM_GRAY_QUEUE,
        INTERNAL_MEM_MS_TABLES,
        INTERNAL_MEM_MS_BLOCK_INFO,
+       INTERNAL_MEM_MS_BLOCK_INFO_SORT,
        INTERNAL_MEM_EPHEMERON_LINK,
        INTERNAL_MEM_WORKER_DATA,
        INTERNAL_MEM_WORKER_JOB_DATA,
@@ -659,6 +661,7 @@ struct _SgenMajorCollector {
        void (*reset_worker_data) (void *data);
        gboolean (*is_valid_object) (char *object);
        gboolean (*describe_pointer) (char *pointer);
+       guint8* (*get_cardtable_mod_union_for_object) (char *object);
        long long (*get_and_reset_num_major_objects_marked) (void);
 };
 
@@ -687,6 +690,7 @@ typedef struct {
 
        void (*finish_minor_collection) (void);
        gboolean (*find_address) (char *addr);
+       gboolean (*find_address_with_cards) (char *cards_start, guint8 *cards, char *addr);
 } SgenRemeberedSet;
 
 SgenRemeberedSet *sgen_get_remset (void) MONO_INTERNAL;
@@ -995,6 +999,7 @@ gboolean sgen_has_managed_allocator (void);
 /* Debug support */
 
 void sgen_check_consistency (void);
+void sgen_check_mod_union_consistency (void);
 void sgen_check_major_refs (void);
 void sgen_check_whole_heap (gboolean allow_missing_pinning);
 void sgen_check_whole_heap_stw (void) MONO_INTERNAL;
index 47575ea4198f6a8ec45341cada8cb7a06d0983ec..6be8b0d285d30ef92c73b1f54e4397790d5aa74e 100644 (file)
@@ -98,6 +98,7 @@ description_for_type (int type)
        case INTERNAL_MEM_GRAY_QUEUE: return "gray-queue";
        case INTERNAL_MEM_MS_TABLES: return "marksweep-tables";
        case INTERNAL_MEM_MS_BLOCK_INFO: return "marksweep-block-info";
+       case INTERNAL_MEM_MS_BLOCK_INFO_SORT: return "marksweep-block-info-sort";
        case INTERNAL_MEM_EPHEMERON_LINK: return "ephemeron-link";
        case INTERNAL_MEM_WORKER_DATA: return "worker-data";
        case INTERNAL_MEM_WORKER_JOB_DATA: return "worker-job-data";
@@ -180,7 +181,7 @@ sgen_free_internal (void *addr, int type)
        mono_lock_free_free (addr);
 
        if (MONO_GC_INTERNAL_DEALLOC_ENABLED ()) {
-               int size = allocator_sizes [index];
+               int size G_GNUC_UNUSED = allocator_sizes [index];
                MONO_GC_INTERNAL_DEALLOC ((mword)addr, size, type);
        }
 }
index dcf3907874c1c9ab0824a5d32b0047b97c33f848..b273a5ab822bd0cf5f35c3a3590f6c5836723fff 100644 (file)
@@ -554,19 +554,8 @@ sgen_los_update_cardtable_mod_union (void)
        LOSObject *obj;
 
        for (obj = los_object_list; obj; obj = obj->next) {
-               guint8 *start_card = sgen_card_table_get_card_scan_address ((mword)obj->data);
-               guint8 *end_card = sgen_card_table_get_card_scan_address ((mword)obj->data + obj->size - 1) + 1;
-               size_t num_cards = end_card - start_card;
-
-               if (!obj->cardtable_mod_union) {
-                       obj->cardtable_mod_union = sgen_alloc_internal_dynamic (num_cards,
-                                       INTERNAL_MEM_CARDTABLE_MOD_UNION, TRUE);
-                       memcpy (obj->cardtable_mod_union, start_card, num_cards);
-               } else {
-                       int i;
-                       for (i = 0; i < num_cards; ++i)
-                               obj->cardtable_mod_union [i] |= start_card [i];
-               }
+               obj->cardtable_mod_union = sgen_card_table_update_mod_union (obj->cardtable_mod_union,
+                               obj->data, obj->size, NULL);
        }
 }
 
index d8dc8dfdbd7bd02862c25e355ee33f6cef17ca8c..43a587ce19df78c4218c700381288101cfa5a7a0 100644 (file)
@@ -56,7 +56,7 @@
 
 /*
  * Don't allocate single blocks, but alloc a contingent of this many
- * blocks in one swoop.
+ * blocks in one swoop.  This must be a power of two.
  */
 #define MS_BLOCK_ALLOC_NUM     32
 
@@ -232,6 +232,12 @@ static long long stat_major_blocks_freed = 0;
 static long long stat_major_blocks_lazy_swept = 0;
 static long long stat_major_objects_evacuated = 0;
 
+#if SIZEOF_VOID_P != 8
+static long long stat_major_blocks_freed_ideal = 0;
+static long long stat_major_blocks_freed_less_ideal = 0;
+static long long stat_major_blocks_freed_individual = 0;
+static long long stat_major_blocks_alloced_less_ideal = 0;
+#endif
 
 #ifdef SGEN_COUNT_NUMBER_OF_MAJOR_OBJECTS_MARKED
 static long long num_major_objects_marked = 0;
@@ -363,9 +369,21 @@ ms_get_empty_block (void)
 
  retry:
        if (!empty_blocks) {
-               p = sgen_alloc_os_memory_aligned (MS_BLOCK_SIZE * MS_BLOCK_ALLOC_NUM, MS_BLOCK_SIZE, SGEN_ALLOC_HEAP | SGEN_ALLOC_ACTIVATE, "major heap section");
+               /*
+                * We try allocating MS_BLOCK_ALLOC_NUM blocks first.  If that's
+                * unsuccessful, we halve the number of blocks and try again, until we're at
+                * 1.  If that doesn't work, either, we assert.
+                */
+               int alloc_num = MS_BLOCK_ALLOC_NUM;
+               for (;;) {
+                       p = sgen_alloc_os_memory_aligned (MS_BLOCK_SIZE * alloc_num, MS_BLOCK_SIZE, SGEN_ALLOC_HEAP | SGEN_ALLOC_ACTIVATE,
+                                       alloc_num == 1 ? "major heap section" : NULL);
+                       if (p)
+                               break;
+                       alloc_num >>= 1;
+               }
 
-               for (i = 0; i < MS_BLOCK_ALLOC_NUM; ++i) {
+               for (i = 0; i < alloc_num; ++i) {
                        block = p;
                        /*
                         * We do the free list update one after the
@@ -379,9 +397,13 @@ ms_get_empty_block (void)
                        p += MS_BLOCK_SIZE;
                }
 
-               SGEN_ATOMIC_ADD (num_empty_blocks, MS_BLOCK_ALLOC_NUM);
+               SGEN_ATOMIC_ADD (num_empty_blocks, alloc_num);
 
-               stat_major_blocks_alloced += MS_BLOCK_ALLOC_NUM;
+               stat_major_blocks_alloced += alloc_num;
+#if SIZEOF_VOID_P != 8
+               if (alloc_num != MS_BLOCK_ALLOC_NUM)
+                       stat_major_blocks_alloced_less_ideal += alloc_num;
+#endif
        }
 
        do {
@@ -1844,6 +1866,18 @@ major_finish_major_collection (void)
 {
 }
 
+#if !defined(FIXED_HEAP) && SIZEOF_VOID_P != 8
+static int
+compare_pointers (const void *va, const void *vb) {
+       char *a = *(char**)va, *b = *(char**)vb;
+       if (a < b)
+               return -1;
+       if (a > b)
+               return 1;
+       return 0;
+}
+#endif
+
 static void
 major_have_computer_minor_collection_allowance (void)
 {
@@ -1852,13 +1886,127 @@ major_have_computer_minor_collection_allowance (void)
 
        g_assert (have_swept);
 
+#if SIZEOF_VOID_P != 8
+       {
+               int i, num_empty_blocks_orig, num_blocks, arr_length;
+               void *block;
+               void **empty_block_arr;
+               void **rebuild_next;
+
+               if (num_empty_blocks <= section_reserve)
+                       return;
+               SGEN_ASSERT (0, num_empty_blocks > 0, "section reserve can't be negative");
+
+               num_empty_blocks_orig = num_empty_blocks;
+               empty_block_arr = (void**)sgen_alloc_internal_dynamic (sizeof (void*) * num_empty_blocks_orig,
+                               INTERNAL_MEM_MS_BLOCK_INFO_SORT, FALSE);
+               if (!empty_block_arr)
+                       goto fallback;
+
+               i = 0;
+               for (block = empty_blocks; block; block = *(void**)block)
+                       empty_block_arr [i++] = block;
+               SGEN_ASSERT (0, i == num_empty_blocks, "empty block count wrong");
+
+               qsort (empty_block_arr, num_empty_blocks, sizeof (void*), compare_pointers);
+
+               /*
+                * We iterate over the free blocks, trying to find MS_BLOCK_ALLOC_NUM
+                * contiguous ones.  If we do, we free them.  If that's not enough to get to
+                * section_reserve, we halve the number of contiguous blocks we're looking
+                * for and have another go, until we're done with looking for pairs of
+                * blocks, at which point we give up and go to the fallback.
+                */
+               arr_length = num_empty_blocks_orig;
+               num_blocks = MS_BLOCK_ALLOC_NUM;
+               while (num_empty_blocks > section_reserve && num_blocks > 1) {
+                       int first = -1;
+                       int dest = 0;
+
+                       dest = 0;
+                       for (i = 0; i < arr_length; ++i) {
+                               int d = dest;
+                               void *block = empty_block_arr [i];
+                               SGEN_ASSERT (0, block, "we're not shifting correctly");
+                               if (i != dest) {
+                                       empty_block_arr [dest] = block;
+                                       /*
+                                        * This is not strictly necessary, but we're
+                                        * cautious.
+                                        */
+                                       empty_block_arr [i] = NULL;
+                               }
+                               ++dest;
+
+                               if (first < 0) {
+                                       first = d;
+                                       continue;
+                               }
+
+                               SGEN_ASSERT (0, first >= 0 && d > first, "algorithm is wrong");
+
+                               if ((char*)block != ((char*)empty_block_arr [d-1]) + MS_BLOCK_SIZE) {
+                                       first = d;
+                                       continue;
+                               }
+
+                               if (d + 1 - first == num_blocks) {
+                                       /*
+                                        * We found num_blocks contiguous blocks.  Free them
+                                        * and null their array entries.  As an optimization
+                                        * we could, instead of nulling the entries, shift
+                                        * the following entries over to the left, while
+                                        * we're iterating.
+                                        */
+                                       int j;
+                                       sgen_free_os_memory (empty_block_arr [first], MS_BLOCK_SIZE * num_blocks, SGEN_ALLOC_HEAP);
+                                       for (j = first; j <= d; ++j)
+                                               empty_block_arr [j] = NULL;
+                                       dest = first;
+                                       first = -1;
+
+                                       num_empty_blocks -= num_blocks;
+
+                                       stat_major_blocks_freed += num_blocks;
+                                       if (num_blocks == MS_BLOCK_ALLOC_NUM)
+                                               stat_major_blocks_freed_ideal += num_blocks;
+                                       else
+                                               stat_major_blocks_freed_less_ideal += num_blocks;
+
+                               }
+                       }
+
+                       SGEN_ASSERT (0, dest <= i && dest <= arr_length, "array length is off");
+                       arr_length = dest;
+                       SGEN_ASSERT (0, arr_length == num_empty_blocks, "array length is off");
+
+                       num_blocks >>= 1;
+               }
+
+               /* rebuild empty_blocks free list */
+               rebuild_next = (void**)&empty_blocks;
+               for (i = 0; i < arr_length; ++i) {
+                       void *block = empty_block_arr [i];
+                       SGEN_ASSERT (0, block, "we're missing blocks");
+                       *rebuild_next = block;
+                       rebuild_next = (void**)block;
+               }
+               *rebuild_next = NULL;
+
+               /* free array */
+               sgen_free_internal_dynamic (empty_block_arr, sizeof (void*) * num_empty_blocks_orig, INTERNAL_MEM_MS_BLOCK_INFO_SORT);
+       }
+
+       SGEN_ASSERT (0, num_empty_blocks >= 0, "we freed more blocks than we had in the first place?");
+
+ fallback:
        /*
-        * FIXME: We don't free blocks on 32 bit platforms because it
-        * can lead to address space fragmentation, since we're
-        * allocating blocks in larger contingents.
+        * This is our threshold.  If there's not more empty than used blocks, we won't
+        * release uncontiguous blocks, in fear of fragmenting the address space.
         */
-       if (sizeof (mword) < 8)
+       if (num_empty_blocks <= num_major_sections)
                return;
+#endif
 
        while (num_empty_blocks > section_reserve) {
                void *next = *(void**)empty_blocks;
@@ -1871,6 +2019,9 @@ major_have_computer_minor_collection_allowance (void)
                --num_empty_blocks;
 
                ++stat_major_blocks_freed;
+#if SIZEOF_VOID_P != 8
+               ++stat_major_blocks_freed_individual;
+#endif
        }
 #endif
 }
@@ -2208,25 +2359,21 @@ update_cardtable_mod_union (void)
        MSBlockInfo *block;
 
        FOREACH_BLOCK (block) {
-               guint8 *cards;
-               gboolean init = FALSE;
+               size_t num_cards;
 
-               if (!block->cardtable_mod_union) {
-                       block->cardtable_mod_union = sgen_alloc_internal_dynamic (CARDS_PER_BLOCK,
-                                       INTERNAL_MEM_CARDTABLE_MOD_UNION, TRUE);
-                       init = TRUE;
-               }
+               block->cardtable_mod_union = sgen_card_table_update_mod_union (block->cardtable_mod_union,
+                               block->block, MS_BLOCK_SIZE, &num_cards);
 
-               cards = sgen_card_table_get_card_scan_address ((mword)block->block);
-               if (init) {
-                       memcpy (block->cardtable_mod_union, cards, CARDS_PER_BLOCK);
-               } else {
-                       int i;
-                       for (i = 0; i < CARDS_PER_BLOCK; ++i)
-                               block->cardtable_mod_union [i] |= cards [i];
-               }
+               SGEN_ASSERT (0, num_cards == CARDS_PER_BLOCK, "Number of cards calculation is wrong");
        } END_FOREACH_BLOCK;
 }
+
+static guint8*
+major_get_cardtable_mod_union_for_object (char *obj)
+{
+       MSBlockInfo *block = MS_BLOCK_FOR_OBJ (obj);
+       return &block->cardtable_mod_union [(obj - (char*)sgen_card_table_align_pointer (block->block)) >> CARD_BITS];
+}
 #endif
 
 static void
@@ -2348,6 +2495,13 @@ sgen_marksweep_fixed_init (SgenMajorCollector *collector)
        mono_counters_register ("# major blocks freed", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_major_blocks_freed);
        mono_counters_register ("# major blocks lazy swept", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_major_blocks_lazy_swept);
        mono_counters_register ("# major objects evacuated", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_major_objects_evacuated);
+#if SIZEOF_VOID_P != 8
+       mono_counters_register ("# major blocks freed ideally", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_major_blocks_freed_ideal);
+       mono_counters_register ("# major blocks freed less ideally", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_major_blocks_freed_less_ideal);
+       mono_counters_register ("# major blocks freed individually", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_major_blocks_freed_individual);
+       mono_counters_register ("# major blocks allocated less ideally", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_major_blocks_alloced_less_ideal);
+#endif
+
 #ifdef SGEN_PARALLEL_MARK
 #ifndef HAVE_KW_THREAD
        mono_native_tls_alloc (&workers_free_block_lists_key, NULL);
@@ -2397,8 +2551,10 @@ sgen_marksweep_fixed_init (SgenMajorCollector *collector)
        collector->scan_card_table = major_scan_card_table;
        collector->iterate_live_block_ranges = (void*)(void*) major_iterate_live_block_ranges;
 #ifdef SGEN_HAVE_CONCURRENT_MARK
-       if (is_concurrent)
+       if (is_concurrent) {
                collector->update_cardtable_mod_union = update_cardtable_mod_union;
+               collector->get_cardtable_mod_union_for_object = major_get_cardtable_mod_union_for_object;
+       }
 #endif
        collector->init_to_space = major_init_to_space;
        collector->sweep = major_sweep;
index 9d9944f43ab02f1383f76669c166ba929582a739..9ada778bc7460520a599b808cd156eaaa734d48e 100644 (file)
@@ -306,7 +306,7 @@ sgen_cement_lookup_or_register (char *obj)
        ++hash [i].count;
        if (hash [i].count == SGEN_CEMENT_THRESHOLD) {
                if (G_UNLIKELY (MONO_GC_OBJ_CEMENTED_ENABLED())) {
-                       MonoVTable *vt = (MonoVTable*)SGEN_LOAD_VTABLE (obj);
+                       MonoVTable *vt G_GNUC_UNUSED = (MonoVTable*)SGEN_LOAD_VTABLE (obj);
                        MONO_GC_OBJ_CEMENTED ((mword)obj, sgen_safe_object_get_size ((MonoObject*)obj),
                                        vt->klass->name_space, vt->klass->name);
                }
index bd686ee92fc2574b607af449682cba9bc480822a..51a9ccf3c9863f77f573a215829bc17ed64fada3 100644 (file)
 /* If not null, dump binary protocol to this file */
 static FILE *binary_protocol_file = NULL;
 
-static int binary_protocol_use_count = 0;
+/* We set this to -1 to indicate an exclusive lock */
+static volatile int binary_protocol_use_count = 0;
 
 #define BINARY_PROTOCOL_BUFFER_SIZE    (65536 - 2 * 8)
 
 typedef struct _BinaryProtocolBuffer BinaryProtocolBuffer;
 struct _BinaryProtocolBuffer {
-       BinaryProtocolBuffer *next;
-       int index;
+       BinaryProtocolBuffer * volatile next;
+       volatile int index;
        unsigned char buffer [BINARY_PROTOCOL_BUFFER_SIZE];
 };
 
-static BinaryProtocolBuffer *binary_protocol_buffers = NULL;
+static BinaryProtocolBuffer * volatile binary_protocol_buffers = NULL;
 
 void
 binary_protocol_init (const char *filename)
@@ -58,6 +59,53 @@ binary_protocol_is_enabled (void)
        return binary_protocol_file != NULL;
 }
 
+static gboolean
+try_lock_exclusive (void)
+{
+       do {
+               if (binary_protocol_use_count)
+                       return FALSE;
+       } while (InterlockedCompareExchange (&binary_protocol_use_count, -1, 0) != 0);
+       mono_memory_barrier ();
+       return TRUE;
+}
+
+static void
+unlock_exclusive (void)
+{
+       mono_memory_barrier ();
+       SGEN_ASSERT (0, binary_protocol_use_count == -1, "Exclusively locked count must be -1");
+       if (InterlockedCompareExchange (&binary_protocol_use_count, 0, -1) != -1)
+               SGEN_ASSERT (0, FALSE, "Somebody messed with the exclusive lock");
+}
+
+static void
+lock_recursive (void)
+{
+       int old_count;
+       do {
+       retry:
+               old_count = binary_protocol_use_count;
+               if (old_count < 0) {
+                       /* Exclusively locked - retry */
+                       /* FIXME: short back-off */
+                       goto retry;
+               }
+       } while (InterlockedCompareExchange (&binary_protocol_use_count, old_count + 1, old_count) != old_count);
+       mono_memory_barrier ();
+}
+
+static void
+unlock_recursive (void)
+{
+       int old_count;
+       mono_memory_barrier ();
+       do {
+               old_count = binary_protocol_use_count;
+               SGEN_ASSERT (0, old_count > 0, "Locked use count must be at least 1");
+       } while (InterlockedCompareExchange (&binary_protocol_use_count, old_count - 1, old_count) != old_count);
+}
+
 static void
 binary_protocol_flush_buffers_rec (BinaryProtocolBuffer *buffer)
 {
@@ -78,12 +126,15 @@ binary_protocol_flush_buffers (gboolean force)
        if (!binary_protocol_file)
                return;
 
-       if (!force && binary_protocol_use_count != 0)
+       if (!force && !try_lock_exclusive ())
                return;
 
        binary_protocol_flush_buffers_rec (binary_protocol_buffers);
        binary_protocol_buffers = NULL;
 
+       if (!force)
+               unlock_exclusive ();
+
        fflush (binary_protocol_file);
 }
 
@@ -115,15 +166,11 @@ protocol_entry (unsigned char type, gpointer data, int size)
 {
        int index;
        BinaryProtocolBuffer *buffer;
-       int old_count;
 
        if (!binary_protocol_file)
                return;
 
-       do {
-               old_count = binary_protocol_use_count;
-               g_assert (old_count >= 0);
-       } while (InterlockedCompareExchange (&binary_protocol_use_count, old_count + 1, old_count) != old_count);
+       lock_recursive ();
 
  retry:
        buffer = binary_protocol_get_buffer (size + 1);
@@ -144,10 +191,15 @@ protocol_entry (unsigned char type, gpointer data, int size)
 
        g_assert (index <= BINARY_PROTOCOL_BUFFER_SIZE);
 
-       do {
-               old_count = binary_protocol_use_count;
-               g_assert (old_count > 0);
-       } while (InterlockedCompareExchange (&binary_protocol_use_count, old_count - 1, old_count) != old_count);
+       unlock_recursive ();
+}
+
+void
+binary_protocol_collection_force (int generation)
+{
+       SGenProtocolCollectionForce entry = { generation };
+       binary_protocol_flush_buffers (FALSE);
+       protocol_entry (SGEN_PROTOCOL_COLLECTION_FORCE, &entry, sizeof (SGenProtocolCollectionForce));
 }
 
 void
index 9005a6229178386e9a78e59ff6b29071d8272f4c..7b9dff67965e2b53183f9a6d20cfd18dad3aafef 100644 (file)
@@ -25,6 +25,7 @@
 #ifdef SGEN_BINARY_PROTOCOL
 
 enum {
+       SGEN_PROTOCOL_COLLECTION_FORCE,
        SGEN_PROTOCOL_COLLECTION_BEGIN,
        SGEN_PROTOCOL_COLLECTION_END,
        SGEN_PROTOCOL_ALLOC,
@@ -51,6 +52,10 @@ enum {
        SGEN_PROTOCOL_DISLINK_UPDATE
 };
 
+typedef struct {
+       int generation;
+} SGenProtocolCollectionForce;
+
 typedef struct {
        int index, generation;
 } SGenProtocolCollection;
@@ -171,6 +176,7 @@ gboolean binary_protocol_is_enabled (void) MONO_INTERNAL;
 
 void binary_protocol_flush_buffers (gboolean force) MONO_INTERNAL;
 
+void binary_protocol_collection_force (int generation) MONO_INTERNAL;
 void binary_protocol_collection_begin (int index, int generation) MONO_INTERNAL;
 void binary_protocol_collection_end (int index, int generation) MONO_INTERNAL;
 void binary_protocol_alloc (gpointer obj, gpointer vtable, int size) MONO_INTERNAL;
@@ -202,6 +208,7 @@ void binary_protocol_dislink_update (gpointer link, gpointer obj, int track) MON
 #define binary_protocol_is_enabled()   FALSE
 
 #define binary_protocol_flush_buffers(force)
+#define binary_protocol_collection_force(generation)
 #define binary_protocol_collection_begin(index, generation)
 #define binary_protocol_collection_end(index, generation)
 #define binary_protocol_alloc(obj, vtable, size)
index 69a2e9cfa470c3ef9b8381f401de1f840ebb4116..92326a867bb2cf5588aaf17c266fc22b34598e47 100644 (file)
@@ -116,7 +116,7 @@ restart_threads_until_none_in_managed_allocator (void)
                        if (!info->thread_is_dying && (!info->stack_start || info->in_critical_region ||
                                        is_ip_in_managed_allocator (info->stopped_domain, info->stopped_ip))) {
                                binary_protocol_thread_restart ((gpointer)mono_thread_info_get_tid (info));
-                               SGEN_LOG (3, "thread %p resumed.", (void*)info->info.native_handle);
+                               SGEN_LOG (3, "thread %p resumed.", (void*) (size_t) info->info.native_handle);
                                result = sgen_resume_thread (info);
                                if (result) {
                                        ++restart_count;
index 5a6848ea1c1ac28cff0037795a399caf63eadd94..60cb7a527e474b06bef5b358721ec83d7b8d5e8c 100644 (file)
@@ -2045,6 +2045,8 @@ static struct in6_addr ipaddress_to_struct_in6_addr(MonoObject *ipaddr)
 #endif /* AF_INET6 */
 #endif
 
+#if defined(__APPLE__)
+
 #if defined(HAVE_GETIFADDRS) && defined(HAVE_IF_NAMETOINDEX)
 static int
 get_local_interface_id (int family)
@@ -2081,6 +2083,8 @@ get_local_interface_id (int family)
 }
 #endif
 
+#endif /* __APPLE__ */
+
 void ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal(SOCKET sock, gint32 level, gint32 name, MonoObject *obj_val, MonoArray *byte_val, gint32 int_val, gint32 *error)
 {
        struct linger linger;
index e8a2f1a45741b3248d33e1a1ed238c1d91c81d17..ce24682d51383a1b9d149a062a6d2f9d5a3b2fe2 100644 (file)
@@ -29,6 +29,7 @@
 #include <mono/utils/mono-time.h>
 #include <mono/utils/mono-proclib.h>
 #include <mono/utils/mono-semaphore.h>
+#include <mono/utils/atomic.h>
 #include <errno.h>
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
index 33c01926d95c8659e0227531511f5d43406a0bc8..ad6e0b2a310e203ddb720fdfd965b79b420aea1d 100644 (file)
@@ -47,6 +47,7 @@
 #include <mono/utils/mono-threads.h>
 #include <mono/utils/hazard-pointer.h>
 #include <mono/utils/mono-tls.h>
+#include <mono/utils/atomic.h>
 
 #include <mono/metadata/gc-internal.h>
 
@@ -815,10 +816,22 @@ mono_thread_get_stack_bounds (guint8 **staddr, size_t *stsize)
        *staddr = (guint8*)((gssize)*staddr & ~(mono_pagesize () - 1));
        return;
        /* FIXME: simplify the mess below */
-#elif !defined(HOST_WIN32)
+#elif defined(HOST_WIN32)
+       /* http://en.wikipedia.org/wiki/Win32_Thread_Information_Block */
+       void* tib = (void*)__readfsdword(0x18);
+       guint8 *stackTop = (guint8*)*(int*)((char*)tib + 4);
+       guint8 *stackBottom = (guint8*)*(int*)((char*)tib + 8);
+
+       *staddr = stackBottom;
+       *stsize = stackTop - stackBottom;
+       return;
+#else
        pthread_attr_t attr;
        guint8 *current = (guint8*)&attr;
 
+       *staddr = NULL;
+       *stsize = (size_t)-1;
+
        pthread_attr_init (&attr);
 #  ifdef HAVE_PTHREAD_GETATTR_NP
        pthread_getattr_np (pthread_self(), &attr);
@@ -853,9 +866,6 @@ mono_thread_get_stack_bounds (guint8 **staddr, size_t *stsize)
 #  endif
 
        pthread_attr_destroy (&attr);
-#else
-       *staddr = NULL;
-       *stsize = (size_t)-1;
 #endif
 
        /* When running under emacs, sometimes staddr is not aligned to a page size */
@@ -3465,6 +3475,10 @@ collect_appdomain_thread (gpointer key, gpointer value, gpointer user_data)
 gboolean
 mono_threads_abort_appdomain_threads (MonoDomain *domain, int timeout)
 {
+#ifdef __native_client__
+       return FALSE;
+#endif
+
        abort_appdomain_data user_data;
        guint32 start_time;
        int orig_timeout = timeout;
@@ -4440,6 +4454,10 @@ mono_runtime_has_tls_get (void)
 int
 mono_thread_kill (MonoInternalThread *thread, int signal)
 {
+#ifdef __native_client__
+       /* Workaround pthread_kill abort() in NaCl glibc. */
+       return -1;
+#endif
 #ifdef HOST_WIN32
        /* Win32 uses QueueUserAPC and callers of this are guarded */
        g_assert_not_reached ();
index 21396bfb853a6f69a6bce3fd670d7c0e9b3fefec..552f32cf297f3f8ead8f7773c5121de116cbaa8a 100644 (file)
@@ -414,6 +414,10 @@ test_sources =                     \
        gshared.cs
 
 regtests=basic.exe basic-float.exe basic-long.exe basic-calls.exe objects.exe arrays.exe basic-math.exe exceptions.exe iltests.exe devirtualization.exe generics.exe basic-simd.exe
+if NACL_CODEGEN
+test_sources += nacl.cs
+regtests += nacl.exe
+endif
 
 if X86
 if MONO_DEBUGGER_SUPPORTED
@@ -553,10 +557,10 @@ libmonoinclude_HEADERS = jit.h
 
 CSFLAGS = -unsafe -nowarn:0219,0169,0414,0649
 
-basic-simd.exe: basic-simd.cs
+basic-simd.exe: basic-simd.cs TestDriver.dll
        $(MCS) -out:$@ $(CSFLAGS) $< -r:TestDriver.dll -r:Mono.Simd.dll
 
-nacl.exe: nacl.cs
+nacl.exe: nacl.cs TestDriver.dll
        $(MCS) -out:$@ $(CSFLAGS) $< -r:TestDriver.dll -r:Mono.Simd.dll
 
 generics.exe: generics.cs TestDriver.dll generics-variant-types.dll
@@ -591,7 +595,11 @@ endif !NACL_CODEGEN
 if CROSS_COMPILING
 GENMDESC_PRG=perl $(srcdir)/genmdesc.pl $(arch_define) $(srcdir) $(GENMDESC_OPTS)
 else !CROSS_COMPILING
+if NACL_CODEGEN
+GENMDESC_PRG=perl $(srcdir)/genmdesc.pl $(arch_define) $(srcdir) $(GENMDESC_OPTS)
+else
 GENMDESC_PRG=./genmdesc $(GENMDESC_OPTS)
+endif
 endif !CROSS_COMPILING
 
 cpu-x86.h: cpu-x86.md genmdesc$(EXEEXT)
@@ -632,7 +640,11 @@ checktests: $(regtests)
        for i in $(regtests); do $(RUNTIME) $$i; done
 
 rcheck: mono $(regtests)
+if NACL_CODEGEN
+       for i in $(regtests); do echo "running test $$i"; $(RUNTIME) $$i --exclude 'NaClDisable' || exit 1; done
+else
        $(RUNTIME) --regression $(regtests)
+endif
 
 gctest: mono gc-test.exe
        MONO_DEBUG_OPTIONS=clear-nursery-at-gc $(RUNTIME) --regression gc-test.exe
index e18cc14c779eea521e9f3ab6e33a60ac31e7be14..55fd1e6fe09e7096f7578ab16c891b619d9934cf 100644 (file)
@@ -2841,8 +2841,6 @@ get_plt_entry (MonoAotCompile *acfg, MonoJumpInfo *patch_info)
 
                new_ji = mono_patch_info_dup_mp (acfg->mempool, patch_info);
 
-               // g_assert (mono_patch_info_equal (patch_info, new_ji));
-
                res = mono_mempool_alloc0 (acfg->mempool, sizeof (MonoPltEntry));
                res->plt_offset = acfg->plt_offset;
                res->ji = new_ji;
@@ -2858,6 +2856,10 @@ get_plt_entry (MonoAotCompile *acfg, MonoJumpInfo *patch_info)
 
                g_hash_table_insert (acfg->plt_offset_to_entry, GUINT_TO_POINTER (res->plt_offset), res);
 
+               //g_assert (mono_patch_info_equal (patch_info, new_ji));
+               //mono_print_ji (patch_info); printf ("\n");
+               //g_hash_table_print_stats (acfg->patch_to_plt_entry);
+
                acfg->plt_offset ++;
        }
 
@@ -3580,7 +3582,8 @@ add_wrappers (MonoAotCompile *acfg)
                        continue;
                }
 
-               if (klass->valuetype && !klass->generic_container && can_marshal_struct (klass)) {
+               if (klass->valuetype && !klass->generic_container && can_marshal_struct (klass) &&
+                       !(klass->nested_in && strstr (klass->nested_in->name, "<PrivateImplementationDetails>") == klass->nested_in->name)) {
                        add_method (acfg, mono_marshal_get_struct_to_ptr (klass));
                        add_method (acfg, mono_marshal_get_ptr_to_struct (klass));
                }
@@ -6162,7 +6165,7 @@ compile_method (MonoAotCompile *acfg, MonoMethod *method)
                        case MONO_PATCH_INFO_VTABLE: {
                                MonoClass *klass = patch_info->data.klass;
 
-                               if (klass->generic_class && !mono_generic_context_is_sharable (&klass->generic_class->context, FALSE))
+                               if (klass->generic_class && !mini_class_is_generic_sharable (klass))
                                        add_generic_class_with_depth (acfg, klass, depth + 5, "vtable");
                                break;
                        }
index 878bf7adeaafac1ab23f0324e637432dcc180a4d..ef06a3aac2294768e8c1d50b3cb1d30a54a2e990 100644 (file)
@@ -1840,7 +1840,9 @@ mono_aot_init (void)
        InitializeCriticalSection (&aot_page_mutex);
        aot_modules = g_hash_table_new (NULL, NULL);
 
+#ifndef __native_client__
        mono_install_assembly_load_hook (load_aot_module, NULL);
+#endif
 
        if (g_getenv ("MONO_LASTAOT"))
                mono_last_aot_method = atoi (g_getenv ("MONO_LASTAOT"));
@@ -2118,7 +2120,17 @@ decode_llvm_mono_eh_frame (MonoAotModule *amodule, MonoDomain *domain,
        cie = p + ((fde_count + 1) * 8);
 
        /* Binary search in the table to find the entry for code */
-       offset = code - amodule->mono_eh_frame;
+       if (func_encoding == DW_EH_PE_absptr) {
+               /*
+                * Table entries are encoded as DW_EH_PE_absptr, because the ios linker can move functions inside object files to make thumb work,
+                * so the offsets between two symbols in the text segment are not assembler constant.
+                */
+               g_assert (sizeof(gpointer) == 4);
+               offset = GPOINTER_TO_INT (code);
+       } else {
+               /* Table entries are encoded as DW_EH_PE_pcrel relative to mono_eh_frame */
+               offset = code - amodule->mono_eh_frame;
+       }
 
        left = 0;
        right = fde_count;
@@ -2127,23 +2139,14 @@ decode_llvm_mono_eh_frame (MonoAotModule *amodule, MonoDomain *domain,
 
                offset1 = table [(pos * 2)];
                if (pos + 1 == fde_count) {
-                       /* FIXME: */
-                       offset2 = amodule->code_end - amodule->code;
+                       if (func_encoding == DW_EH_PE_absptr)
+                               offset2 = GPOINTER_TO_INT (amodule->code_end);
+                       else
+                               offset2 = amodule->code_end - amodule->code;
                } else {
-                       /* Encoded as DW_EH_PE_pcrel, but relative to mono_eh_frame */
                        offset2 = table [(pos + 1) * 2];
                }
 
-               if (func_encoding == DW_EH_PE_absptr) {
-                       /*
-                        * Encoded as DW_EH_PE_absptr, because the ios linker can move functions inside object files to make thumb work,
-                        * so the offsets between two symbols in the text segment are not assembler constant.
-                        */
-                       g_assert (sizeof(gpointer) == 4);
-                       offset1 -= (gint32)(gsize)amodule->mono_eh_frame;
-                       offset2 -= (gint32)(gsize)amodule->mono_eh_frame;
-               }
-
                if (offset < offset1)
                        right = pos;
                else if (offset >= offset2)
index e52c2c70e9daa25244c4f8c8bd2bb2a85b6a0341..e65e30a203f73d038a0ead499237957e72e07157 100644 (file)
@@ -25,8 +25,8 @@ using System.Reflection;
 
 class Tests {
 
-       static int Main () {
-               return TestDriver.RunTests (typeof (Tests));
+       public static int Main (string[] args) {
+               return TestDriver.RunTests (typeof (Tests), args);
        }
        
        public static int test_10_create () {
index 5ad874b3dfaf90d4ab35b0f176b809ef6b29b5c2..d6bd503a954367d02848eb1a58c9430118550352 100644 (file)
@@ -25,8 +25,8 @@ using System.Reflection;
 
 class Tests {
 
-       static int Main () {
-               return TestDriver.RunTests (typeof (Tests));
+       public static int Main (string[] args) {
+               return TestDriver.RunTests (typeof (Tests), args);
        }
 
        static void dummy () {
index df8f6666f0d4b2c3144cd7730a74f52a09851393..bf8c50cb4221eb5183e03fca31a97fe1152f2cf3 100644 (file)
@@ -28,8 +28,8 @@ using System.Reflection;
 
 class Tests {
 
-       public static int Main () {
-               return TestDriver.RunTests (typeof (Tests));
+       public static int Main (string[] args) {
+               return TestDriver.RunTests (typeof (Tests), args);
        }
        
        public static int test_0_beq () {
index 19c33016558ce9370177433000f1f37c5ba24f5d..45c67fe2c3a49188bf9b38ccfa2b12d9f8f65d86 100644 (file)
@@ -25,8 +25,8 @@ using System.Reflection;
 
 class Tests {
 
-       public static int Main () {
-               return TestDriver.RunTests (typeof (Tests));
+       public static int Main (string[] args) {
+               return TestDriver.RunTests (typeof (Tests), args);
        }
 
        public static int test_10_simple_cast () {
index d2fa1ede9bc9317e245a730a233024d36f6bc81c..4482c913af6f88513c7e0465b2f6b954ce78e6da 100644 (file)
@@ -25,8 +25,8 @@ using System.Reflection;
 
 class Tests {
 
-       public static int Main () {
-               return TestDriver.RunTests (typeof (Tests));
+       public static int Main (string[] args) {
+               return TestDriver.RunTests (typeof (Tests), args);
        }
        
        public static int test_0_sin_precision () {
index b700efa87e39503de0291560b09a388d4600241e..b9cf91347b2cf11ec9c5cbc8f0071809989fec5d 100644 (file)
@@ -25,8 +25,8 @@ using System.Reflection;
 
 class Tests {
 
-       static int Main () {
-               return TestDriver.RunTests (typeof (Tests));
+       public static int Main (string[] args) {
+               return TestDriver.RunTests (typeof (Tests), args);
        }
        
        public static int test_0_return () {
@@ -1361,4 +1361,4 @@ class Tests {
 
                return k == -32768 ? 0 : 1;
        }
-}
\ No newline at end of file
+}
index 53ed0755411e7a8495e061e605a45123aaf322b3..e798aa6a51596194181020b80be6ed42aed57c47 100644 (file)
@@ -318,6 +318,9 @@ sext_i1: dest:i src1:i len:4
 sext_i2: dest:i src1:i len:4
 sext_i4: dest:i src1:i len:8
 
+laddcc: dest:i src1:i src2:i len:3 clob:1
+lsubcc: dest:i src1:i src2:i len:3 clob:1
+
 # 32 bit opcodes
 int_add: dest:i src1:i src2:i clob:1 len:4 nacl:7
 int_sub: dest:i src1:i src2:i clob:1 len:4 nacl:7
index 27ecadba8b95f92abb0127c7801c668f91bc2b79..0d6b237be0398aa345cd2f5f331853cb36126225 100644 (file)
@@ -2939,16 +2939,13 @@ get_seq_points (MonoDomain *domain, MonoMethod *method)
        return seq_points;
 }
 
-static MonoSeqPointInfo*
-find_seq_points (MonoDomain *domain, MonoMethod *method)
+static void
+no_seq_points_found (MonoMethod *method)
 {
-       MonoSeqPointInfo *seq_points = get_seq_points (domain, method);
-
-       if (!seq_points)
-               printf ("Unable to find seq points for method '%s'.\n", mono_method_full_name (method, TRUE));
-       g_assert (seq_points);
-
-       return seq_points;
+       /*
+        * This can happen in full-aot mode with assemblies AOTed without the 'soft-debug' option to save space.
+        */
+       printf ("Unable to find seq points for method '%s'.\n", mono_method_full_name (method, TRUE));
 }
 
 /*
@@ -2962,7 +2959,12 @@ find_next_seq_point_for_native_offset (MonoDomain *domain, MonoMethod *method, g
        MonoSeqPointInfo *seq_points;
        int i;
 
-       seq_points = find_seq_points (domain, method);
+       seq_points = get_seq_points (domain, method);
+       if (!seq_points) {
+               if (info)
+                       *info = NULL;
+               return NULL;
+       }
        g_assert (seq_points);
        if (info)
                *info = seq_points;
@@ -4406,6 +4408,8 @@ process_breakpoint_inner (DebuggerTlsData *tls)
         * the offset recorded in the seq point map, so find the prev seq point before ip.
         */
        sp = find_prev_seq_point_for_native_offset (mono_domain_get (), ji->method, native_offset, &info);
+       if (!sp)
+               no_seq_points_found (ji->method);
        g_assert (sp);
 
        DEBUG(1, fprintf (log_file, "[%p] Breakpoint hit, method=%s, ip=%p, offset=0x%x, sp il offset=0x%x.\n", (gpointer)GetCurrentThreadId (), ji->method->name, ip, native_offset, sp ? sp->il_offset : -1));
@@ -4936,13 +4940,16 @@ ss_start (SingleStepReq *ss_req, MonoMethod *method, SeqPoint *sp, MonoSeqPointI
                        // There could be method calls before the next seq point in the caller when using nested calls
                        //enable_global = TRUE;
                } else {
-                       while (sp && sp->next_len == 0) {
+                       if (sp && sp->next_len == 0) {
                                sp = NULL;
-                               if (frame_index < tls->frame_count) {
+                               while (frame_index < tls->frame_count) {
                                        StackFrame *frame = tls->frames [frame_index];
 
                                        method = frame->method;
                                        sp = find_prev_seq_point_for_native_offset (frame->domain, frame->method, frame->native_offset, &info);
+                                       if (sp && sp->next_len != 0)
+                                               break;
+                                       sp = NULL;
                                        frame_index ++;
                                }
                        }
@@ -5064,6 +5071,8 @@ ss_create (MonoInternalThread *thread, StepSize size, StepDepth depth, EventRequ
                 * point after ip.
                 */
                sp = find_next_seq_point_for_native_offset (frame.domain, frame.method, frame.native_offset, &info);
+               if (!sp)
+                       no_seq_points_found (frame.method);
                g_assert (sp);
 
                method = frame.method;
@@ -5108,6 +5117,8 @@ ss_create (MonoInternalThread *thread, StepSize size, StepDepth depth, EventRequ
                        if (!method && frame->il_offset != -1) {
                                /* FIXME: Sort the table and use a binary search */
                                sp = find_prev_seq_point_for_native_offset (frame->domain, frame->method, frame->native_offset, &info);
+                               if (!sp)
+                                       no_seq_points_found (frame->method);
                                g_assert (sp);
                                method = frame->method;
                        }
index 7504a05bea51a90bb0d53cfc121268bfde645819..b86678d4e2305694c31a6a5706e162f09f10af0e 100644 (file)
@@ -53,14 +53,30 @@ decompose_long_opcode (MonoCompile *cfg, MonoInst *ins, MonoInst **repl_ins)
        case OP_LADD_OVF:
                if (COMPILE_LLVM (cfg))
                        break;
-               EMIT_NEW_BIALU (cfg, repl, OP_ADDCC, ins->dreg, ins->sreg1, ins->sreg2);
+               {
+                       int opcode;
+#if defined(__mono_ilp32__) && SIZEOF_REGISTER == 8
+                       opcode = OP_LADDCC;
+#else
+                       opcode = OP_ADDCC;
+#endif
+                       EMIT_NEW_BIALU (cfg, repl, opcode, ins->dreg, ins->sreg1, ins->sreg2);
+               }
                MONO_EMIT_NEW_COND_EXC (cfg, OV, "OverflowException");
                NULLIFY_INS (ins);
                break;
        case OP_LADD_OVF_UN:
                if (COMPILE_LLVM (cfg))
                        break;
-               EMIT_NEW_BIALU (cfg, repl, OP_ADDCC, ins->dreg, ins->sreg1, ins->sreg2);
+               {
+                       int opcode;
+#if defined(__mono_ilp32__) && SIZEOF_REGISTER == 8
+                       opcode = OP_LADDCC;
+#else
+                       opcode = OP_ADDCC;
+#endif
+                       EMIT_NEW_BIALU (cfg, repl, opcode, ins->dreg, ins->sreg1, ins->sreg2);
+               }
                MONO_EMIT_NEW_COND_EXC (cfg, C, "OverflowException");
                NULLIFY_INS (ins);
                break;
@@ -68,14 +84,30 @@ decompose_long_opcode (MonoCompile *cfg, MonoInst *ins, MonoInst **repl_ins)
        case OP_LSUB_OVF:
                if (COMPILE_LLVM (cfg))
                        break;
-               EMIT_NEW_BIALU (cfg, repl, OP_SUBCC, ins->dreg, ins->sreg1, ins->sreg2);
+               {
+                       int opcode;
+#if defined(__mono_ilp32__) && SIZEOF_REGISTER == 8
+                       opcode = OP_LSUBCC;
+#else
+                       opcode = OP_SUBCC;
+#endif
+                       EMIT_NEW_BIALU (cfg, repl, opcode, ins->dreg, ins->sreg1, ins->sreg2);
+               }
                MONO_EMIT_NEW_COND_EXC (cfg, OV, "OverflowException");
                NULLIFY_INS (ins);
                break;
        case OP_LSUB_OVF_UN:
                if (COMPILE_LLVM (cfg))
                        break;
-               EMIT_NEW_BIALU (cfg, repl, OP_SUBCC, ins->dreg, ins->sreg1, ins->sreg2);
+               {
+                       int opcode;
+#if defined(__mono_ilp32__) && SIZEOF_REGISTER == 8
+                       opcode = OP_LSUBCC;
+#else
+                       opcode = OP_SUBCC;
+#endif
+                       EMIT_NEW_BIALU (cfg, repl, opcode, ins->dreg, ins->sreg1, ins->sreg2);
+               }
                MONO_EMIT_NEW_COND_EXC (cfg, C, "OverflowException");
                NULLIFY_INS (ins);
                break;
@@ -326,7 +358,7 @@ mono_decompose_opcode (MonoCompile *cfg, MonoInst *ins)
                break;
        case OP_ICONV_TO_OVF_U4:
        case OP_ICONV_TO_OVF_I4_UN:
-#if SIZEOF_REGISTER == 4
+#if SIZEOF_VOID_P == 4
        case OP_ICONV_TO_OVF_U:
        case OP_ICONV_TO_OVF_I_UN:
 #endif
@@ -339,21 +371,21 @@ mono_decompose_opcode (MonoCompile *cfg, MonoInst *ins)
        case OP_ICONV_TO_U4:
        case OP_ICONV_TO_OVF_I4:
        case OP_ICONV_TO_OVF_U4_UN:
-#if SIZEOF_REGISTER == 4
+#if SIZEOF_VOID_P == 4
        case OP_ICONV_TO_OVF_I:
        case OP_ICONV_TO_OVF_U_UN:
 #endif
                ins->opcode = OP_MOVE;
                break;
        case OP_ICONV_TO_I:
-#if SIZEOF_REGISTER == 8
+#if SIZEOF_VOID_P == 8
                ins->opcode = OP_SEXT_I4;
 #else
                ins->opcode = OP_MOVE;
 #endif
                break;
        case OP_ICONV_TO_U:
-#if SIZEOF_REGISTER == 8
+#if SIZEOF_VOID_P == 8
                ins->opcode = OP_ZEXT_I4;
 #else
                ins->opcode = OP_MOVE;
@@ -1218,9 +1250,13 @@ mono_decompose_vtype_opts (MonoCompile *cfg)
                                                case 2:
                                                        MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STOREI2_MEMBASE_REG, dest->dreg, 0, call2->inst.dreg);
                                                        break;
+                                               case 3:
                                                case 4:
                                                        MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STOREI4_MEMBASE_REG, dest->dreg, 0, call2->inst.dreg);
                                                        break;
+                                               case 5:
+                                               case 6:
+                                               case 7:
                                                case 8:
 #if SIZEOF_REGISTER == 4
                                                        /*
@@ -1361,8 +1397,9 @@ mono_decompose_array_access_opts (MonoCompile *cfg)
                                                dest = mono_emit_jit_icall (cfg, mono_array_new, iargs);
                                                dest->dreg = ins->dreg;
                                        } else {
-                                               MonoVTable *vtable = mono_class_vtable (cfg->domain, mono_array_class_get (ins->inst_newa_class, 1));
-                                               MonoMethod *managed_alloc = mono_gc_get_managed_array_allocator (vtable, 1);
+                                               MonoClass *array_class = mono_array_class_get (ins->inst_newa_class, 1);
+                                               MonoVTable *vtable = mono_class_vtable (cfg->domain, array_class);
+                                               MonoMethod *managed_alloc = mono_gc_get_managed_array_allocator (array_class);
 
                                                g_assert (vtable); /*This shall not fail since we check for this condition on OP_NEWARR creation*/
                                                NEW_VTABLECONST (cfg, iargs [0], vtable);
index 8c67f6db6d567e64a2b4868de53ce72a33813d5b..dc73ec4fbfe172e1458975061a0112709c2c5216 100644 (file)
@@ -1423,6 +1423,9 @@ mono_main (int argc, char* argv[])
 #ifdef HOST_WIN32
        int mixed_mode = FALSE;
 #endif
+#ifdef __native_client__
+       gboolean nacl_null_checks_off = FALSE;
+#endif
 
 #ifdef MOONLIGHT
 #ifndef HOST_WIN32
@@ -1727,6 +1730,8 @@ mono_main (int argc, char* argv[])
 #ifdef __native_client__
                } else if (strcmp (argv [i], "--nacl-mono-path") == 0){
                        nacl_mono_path = g_strdup(argv[++i]);
+               } else if (strcmp (argv [i], "--nacl-null-checks-off") == 0){
+                       nacl_null_checks_off = TRUE;
 #endif
                } else {
                        fprintf (stderr, "Unknown command line option: '%s'\n", argv [i]);
@@ -1739,6 +1744,10 @@ mono_main (int argc, char* argv[])
        {
                nacl_align_byte = -1; /* 0xff */
        }
+       if (!nacl_null_checks_off) {
+               MonoDebugOptions *opt = mini_get_debug_options ();
+               opt->explicit_null_checks = TRUE;
+       }
 #endif
 
        if (!argv [i]) {
@@ -1950,7 +1959,7 @@ mono_main (int argc, char* argv[])
         * This used to be an amd64 only crash, but it looks like now most glibc targets do unwinding
         * that requires reading the target code.
         */
-#ifdef __linux__
+#if defined( __linux__ ) || defined( __native_client__ )
                mono_dont_free_global_codeman = TRUE;
 #endif
 
index 20d7ad41e4d3e9c54c46f27dbe92059fe0bcb51c..575654b67e3ca63724d4f5f70b7201fd356a9277 100644 (file)
@@ -493,6 +493,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
        return FALSE;
 }
 
+#if MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX
 void
 mono_arch_sigctx_to_monoctx (void *sigctx, MonoContext *mctx)
 {
@@ -504,6 +505,7 @@ mono_arch_monoctx_to_sigctx (MonoContext *mctx, void *ctx)
 {
        mono_monoctx_to_sigctx (mctx, ctx);
 }
+#endif /* MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX */
 
 /*
  * handle_exception:
@@ -546,7 +548,7 @@ get_handle_signal_exception_addr (void)
 gboolean
 mono_arch_handle_exception (void *ctx, gpointer obj)
 {
-#if defined(MONO_CROSS_COMPILE)
+#if defined(MONO_CROSS_COMPILE) || !defined(MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX)
        g_assert_not_reached ();
 #elif defined(MONO_ARCH_USE_SIGACTION)
        arm_ucontext *sigctx = ctx;
@@ -598,6 +600,8 @@ mono_arch_ip_from_context (void *sigctx)
 {
 #ifdef MONO_CROSS_COMPILE
        g_assert_not_reached ();
+#elif defined(__native_client__)
+       g_assert_not_reached ();
 #else
        arm_ucontext *my_uc = sigctx;
        return (void*) UCONTEXT_REG_PC (my_uc);
index b3319e56089882eafa789d98b12ac04c7faaa731..49dca8d1ba12e720ceb0b07cf3fd67595e88c161 100644 (file)
@@ -26,8 +26,8 @@ using System.Runtime.CompilerServices;
 
 class Tests {
 
-       public static int Main () {
-               return TestDriver.RunTests (typeof (Tests));
+       public static int Main (string[] args) {
+               return TestDriver.RunTests (typeof (Tests), args);
        }
 
        public static int test_0_catch () {
@@ -1455,6 +1455,7 @@ class Tests {
                return 0;
        }
        
+       [Category ("NaClDisable")]
        public static int test_0_div_zero () {
                int d = 1;
                int q = 0;
@@ -1560,6 +1561,7 @@ class Tests {
                return 0;
        }
 
+       [Category ("NaClDisable")]
        public static int test_0_long_div_zero () {
                long d = 1;
                long q = 0;
diff --git a/mono/mini/fsacheck.c b/mono/mini/fsacheck.c
deleted file mode 100644 (file)
index 6ee66bb..0000000
+++ /dev/null
@@ -1,269 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-
-#include <mono/metadata/appdomain.h>
-#include <mono/metadata/assembly.h>
-#include <mono/metadata/debug-helpers.h>
-#include <mono/metadata/object.h>
-#include <mono/jit/jit.h>
-#include <mono/utils/mono-logger.h>
-
-extern void* mono_aot_module_mscorlib_info;
-extern void* mono_aot_module_System_Core_info;
-extern void* mono_aot_module_System_info;
-extern void* mono_aot_module_Mono_Posix_info;
-extern void* mono_aot_module_System_Configuration_info;
-extern void* mono_aot_module_System_Security_info;
-extern void* mono_aot_module_System_Xml_info;
-/* extern void* mono_aot_module_System_Threading_info; */
-extern void* mono_aot_module_Mono_Security_info;
-extern void* mono_aot_module_Mono_Simd_info;
-extern void* mono_aot_module_TestDriver_info;
-
-extern void* mono_aot_module_basic_info;
-extern void* mono_aot_module_basic_float_info;
-extern void* mono_aot_module_basic_long_info;
-extern void* mono_aot_module_basic_calls_info;
-extern void* mono_aot_module_basic_simd_info;
-extern void* mono_aot_module_objects_info;
-extern void* mono_aot_module_arrays_info;
-extern void* mono_aot_module_basic_math_info;
-extern void* mono_aot_module_exceptions_info;
-extern void* mono_aot_module_devirtualization_info;
-extern void* mono_aot_module_generics_info;
-extern void* mono_aot_module_generics_variant_types_info;
-extern void* mono_aot_module_basic_simd_info;
-extern void* mono_aot_module_gc_stress_info;
-extern void* mono_aot_module_imt_big_iface_test_info;
-extern void* mono_aot_module_make_imt_test_info;
-/* extern void* mono_aot_module_thread_stress_info; */
-extern void* mono_aot_module_iltests_info;
-
-extern void mono_aot_register_module(void *aot_info);
-extern void mono_aot_init(void);
-extern void mono_jit_set_aot_only(mono_bool aot_only);
-extern MonoDomain * mini_init (const char *filename, const char *runtime_version);
-
-int run_all_test_methods(MonoClass *klass) {
-  void * iter = NULL;
-  MonoMethod *mm = NULL;
-  int count = 0;
-  int passed = 0;
-  printf("Running test methods without reflection\n");
-  while (NULL != (mm = mono_class_get_methods(klass, &iter))) {
-    long expected_result;
-    const char *name = mono_method_get_name(mm);
-    char *end = NULL;
-    if (strncmp(name, "test_", 5)) continue;
-    printf("=== Test %d, method %s\n", count, mono_method_get_name(mm));
-    expected_result = strtol(name + 5, &end, 10);
-    if (name == end) {
-      printf(" warning: could not determine expected return value\n");
-      expected_result = 0;
-    }
-    MonoObject *mo = mono_runtime_invoke(mm, NULL, NULL, NULL);
-    int *ret = mono_object_unbox(mo);
-    if (ret && *ret == expected_result) {
-      printf(" passed!\n");
-      passed++;
-    } else {
-      printf(" FAILED, expected %d, returned %p, %d\n", expected_result, ret,
-             ret != NULL ? *ret : 0);
-    }
-    count++;
-  }
-  if (count > 0) {
-    printf("============================================\n");
-    printf("Final count: %d tests, %d pass, %.2f%%\n", count, passed,
-           (double)passed / count * 100.0);
-  } else {
-    printf("no test methods found.\n");
-  }
-  return count;
-}
-
-#if defined(__native_client__)
-extern void* mono_aot_module_nacl_info;
-extern char* nacl_mono_path;
-char *load_corlib_data() {
-  FILE *mscorlib;
-  static char *corlib_data = NULL;
-  if (corlib_data) return corlib_data;
-
-  mscorlib = fopen("mscorlib.dll", "r");
-  if (NULL != mscorlib) {
-    size_t size;
-    struct stat st;
-    if (0 == stat("mscorlib.dll", &st)) {
-      size = st.st_size;
-      printf("reading mscorlib.dll, size %ld\n", size);
-      corlib_data = malloc(size);
-      if (corlib_data != NULL) {
-        while (fread(corlib_data, 1, size, mscorlib) != 0) ;
-        if (!ferror(mscorlib)) {
-          mono_set_corlib_data(corlib_data, size);
-        } else {
-          perror("error reading mscorlib.dll");
-          free(corlib_data);
-          corlib_data = NULL;
-        }
-      } else {
-        perror("Could not allocate memory");
-      }
-    } else {
-      perror("stat error");
-    }
-    fclose(mscorlib);
-  }
-  return corlib_data;
-}
-#endif
-
-/* Initialize Mono. Must run only once per process */
-MonoDomain *init_mono(char *mname) {
-  MonoDomain *domain = NULL;
-#ifdef AOT_VERSION
-  mono_jit_set_aot_only(1);
-  mono_aot_register_module(mono_aot_module_mscorlib_info);
-  mono_aot_register_module(mono_aot_module_TestDriver_info);
-  mono_aot_register_module(mono_aot_module_System_Core_info);
-  mono_aot_register_module(mono_aot_module_System_info);
-  mono_aot_register_module(mono_aot_module_Mono_Posix_info);
-  mono_aot_register_module(mono_aot_module_System_Configuration_info);
-  mono_aot_register_module(mono_aot_module_System_Security_info);
-  mono_aot_register_module(mono_aot_module_System_Xml_info);
-  mono_aot_register_module(mono_aot_module_Mono_Security_info);
-  /*  mono_aot_register_module(mono_aot_module_System_Threading_info); */
-  mono_aot_register_module(mono_aot_module_Mono_Simd_info);
-
-  mono_aot_register_module(mono_aot_module_basic_info);
-  mono_aot_register_module(mono_aot_module_basic_float_info);
-  mono_aot_register_module(mono_aot_module_basic_long_info);
-  mono_aot_register_module(mono_aot_module_basic_calls_info);
-  mono_aot_register_module(mono_aot_module_basic_simd_info);
-  mono_aot_register_module(mono_aot_module_objects_info);
-  mono_aot_register_module(mono_aot_module_arrays_info);
-  mono_aot_register_module(mono_aot_module_basic_math_info);
-  mono_aot_register_module(mono_aot_module_exceptions_info);
-  mono_aot_register_module(mono_aot_module_devirtualization_info);
-  mono_aot_register_module(mono_aot_module_generics_info);
-  mono_aot_register_module(mono_aot_module_generics_variant_types_info);
-  mono_aot_register_module(mono_aot_module_gc_stress_info);
-  mono_aot_register_module(mono_aot_module_imt_big_iface_test_info);
-  mono_aot_register_module(mono_aot_module_iltests_info);
-#endif
-  /* mono_aot_register_module(mono_aot_module_make_imt_test_info); */
-  /* mono_aot_register_module(mono_aot_module_thread_stress_info); */
-#if defined(__native_client__)
-#ifdef AOT_VERSION
-  mono_aot_register_module(mono_aot_module_nacl_info);
-#endif
-
-  /* Test file-less shortcut for loading mscorlib metadata */
-  load_corlib_data();
-  nacl_mono_path = strdup(".");
-#endif
-  /* Uncomment the following if something is going wrong */
-  /* mono_trace_set_level_string("info"); */
-  domain = mono_jit_init(mname);
-  if (NULL == domain) {
-    printf("ERROR: mono_jit_init failure\n");
-    exit(-1);
-  }
-  return domain;
-}
-
-/* Run all tests from one assembly file */
-int try_one(char *mname, MonoDomain *domain) {
-  MonoAssembly *ma;
-  MonoImage *mi;
-  MonoClass *mc;
-  MonoMethodDesc *mmd;
-  MonoMethod *mm;
-  MonoObject *mo;
-  MonoString *monostring_arg;
-  MonoArray *arg_array;
-  int *failures = NULL;
-  const int kUseTestDriver = 1;
-  int test_count = 0;
-  void *args [1];
-  char *cstr_arg = "--timing";
-
-  ma = mono_domain_assembly_open(domain, mname);
-  if (NULL == ma) {
-    printf("ERROR: could not open mono assembly\n");
-    exit(-1);
-  }
-
-  mi = mono_assembly_get_image(ma);
-  if (NULL == mi) {
-    printf("ERROR: could not get assembly image\n");
-    exit(-1);
-  }
-
-  monostring_arg = mono_string_new(domain, cstr_arg);
-  mc = mono_class_from_name(mono_get_corlib(), "System", "String");
-  if (0 == mc) {
-    printf("ERROR: could not mono string class\n");
-    exit(-1);
-  }
-
-  // to pass a string argument, change the 0 to a 1 and uncomment
-  // mono_array_setref below
-  arg_array = mono_array_new(domain, mc, 0);
-  //mono_array_setref(arg_array, 0, monostring_arg);
-  args[0] = arg_array;
-
-  if (!kUseTestDriver) {
-    mc = mono_class_from_name(mi, "", "Tests");
-    if (NULL == mc) {
-      printf("could not open Tests class\n");
-      exit(-1);
-    }
-    test_count = run_all_test_methods(mc);
-  }
-  /* If run_all_test_methods didn't find any tests, try Main */
-  if (kUseTestDriver || test_count == 0) {
-    mmd = mono_method_desc_new("Tests:Main()", 1);
-    mm = mono_method_desc_search_in_image(mmd, mi);
-    if (0 == mm) {
-      mmd = mono_method_desc_new("Tests:Main(string[])", 1);
-      mm = mono_method_desc_search_in_image(mmd, mi);
-      if (0 == mm) {
-        printf("Couldn't find Tests:Main() or Tests:Main(string[])\n");
-        exit(-1);
-      }
-    }
-
-    mo = mono_runtime_invoke(mm, NULL, args, NULL);
-    failures = mo != NULL ? mono_object_unbox(mo) : NULL;
-    if (NULL == failures || *failures != 0) {
-      printf("--------------------> Failed");
-    }
-  }
-  return failures != NULL ? failures : 1;
-}
-
-int main(int argc, char *argv[]) {
-   MonoDomain *domain;
-   int failures = 0;
-
-  if (argc < 2) {
-    printf("no test specified; running basic.exe\n");
-    printf("================================\n");
-    domain = init_mono("basic.exe");
-    try_one("basic.exe", domain);
-  } else {
-    domain = init_mono(argv[1]);
-    int i;
-    for (i = 1; i < argc; i++) {
-      printf("\nRunning tests from %s:\n", argv[i]);
-      printf("===============================\n\n");
-      failures += try_one(argv[i], domain);
-    }
-  }
-  mono_jit_cleanup(domain);
-  return failures;
-}
index b36764385103ed01522b607827f5def0bacf4fdc..fb106aa887259fdf924c053645f0e7e6bdf66388 100644 (file)
@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Runtime.CompilerServices;
 using System.Threading;
+using System.Threading.Tasks;
 
 class Tests {
 
@@ -1020,4 +1021,19 @@ class Tests {
                Volatile.Write (ref foo, "DEF");
                return Volatile.Read (ref foo) == "DEF" ? 0 : 1;
        }
+
+       // FIXME: Doesn't work with --regression as Interlocked.Add(ref long) is only implemented as an intrinsic
+#if FALSE
+       public static async Task<T> FooAsync<T> (int i, int j) {
+               Task<int> t = new Task<int> (delegate () { Console.WriteLine ("HIT!"); return 0; });
+               var response = await t;
+               return default(T);
+       }
+
+       public static int test_0_fullaot_generic_async () {
+               Task<string> t = FooAsync<string> (1, 2);
+               t.RunSynchronously ();
+               return 0;
+       }
+#endif
 }
index 0c942afabafd3a8f47fb18c3352781254e16c441..d00a24b54558c9f617a646f4b9768014bd53a6bd 100644 (file)
 #include <string.h>
 #include <mono/metadata/opcodes.h>
 
+#if defined(__native_client__) || defined(__native_client_codegen__)
+volatile int __nacl_thread_suspension_needed = 0;
+void __nacl_suspend_thread_if_needed() {}
+#endif
+
 #define MINI_OP(a,b,dest,src1,src2) b,
 #define MINI_OP3(a,b,dest,src1,src2,src3) b,
 /* keep in sync with the enum in mini.h */
index 6260b09b0b7cd3d2fae8239fa1743595e3fba7b8..09917f93e4b9b8e39a157fc5c540da1bf0ae0d88 100644 (file)
@@ -314,6 +314,7 @@ mono_draw_graph (MonoCompile *cfg, MonoGraphOptions draw_options)
        char *com;
        const char *fn;
        FILE *fp;
+       int _i G_GNUC_UNUSED;
 
        fn = "/tmp/minidtree.graph";
        fp = fopen (fn, "w+");
@@ -337,7 +338,7 @@ mono_draw_graph (MonoCompile *cfg, MonoGraphOptions draw_options)
 
        //com = g_strdup_printf ("dot %s -Tpng -o %s.png; eog %s.png", fn, fn, fn);
        com = g_strdup_printf ("dot %s -Tps -o %s.ps;gv %s.ps", fn, fn, fn);
-       system (com);
+       _i = system (com);
        g_free (com);
 }
 
index 0e884e0c8e79052ee3fab2c076757fc5a77aa603..d945a39b8f2e4e900c08968e3465ee390e17c6bb 100644 (file)
@@ -130,6 +130,9 @@ mono_blockset_print (MonoCompile *cfg, MonoBitSet *set, const char *name, guint
 void
 mono_disassemble_code (MonoCompile *cfg, guint8 *code, int size, char *id)
 {
+#if defined(__native_client__)
+       return;
+#endif
 #ifndef DISABLE_LOGGING
        GHashTable *offset_to_bb_hash = NULL;
        int i, cindex, bb_num;
index c1d5cc45e8c886c93f4fea9735ef074cb92ffef5..dd2e8ea9083c889a5449f0d22ee26812f4d814cc 100644 (file)
@@ -5,6 +5,9 @@ VER_1 {
               GC_start_blocking;
               GC_end_blocking;
               gc_thread_vtable;
+              __nacl_suspend_thread_if_needed;
+              __nacl_thread_suspension_needed;
+              nacl_mono_path;
       local:
               *;
 };
index 442017d4b56b35ad1dc6aa5b19718b43d1a4bd02..68aef92a34ab218b1b52ec4cd550683a9463a096 100644 (file)
@@ -157,7 +157,7 @@ static MonoMethodSignature *helper_sig_monitor_enter_exit_trampoline_llvm = NULL
 #define FREG 'f'
 #define VREG 'v'
 #define XREG 'x'
-#if SIZEOF_REGISTER == 8
+#if SIZEOF_REGISTER == 8 && SIZEOF_REGISTER == SIZEOF_VOID_P
 #define LREG IREG
 #else
 #define LREG 'l'
@@ -2413,7 +2413,9 @@ static MonoInst*
 mono_emit_method_call_full (MonoCompile *cfg, MonoMethod *method, MonoMethodSignature *sig,
                                                        MonoInst **args, MonoInst *this, MonoInst *imt_arg, MonoInst *rgctx_arg)
 {
+#ifndef DISABLE_REMOTING
        gboolean might_be_remote = FALSE;
+#endif
        gboolean virtual = this != NULL;
        gboolean enable_for_aot = TRUE;
        int context_used;
@@ -7109,6 +7111,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                        gboolean emit_widen = TRUE;
                        gboolean push_res = TRUE;
                        gboolean skip_ret = FALSE;
+                       gboolean delegate_invoke = FALSE;
 
                        CHECK_OPSIZE (5);
                        token = read32 (ip + 1);
@@ -7365,6 +7368,11 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                        if (!calli && check_call_signature (cfg, fsig, sp))
                                UNVERIFIED;
 
+#ifdef MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE
+                       if (cmethod && (cmethod->klass->parent == mono_defaults.multicastdelegate_class) && !strcmp (cmethod->name, "Invoke"))
+                               delegate_invoke = TRUE;
+#endif
+
                        if (cmethod && (cfg->opt & MONO_OPT_INTRINS) && (ins = mini_emit_inst_for_sharable_method (cfg, cmethod, fsig, sp))) {
                                bblock = cfg->cbb;
                                if (!MONO_TYPE_IS_VOID (fsig->ret)) {
@@ -7719,7 +7727,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                        /* Generic sharing */
                        /* FIXME: only do this for generic methods if
                           they are not shared! */
-                       if (context_used && !imt_arg && !array_rank &&
+                       if (context_used && !imt_arg && !array_rank && !delegate_invoke &&
                                (!mono_method_is_generic_sharable_impl (cmethod, TRUE) ||
                                 !mono_class_generic_sharing_enabled (cmethod->klass)) &&
                                (!virtual || MONO_METHOD_IS_FINAL (cmethod) ||
@@ -8405,6 +8413,12 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                                int imm_opcode;
 
                                imm_opcode = mono_op_to_op_imm_noemul (ins->opcode);
+#if defined(MONO_ARCH_EMULATE_MUL_DIV) || defined(MONO_ARCH_EMULATE_DIV)
+                               /* Keep emulated opcodes which are optimized away later */
+                               if ((ins->opcode == OP_IREM_UN || ins->opcode == OP_IDIV_UN_IMM) && (cfg->opt & (MONO_OPT_CONSPROP | MONO_OPT_COPYPROP)) && sp [1]->opcode == OP_ICONST && mono_is_power_of_two (sp [1]->inst_c0) >= 0) {
+                                       imm_opcode = mono_op_to_op_imm (ins->opcode);
+                               }
+#endif
                                if (imm_opcode != -1) {
                                        ins->opcode = imm_opcode;
                                        if (sp [1]->opcode == OP_I8CONST) {
@@ -9313,7 +9327,9 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                case CEE_LDSFLDA:
                case CEE_STSFLD: {
                        MonoClassField *field;
+#ifndef DISABLE_REMOTING
                        int costs;
+#endif
                        guint foffset;
                        gboolean is_instance;
                        int op;
@@ -9904,21 +9920,9 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                        if (context_used) {
                                MonoInst *args [3];
                                MonoClass *array_class = mono_array_class_get (klass, 1);
-                               /* FIXME: we cannot get a managed
-                                  allocator because we can't get the
-                                  open generic class's vtable.  We
-                                  have the same problem in
-                                  handle_alloc().  This
-                                  needs to be solved so that we can
-                                  have managed allocs of shared
-                                  generic classes. */
-                               /*
-                               MonoVTable *array_class_vtable = mono_class_vtable (cfg->domain, array_class);
-                               MonoMethod *managed_alloc = mono_gc_get_managed_array_allocator (array_class_vtable, 1);
-                               */
-                               MonoMethod *managed_alloc = NULL;
+                               MonoMethod *managed_alloc = mono_gc_get_managed_array_allocator (array_class);
 
-                               /* FIXME: Decompose later to help abcrem */
+                               /* FIXME: Use OP_NEWARR and decompose later to help abcrem */
 
                                /* vtable */
                                args [0] = emit_get_rgctx_klass (cfg, context_used,
@@ -12468,6 +12472,7 @@ mono_spill_global_vars (MonoCompile *cfg, gboolean *need_local_opts)
 
                                        ins->dreg = alloc_dreg (cfg, stacktypes [regtype]);
 
+#if SIZEOF_REGISTER != 8
                                        if (regtype == 'l') {
                                                NEW_STORE_MEMBASE (cfg, store_ins, OP_STOREI4_MEMBASE_REG, var->inst_basereg, var->inst_offset + MINI_LS_WORD_OFFSET, ins->dreg + 1);
                                                mono_bblock_insert_after_ins (bb, ins, store_ins);
@@ -12475,7 +12480,9 @@ mono_spill_global_vars (MonoCompile *cfg, gboolean *need_local_opts)
                                                mono_bblock_insert_after_ins (bb, ins, store_ins);
                                                def_ins = store_ins;
                                        }
-                                       else {
+                                       else
+#endif
+                                       {
                                                g_assert (store_opcode != OP_STOREV_MEMBASE);
 
                                                /* Try to fuse the store into the instruction itself */
@@ -12634,6 +12641,7 @@ mono_spill_global_vars (MonoCompile *cfg, gboolean *need_local_opts)
                                                sregs [srcindex] = sreg;
                                                //mono_inst_set_src_registers (ins, sregs);
 
+#if SIZEOF_REGISTER != 8
                                                if (regtype == 'l') {
                                                        NEW_LOAD_MEMBASE (cfg, load_ins, OP_LOADI4_MEMBASE, sreg + 2, var->inst_basereg, var->inst_offset + MINI_MS_WORD_OFFSET);
                                                        mono_bblock_insert_before_ins (bb, ins, load_ins);
@@ -12641,7 +12649,9 @@ mono_spill_global_vars (MonoCompile *cfg, gboolean *need_local_opts)
                                                        mono_bblock_insert_before_ins (bb, ins, load_ins);
                                                        use_ins = load_ins;
                                                }
-                                               else {
+                                               else
+#endif
+                                               {
 #if SIZEOF_REGISTER == 4
                                                        g_assert (load_opcode != OP_LOADI8_MEMBASE);
 #endif
index 0ffbde808daaede7a129fee84dda5355f1695c26..979cb899203caf1cc1312f9be875d931eba03e81 100644 (file)
@@ -999,6 +999,9 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign
                                break;
                        }
                        /* fall through */
+#if defined( __native_client_codegen__ )
+               case MONO_TYPE_TYPEDBYREF:
+#endif
                case MONO_TYPE_VALUETYPE: {
                        guint32 tmp_gr = 0, tmp_fr = 0, tmp_stacksize = 0;
 
@@ -1009,10 +1012,12 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign
                        }
                        break;
                }
+#if !defined( __native_client_codegen__ )
                case MONO_TYPE_TYPEDBYREF:
                        /* Same as a valuetype with size 24 */
                        cinfo->vtype_retaddr = TRUE;
                        break;
+#endif
                case MONO_TYPE_VOID:
                        break;
                default:
@@ -1116,7 +1121,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign
                        add_valuetype (gsctx, sig, ainfo, sig->params [i], FALSE, &gr, &fr, &stack_size);
                        break;
                case MONO_TYPE_TYPEDBYREF:
-#ifdef HOST_WIN32
+#if defined( HOST_WIN32 ) || defined( __native_client_codegen__ )
                        add_valuetype (gsctx, sig, ainfo, sig->params [i], FALSE, &gr, &fr, &stack_size);
 #else
                        stack_size += sizeof (MonoTypedRef);
@@ -1657,7 +1662,7 @@ mono_arch_fill_argument_info (MonoCompile *cfg)
                case ArgInIReg:
                case ArgInFloatSSEReg:
                case ArgInDoubleSSEReg:
-                       if ((MONO_TYPE_ISSTRUCT (sig->ret) && !mono_class_from_mono_type (sig->ret)->enumtype) || (sig->ret->type == MONO_TYPE_TYPEDBYREF)) {
+                       if ((MONO_TYPE_ISSTRUCT (sig->ret) && !mono_class_from_mono_type (sig->ret)->enumtype) || ((sig->ret->type == MONO_TYPE_TYPEDBYREF) && cinfo->vtype_retaddr)) {
                                cfg->vret_addr->opcode = OP_REGVAR;
                                cfg->vret_addr->inst_c0 = cinfo->ret.reg;
                        }
@@ -1771,7 +1776,7 @@ mono_arch_allocate_vars (MonoCompile *cfg)
                case ArgInIReg:
                case ArgInFloatSSEReg:
                case ArgInDoubleSSEReg:
-                       if ((MONO_TYPE_ISSTRUCT (sig->ret) && !mono_class_from_mono_type (sig->ret)->enumtype) || (sig->ret->type == MONO_TYPE_TYPEDBYREF)) {
+                       if ((MONO_TYPE_ISSTRUCT (sig->ret) && !mono_class_from_mono_type (sig->ret)->enumtype) || ((sig->ret->type == MONO_TYPE_TYPEDBYREF) && cinfo->vtype_retaddr)) {
                                if (cfg->globalra) {
                                        cfg->vret_addr->opcode = OP_REGVAR;
                                        cfg->vret_addr->inst_c0 = cinfo->ret.reg;
@@ -3042,7 +3047,10 @@ emit_call_body (MonoCompile *cfg, guint8 *code, guint32 patch_type, gconstpointe
 #ifdef MONO_ARCH_NOMAP32BIT
                near_call = FALSE;
 #endif
-
+#if defined(__native_client__)
+               /* Always use near_call == TRUE for Native Client */
+               near_call = TRUE;
+#endif
                /* The 64bit XEN kernel does not honour the MAP_32BIT flag. (#522894) */
                if (optimize_for_xen)
                        near_call = FALSE;
@@ -3838,16 +3846,6 @@ amd64_pop_reg (code, AMD64_RAX);
 #define bb_is_loop_start(bb) ((bb)->loop_body_start && (bb)->nesting)
 
 #ifndef DISABLE_JIT
-
-#if defined(__native_client__) || defined(__native_client_codegen__)
-void mono_nacl_gc()
-{
-#ifdef __native_client_gc__
-       __nacl_suspend_thread_if_needed();
-#endif
-}
-#endif
-
 void
 mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
 {
@@ -4087,6 +4085,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        amd64_alu_reg_reg (code, X86_CMP, ins->sreg1, ins->sreg2);
                        break;
                case OP_COMPARE_IMM:
+#if defined(__mono_ilp32__)
+                        /* Comparison of pointer immediates should be 4 bytes to avoid sign-extend problems */
+                       g_assert (amd64_is_imm32 (ins->inst_imm));
+                       amd64_alu_reg_imm_size (code, X86_CMP, ins->sreg1, ins->inst_imm, 4);
+                       break;
+#endif
                case OP_LCOMPARE_IMM:
                        g_assert (amd64_is_imm32 (ins->inst_imm));
                        amd64_alu_reg_imm (code, X86_CMP, ins->sreg1, ins->inst_imm);
@@ -4308,6 +4312,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        break;
                }
                case OP_ADDCC:
+               case OP_LADDCC:
                case OP_LADD:
                        amd64_alu_reg_reg (code, X86_ADD, ins->sreg1, ins->sreg2);
                        break;
@@ -4324,6 +4329,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        amd64_alu_reg_imm (code, X86_ADC, ins->dreg, ins->inst_imm);
                        break;
                case OP_SUBCC:
+               case OP_LSUBCC:
                case OP_LSUB:
                        amd64_alu_reg_reg (code, X86_SUB, ins->sreg1, ins->sreg2);
                        break;
@@ -4415,6 +4421,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                }
                case OP_LDIV:
                case OP_LREM:
+#if defined( __native_client_codegen__ )
+                       amd64_alu_reg_imm (code, X86_CMP, ins->sreg2, 0);
+                       EMIT_COND_SYSTEM_EXCEPTION (X86_CC_EQ, TRUE, "DivideByZeroException");
+#endif
                        /* Regalloc magic makes the div/rem cases the same */
                        if (ins->sreg2 == AMD64_RDX) {
                                amd64_mov_membase_reg (code, AMD64_RSP, -8, AMD64_RDX, 8);
@@ -4427,6 +4437,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        break;
                case OP_LDIV_UN:
                case OP_LREM_UN:
+#if defined( __native_client_codegen__ )
+                       amd64_alu_reg_imm (code, X86_CMP, ins->sreg2, 0);
+                       EMIT_COND_SYSTEM_EXCEPTION (X86_CC_EQ, TRUE, "DivideByZeroException");
+#endif
                        if (ins->sreg2 == AMD64_RDX) {
                                amd64_mov_membase_reg (code, AMD64_RSP, -8, AMD64_RDX, 8);
                                amd64_alu_reg_reg (code, X86_XOR, AMD64_RDX, AMD64_RDX);
@@ -4438,6 +4452,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        break;
                case OP_IDIV:
                case OP_IREM:
+#if defined( __native_client_codegen__ )
+                       amd64_alu_reg_imm (code, X86_CMP, ins->sreg2, 0);
+                       EMIT_COND_SYSTEM_EXCEPTION (X86_CC_EQ, TRUE, "DivideByZeroException");
+#endif
                        if (ins->sreg2 == AMD64_RDX) {
                                amd64_mov_membase_reg (code, AMD64_RSP, -8, AMD64_RDX, 8);
                                amd64_cdq_size (code, 4);
@@ -4449,6 +4467,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        break;
                case OP_IDIV_UN:
                case OP_IREM_UN:
+#if defined( __native_client_codegen__ )
+                       amd64_alu_reg_imm_size (code, X86_CMP, ins->sreg2, 0, 4);
+                       EMIT_COND_SYSTEM_EXCEPTION (X86_CC_EQ, TRUE, "DivideByZeroException");
+#endif
                        if (ins->sreg2 == AMD64_RDX) {
                                amd64_mov_membase_reg (code, AMD64_RSP, -8, AMD64_RDX, 8);
                                amd64_alu_reg_reg (code, X86_XOR, AMD64_RDX, AMD64_RDX);
@@ -6394,8 +6416,18 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        break;
                }
                case OP_NACL_GC_SAFE_POINT: {
-#if defined(__native_client_codegen__)
-                       code = emit_call (cfg, code, MONO_PATCH_INFO_ABS, (gpointer)mono_nacl_gc, TRUE);
+#if defined(__native_client_codegen__) && defined(__native_client_gc__)
+                       if (cfg->compile_aot)
+                               code = emit_call (cfg, code, MONO_PATCH_INFO_ABS, (gpointer)mono_nacl_gc, TRUE);
+                       else {
+                               guint8 *br [1];
+
+                               amd64_mov_reg_imm_size (code, AMD64_R11, (gpointer)&__nacl_thread_suspension_needed, 4);
+                               amd64_test_membase_imm_size (code, AMD64_R11, 0, 0xFFFFFFFF, 4);
+                               br[0] = code; x86_branch8 (code, X86_CC_EQ, 0, FALSE);
+                               code = emit_call (cfg, code, MONO_PATCH_INFO_ABS, (gpointer)mono_nacl_gc, TRUE);
+                               amd64_patch (br[0], code);
+                       }
 #endif
                        break;
                }
@@ -8127,7 +8159,7 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI
                        if (item->check_target_idx || fail_case) {
                                if (!item->compare_done || fail_case) {
                                        if (amd64_is_imm32 (item->key))
-                                               amd64_alu_reg_imm (code, X86_CMP, MONO_ARCH_IMT_REG, (guint32)(gssize)item->key);
+                                               amd64_alu_reg_imm_size (code, X86_CMP, MONO_ARCH_IMT_REG, (guint32)(gssize)item->key, sizeof(gpointer));
                                        else {
                                                amd64_mov_reg_imm (code, MONO_ARCH_IMT_SCRATCH_REG, item->key);
                                                amd64_alu_reg_reg (code, X86_CMP, MONO_ARCH_IMT_REG, MONO_ARCH_IMT_SCRATCH_REG);
@@ -8153,7 +8185,7 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI
                                /* enable the commented code to assert on wrong method */
 #if 0
                                if (amd64_is_imm32 (item->key))
-                                       amd64_alu_reg_imm (code, X86_CMP, MONO_ARCH_IMT_REG, (guint32)(gssize)item->key);
+                                       amd64_alu_reg_imm_size (code, X86_CMP, MONO_ARCH_IMT_REG, (guint32)(gssize)item->key, sizeof(gpointer));
                                else {
                                        amd64_mov_reg_imm (code, MONO_ARCH_IMT_SCRATCH_REG, item->key);
                                        amd64_alu_reg_reg (code, X86_CMP, MONO_ARCH_IMT_REG, MONO_ARCH_IMT_SCRATCH_REG);
@@ -8178,7 +8210,7 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI
                        }
                } else {
                        if (amd64_is_imm32 (item->key))
-                               amd64_alu_reg_imm (code, X86_CMP, MONO_ARCH_IMT_REG, (guint32)(gssize)item->key);
+                               amd64_alu_reg_imm_size (code, X86_CMP, MONO_ARCH_IMT_REG, (guint32)(gssize)item->key, sizeof (gpointer));
                        else {
                                amd64_mov_reg_imm (code, MONO_ARCH_IMT_SCRATCH_REG, item->key);
                                amd64_alu_reg_reg (code, X86_CMP, MONO_ARCH_IMT_REG, MONO_ARCH_IMT_SCRATCH_REG);
index 84e6bfd0c992773d57e708c9b4a37078d4db6b66..6efc0c7b605226a82a3bde920aef57c73ed78598 100644 (file)
 /* image-writer.c doesn't happen                       */
 #define kNaClLengthOfCallImm kNaClAlignmentAMD64
 
-int is_nacl_call_reg_sequence(guint8* code);
+int is_nacl_call_reg_sequence (guint8* code);
+void amd64_nacl_clear_legacy_prefix_tag ();
+void amd64_nacl_tag_legacy_prefix (guint8* code);
+void amd64_nacl_tag_rex (guint8* code);
+guint8* amd64_nacl_get_legacy_prefix_tag ();
+guint8* amd64_nacl_get_rex_tag ();
+void amd64_nacl_instruction_pre ();
+void amd64_nacl_instruction_post (guint8 **start, guint8 **end);
+void amd64_nacl_membase_handler (guint8** code, gint8 basereg, gint32 offset, gint8 dreg);
 #endif
 
 #ifdef HOST_WIN32
index eabff5c1c5c98ef4aa4d5404ed65e2ea73374ee2..99d84ec657d431df2bc3cfff5566109a69b06cd3 100644 (file)
@@ -25,7 +25,7 @@
 #include "mono/arch/arm/arm-fpa-codegen.h"
 #include "mono/arch/arm/arm-vfp-codegen.h"
 
-#if defined(__ARM_EABI__) && defined(__linux__) && !defined(PLATFORM_ANDROID)
+#if defined(__ARM_EABI__) && defined(__linux__) && !defined(PLATFORM_ANDROID) && !defined(__native_client__)
 #define HAVE_AEABI_READ_TP 1
 #endif
 
 #define IS_SOFT_FLOAT 0
 #endif
 
+#ifdef __native_client_codegen__
+const guint kNaClAlignment = kNaClAlignmentARM;
+const guint kNaClAlignmentMask = kNaClAlignmentMaskARM;
+gint8 nacl_align_byte = -1; /* 0xff */
+
+guint8 *
+mono_arch_nacl_pad (guint8 *code, int pad)
+{
+  /* Not yet properly implemented. */
+  g_assert_not_reached ();
+  return code;
+}
+
+guint8 *
+mono_arch_nacl_skip_nops (guint8 *code)
+{
+  /* Not yet properly implemented. */
+  g_assert_not_reached ();
+  return code;
+}
+
+#endif /* __native_client_codegen__ */
+
 #define ALIGN_TO(val,align) ((((guint64)val) + ((align) - 1)) & ~((align) - 1))
 
 #if __APPLE__
@@ -198,8 +221,8 @@ mono_arch_fregname (int reg)
        return "unknown";
 }
 
-#ifndef DISABLE_JIT
 
+#ifndef DISABLE_JIT
 static guint8*
 emit_big_add (guint8 *code, int dreg, int sreg, int imm)
 {
@@ -762,11 +785,14 @@ void
 mono_arch_init (void)
 {
        InitializeCriticalSection (&mini_arch_mutex);
-
+#ifdef MONO_ARCH_SOFT_DEBUG_SUPPORTED
        if (mini_get_debug_options ()->soft_breakpoints) {
                single_step_func_wrapper = create_function_wrapper (debugger_agent_single_step_from_context);
                breakpoint_func_wrapper = create_function_wrapper (debugger_agent_breakpoint_from_context);
        } else {
+#else
+       {
+#endif
                ss_trigger_page = mono_valloc (NULL, mono_pagesize (), MONO_MMAP_READ|MONO_MMAP_32BIT);
                bp_trigger_page = mono_valloc (NULL, mono_pagesize (), MONO_MMAP_READ|MONO_MMAP_32BIT);
                mono_mprotect (bp_trigger_page, mono_pagesize (), 0);
@@ -988,6 +1014,11 @@ mono_arch_regalloc_cost (MonoCompile *cfg, MonoMethodVar *vmv)
 void
 mono_arch_flush_icache (guint8 *code, gint size)
 {
+#if defined(__native_client__)
+  // For Native Client we don't have to flush i-cache here,
+  // as it's being done by dyncode interface.
+#else
+
 #ifdef MONO_CROSS_COMPILE
 #elif __APPLE__
        sys_icache_invalidate (code, size);
@@ -1014,6 +1045,7 @@ mono_arch_flush_icache (guint8 *code, gint size)
                        : "r" (code), "r" (code + size), "r" (0)
                        : "r0", "r1", "r3" );
 #endif
+#endif /* !__native_client__ */
 }
 
 typedef enum {
@@ -6353,6 +6385,8 @@ mono_arch_get_trampolines (gboolean aot)
        return mono_arm_get_exception_trampolines (aot);
 }
 
+
+#ifdef MONO_ARCH_SOFT_DEBUG_SUPPORTED
 /*
  * mono_arch_set_breakpoint:
  *
@@ -6539,6 +6573,8 @@ mono_arch_skip_single_step (MonoContext *ctx)
        MONO_CONTEXT_SET_IP (ctx, (guint8*)MONO_CONTEXT_GET_IP (ctx) + 4);
 }
 
+#endif /* MONO_ARCH_SOFT_DEBUG_SUPPORTED */
+
 /*
  * mono_arch_get_seq_point_info:
  *
index fa636f658fa0fd88d1ebb544ec44001b71cca418..f8aae7b9ac229a399b073fec5aaceb378e89828f 100644 (file)
@@ -9,6 +9,12 @@
 #include <mono/utils/mono-context.h>
 #include <glib.h>
 
+#ifdef __native_client_codegen__
+#define kNaClAlignmentARM 16
+#define kNaClAlignmentMaskARM (kNaClAlignmentARM - 1)
+#define kNaClLengthOfCallImm 4
+#endif
+
 #if defined(ARM_FPU_NONE) || (defined(__ARM_EABI__) && !defined(ARM_FPU_VFP) && !defined(ARM_FPU_VFP_HARD))
 #define MONO_ARCH_SOFT_FLOAT 1
 #endif
@@ -188,6 +194,11 @@ typedef struct MonoCompileArch {
 #define ARM_LAST_ARG_REG 3
 
 #define MONO_ARCH_USE_SIGACTION 1
+
+#if defined(__native_client__)
+#undef MONO_ARCH_USE_SIGACTION
+#endif
+
 #define MONO_ARCH_NEED_DIV_CHECK 1
 
 #define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE
@@ -221,8 +232,14 @@ typedef struct MonoCompileArch {
 #define MONO_ARCH_GSHAREDVT_SUPPORTED 1
 #define MONO_ARCH_HAVE_GENERAL_RGCTX_LAZY_FETCH_TRAMPOLINE 1
 
+#if defined(__native_client__)
+#undef MONO_ARCH_SOFT_DEBUG_SUPPORTED
+#undef MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX
+#undef MONO_ARCH_HAVE_CONTEXT_SET_INT_REG
+#endif
+
 /* Matches the HAVE_AEABI_READ_TP define in mini-arm.c */
-#if defined(__ARM_EABI__) && defined(__linux__) && !defined(TARGET_ANDROID)
+#if defined(__ARM_EABI__) && defined(__linux__) && !defined(TARGET_ANDROID) && !defined(__native_client__)
 #define MONO_ARCH_HAVE_TLS_GET 1
 #endif
 
@@ -274,4 +291,3 @@ mono_arm_load_jumptable_entry (guint8 *code, gpointer *jte, ARMReg reg) MONO_INT
 #endif
 
 #endif /* __MONO_MINI_ARM_H__ */
-
index facd18c2494f911a5b96710d0d7f5ed94a62546a..8ef772a1b14c82c2c139ba05f0ea329e46bc9b16 100644 (file)
@@ -411,15 +411,21 @@ typedef struct {
 
 #ifndef DISABLE_LOGGING
 
-static void
-print_ji (MonoJumpInfo *ji)
+static const char* const patch_info_str[] = {
+#define PATCH_INFO(a,b) "" #a,
+#include "patch-info.h"
+#undef PATCH_INFO
+};
+
+void
+mono_print_ji (const MonoJumpInfo *ji)
 {
        switch (ji->type) {
        case MONO_PATCH_INFO_RGCTX_FETCH: {
                MonoJumpInfoRgctxEntry *entry = ji->data.rgctx_entry;
 
                printf ("[RGCTX_FETCH ");
-               print_ji (entry->data);
+               mono_print_ji (entry->data);
                printf (" - %s]", mono_rgctx_info_type_to_str (entry->info_type));
                break;
        }
@@ -430,7 +436,7 @@ print_ji (MonoJumpInfo *ji)
                break;
        }
        default:
-               printf ("[%d]", ji->type);
+               printf ("[%s]", patch_info_str [ji->type]);
                break;
        }
 }
@@ -611,7 +617,7 @@ mono_print_ins_index (int i, MonoInst *ins)
                        MonoJumpInfo *ji = (MonoJumpInfo*)call->fptr;
 
                        printf (" ");
-                       print_ji (ji);
+                       mono_print_ji (ji);
                } else if (call->fptr) {
                        MonoJitICallInfo *info = mono_find_jit_icall_by_addr (call->fptr);
                        if (info)
@@ -699,6 +705,12 @@ print_regtrack (RegTrack *t, int num)
        }
 }
 #else
+
+void
+mono_print_ji (const MonoJumpInfo *ji)
+{
+}
+
 void
 mono_print_ins_index (int i, MonoInst *ins)
 {
index 3d9bfee3bccd205aefb30f155b4d3b900ba3c22e..4b9a010f453f4b04b1d5e00f7db2d0ebc7c01692 100644 (file)
@@ -603,8 +603,12 @@ thread_suspend_func (gpointer user_data, void *sigctx, MonoContext *ctx)
        } else {
                tls->unwind_state.unwind_data [MONO_UNWIND_DATA_LMF] = mono_get_lmf ();
                if (sigctx) {
+#ifdef MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX
                        mono_arch_sigctx_to_monoctx (sigctx, &tls->unwind_state.ctx);
                        tls->unwind_state.valid = TRUE;
+#else
+                       tls->unwind_state.valid = FALSE;
+#endif
                } else if (ctx) {
                        memcpy (&tls->unwind_state.ctx, ctx, sizeof (MonoContext));
                        tls->unwind_state.valid = TRUE;
index 52c288d87cd1587f8e061d12ef2c46690ad10d32..2fbac8e0ba78898be29cc7d6ccac86594e86b3fb 100644 (file)
@@ -1868,6 +1868,68 @@ has_constraints (MonoGenericContainer *container)
        */
 }
 
+static gboolean
+mini_method_is_open (MonoMethod *method)
+{
+       if (method->is_inflated) {
+               MonoGenericContext *ctx = mono_method_get_context (method);
+
+               if (ctx->class_inst && ctx->class_inst->is_open)
+                       return TRUE;
+               if (ctx->method_inst && ctx->method_inst->is_open)
+                       return TRUE;
+       }
+       return FALSE;
+}
+
+static G_GNUC_UNUSED gboolean
+is_async_state_machine_class (MonoClass *klass)
+{
+       static MonoClass *iclass;
+       static gboolean iclass_set;
+
+       if (!iclass_set) {
+               iclass = mono_class_from_name (mono_defaults.corlib, "System.Runtime.CompilerServices", "IAsyncStateMachine");
+               mono_memory_barrier ();
+               iclass_set = TRUE;
+       }
+
+       if (iclass && klass->valuetype && strstr (klass->name, "c__async") && mono_class_is_assignable_from (iclass, klass))
+               return TRUE;
+       return FALSE;
+}
+
+static G_GNUC_UNUSED gboolean
+is_async_method (MonoMethod *method)
+{
+       MonoCustomAttrInfo *cattr;
+       MonoMethodSignature *sig;
+       gboolean res = FALSE;
+       static MonoClass *attr_class;
+       static gboolean attr_class_set;
+
+       if (!attr_class_set) {
+               attr_class = mono_class_from_name (mono_defaults.corlib, "System.Runtime.CompilerServices", "AsyncStateMachineAttribute");
+               mono_memory_barrier ();
+               attr_class_set = TRUE;
+       }
+
+       /* Do less expensive checks first */
+       sig = mono_method_signature (method);
+       if (attr_class && sig && ((sig->ret->type == MONO_TYPE_VOID) ||
+                               (sig->ret->type == MONO_TYPE_CLASS && (sig->ret->data.generic_class->container_class->name, "Task")) ||
+                               (sig->ret->type == MONO_TYPE_GENERICINST && !strcmp (sig->ret->data.generic_class->container_class->name, "Task`1")))) {
+               //printf ("X: %s\n", mono_method_full_name (method, TRUE));
+               cattr = mono_custom_attrs_from_method (method);
+               if (cattr) {
+                       if (mono_custom_attrs_has_attr (cattr, attr_class))
+                               res = TRUE;
+                       mono_custom_attrs_free (cattr);
+               }
+       }
+       return res;
+}
+
 /*
  * mono_method_is_generic_sharable_impl_full:
  * @method: a method
@@ -1886,8 +1948,19 @@ mono_method_is_generic_sharable_impl_full (MonoMethod *method, gboolean allow_ty
        if (!mono_method_is_generic_impl (method))
                return FALSE;
 
-       if (allow_gsharedvt && mini_is_gsharedvt_sharable_method (method))
+       /*
+        * Generic async methods have an associated state machine class which is a generic struct. This struct
+        * is too large to be handled by gsharedvt so we make it visible to the AOT compiler by disabling sharing
+        * of the async method and the state machine class.
+        */
+       if (is_async_state_machine_class (method->klass))
+               return FALSE;
+
+       if (allow_gsharedvt && mini_is_gsharedvt_sharable_method (method)) {
+               if (is_async_method (method))
+                       return FALSE;
                return TRUE;
+       }
 
        if (method->is_inflated) {
                MonoMethodInflated *inflated = (MonoMethodInflated*)method;
@@ -1918,6 +1991,14 @@ mono_method_is_generic_sharable_impl_full (MonoMethod *method, gboolean allow_ty
        if (method->klass->generic_container && !allow_type_vars)
                return FALSE;
 
+       /* This does potentially expensive cattr checks, so do it at the end */
+       if (is_async_method (method)) {
+               if (mini_method_is_open (method))
+                       /* The JIT can't compile these without sharing */
+                       return TRUE;
+               return FALSE;
+       }
+
        return TRUE;
 }
 
@@ -2358,6 +2439,15 @@ mini_type_is_vtype (MonoCompile *cfg, MonoType *t)
     return MONO_TYPE_ISSTRUCT (t) || mini_is_gsharedvt_variable_type (cfg, t);
 }
 
+gboolean
+mini_class_is_generic_sharable (MonoClass *klass)
+{
+       if (klass->generic_class && is_async_state_machine_class (klass))
+               return FALSE;
+
+       return (klass->generic_class && mono_generic_context_is_sharable (&klass->generic_class->context, FALSE));
+}
+
 #if defined(MONOTOUCH) || defined(MONO_EXTENSIONS)
 
 #include "../../../mono-extensions/mono/mini/mini-generic-sharing-gsharedvt.c"
index e2379fd2f7af0982215452e8ddb60956a2cd20c1..fd822480af158b26346703d6b756b6642d8b67a9 100644 (file)
@@ -3998,7 +3998,7 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
                                else
                                        ctx->lmodule->throw = callee;
                        }
-                       arg = convert (ctx, values [ins->sreg1], type_to_llvm_type (ctx, &mono_get_object_class ()->byval_arg));
+                       arg = convert (ctx, lhs, type_to_llvm_type (ctx, &mono_get_object_class ()->byval_arg));
                        emit_call (ctx, bb, &builder, callee, &arg, 1);
                        break;
                }
index 5cd41e6ff56d6cd25f6febd9e2b531e20952b2d5..394610bbc6facb512f0955cdd7029a008aeaad2d 100644 (file)
@@ -573,6 +573,11 @@ MINI_OP(OP_SUB_OVF_CARRY,   "sub_ovf_carry", IREG, IREG, IREG)
 MINI_OP(OP_ADD_OVF_UN_CARRY,   "add_ovf_un_carry", IREG, IREG, IREG)
 MINI_OP(OP_SUB_OVF_UN_CARRY,   "sub_ovf_un_carry", IREG, IREG, IREG)
 
+/* instructions with explicit long arguments to deal with 64-bit ilp32 machines */
+MINI_OP(OP_LADDCC,   "laddcc", LREG, LREG, LREG)
+MINI_OP(OP_LSUBCC,   "lsubcc", LREG, LREG, LREG)
+
+
 /* FP functions usually done by the CPU */
 MINI_OP(OP_SIN,     "sin", FREG, FREG, NONE)
 MINI_OP(OP_COS,     "cos", FREG, FREG, NONE)
@@ -920,7 +925,7 @@ MINI_OP(OP_GC_PARAM_SLOT_LIVENESS_DEF, "gc_param_slot_liveness_def", NONE, NONE,
 /* #if defined(__native_client_codegen__) || defined(__native_client__) */
 /* We have to define these in terms of the TARGET defines, not NaCl defines */
 /* because genmdesc.pl doesn't have multiple defines per platform.          */
-#if defined(TARGET_AMD64) || defined(TARGET_X86)
+#if defined(TARGET_AMD64) || defined(TARGET_X86) || defined(TARGET_ARM)
 MINI_OP(OP_NACL_GC_SAFE_POINT,     "nacl_gc_safe_point", IREG, NONE, NONE)
 #endif
 
index d03e1147d4fbe22ac33732640d42cca4637fc6cb..d3e5c907294130f94e33c9b276cea7d790ddaac8 100644 (file)
@@ -100,7 +100,17 @@ mono_runtime_cleanup_handlers (void)
 {
 }
 
+pid_t
+mono_runtime_syscall_fork (void)
+{
+       g_assert_not_reached();
+       return 0;
+}
 
+void
+mono_gdb_render_native_backtraces (pid_t crashed_pid)
+{
+}
 
 #else
 
index 9f602d5a4f312c7a0ce477a7d3e25d716f16ed8d..30880c89f940cd6e923dcd6e44e913d1c122fbd7 100644 (file)
@@ -1680,7 +1680,9 @@ static const char*tramp_names [MONO_TRAMPOLINE_NUM] = {
        "aot_plt",
        "delegate",
        "restore_stack_prot",
+#ifndef DISABLE_REMOTING
        "generic_virtual_remoting",
+#endif
        "monitor_enter",
        "monitor_exit",
        "vcall",
index e7dd64909af47f0f386b6ae7c725f089d5f2fc82..34d067af290967dc3e0f3d44c4fb2ff1f9daa0d8 100644 (file)
@@ -671,6 +671,7 @@ mono_x86_tail_call_supported (MonoMethodSignature *caller_sig, MonoMethodSignatu
        return res;
 }
 
+#if !defined(__native_client__)
 static const guchar cpuid_impl [] = {
        0x55,                           /* push   %ebp */
        0x89, 0xe5,                     /* mov    %esp,%ebp */
@@ -691,6 +692,28 @@ static const guchar cpuid_impl [] = {
        0xc9,                           /* leave   */
        0xc3,                           /* ret     */
 };
+#else
+static const guchar cpuid_impl [] = {
+       0x55,                                   /* push   %ebp */
+       0x89, 0xe5,                             /* mov    %esp,%ebp */
+       0x53,                                   /* push   %ebx */
+       0x8b, 0x45, 0x08,                       /* mov    0x8(%ebp),%eax */
+       0x0f, 0xa2,                             /* cpuid   */
+       0x50,                                   /* push   %eax */
+       0x8b, 0x45, 0x10,                       /* mov    0x10(%ebp),%eax */
+       0x89, 0x18,                             /* mov    %ebx,(%eax) */
+       0x8b, 0x45, 0x14,                       /* mov    0x14(%ebp),%eax */
+       0x89, 0x08,                             /* mov    %ecx,(%eax) */
+       0x8b, 0x45, 0x18,                       /* mov    0x18(%ebp),%eax */
+       0x89, 0x10,                             /* mov    %edx,(%eax) */
+       0x58,                                   /* pop    %eax */
+       0x8b, 0x55, 0x0c,                       /* mov    0xc(%ebp),%edx */
+       0x89, 0x02,                             /* mov    %eax,(%edx) */
+       0x5b,                                   /* pop    %ebx */
+       0xc9,                                   /* leave   */
+       0x59, 0x83, 0xe1, 0xe0, 0xff, 0xe1      /* naclret */
+};
+#endif
 
 typedef void (*CpuidFunc) (int id, int* p_eax, int* p_ebx, int* p_ecx, int* p_edx);
 
@@ -698,12 +721,16 @@ static int
 cpuid (int id, int* p_eax, int* p_ebx, int* p_ecx, int* p_edx)
 {
 #if defined(__native_client__)
-       /* Taken from below, the bug listed in the comment is */
-       /* only valid for non-static cases.                   */
-       __asm__ __volatile__ ("cpuid"
-               : "=a" (*p_eax), "=b" (*p_ebx), "=c" (*p_ecx), "=d" (*p_edx)
-               : "a" (id));
-       return 1;
+       static CpuidFunc func = NULL;
+       void *ptr, *end_ptr;
+       if (!func) {
+               ptr = mono_global_codeman_reserve (sizeof (cpuid_impl));
+               memcpy(ptr, cpuid_impl, sizeof(cpuid_impl));
+               end_ptr = ptr + sizeof(cpuid_impl);
+               nacl_global_codeman_validate (&ptr, sizeof(cpuid_impl), &end_ptr);
+               func = (CpuidFunc)ptr;
+       }
+       func (id, p_eax, p_ebx, p_ecx, p_edx);
 #else
        int have_cpuid = 0;
 #ifndef _MSC_VER
@@ -2450,17 +2477,6 @@ x86_pop_reg (code, X86_EAX);
 #define bb_is_loop_start(bb) ((bb)->loop_body_start && (bb)->nesting)
 
 #ifndef DISABLE_JIT
-
-#if defined(__native_client__) || defined(__native_client_codegen__)
-void
-mono_nacl_gc()
-{
-#ifdef __native_client_gc__
-       __nacl_suspend_thread_if_needed();
-#endif
-}
-#endif
-
 void
 mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
 {
@@ -2794,6 +2810,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        break;
                case OP_IDIV:
                case OP_IREM:
+#if defined( __native_client_codegen__ )
+                       x86_alu_reg_imm (code, X86_CMP, ins->sreg2, 0);
+                       EMIT_COND_SYSTEM_EXCEPTION (X86_CC_EQ, TRUE, "DivideByZeroException");
+#endif
                        /* 
                         * The code is the same for div/rem, the allocator will allocate dreg
                         * to RAX/RDX as appropriate.
@@ -2811,6 +2831,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        break;
                case OP_IDIV_UN:
                case OP_IREM_UN:
+#if defined( __native_client_codegen__ )
+                       x86_alu_reg_imm (code, X86_CMP, ins->sreg2, 0);
+                       EMIT_COND_SYSTEM_EXCEPTION (X86_CC_EQ, TRUE, "DivideByZeroException");
+#endif
                        if (ins->sreg2 == X86_EDX) {
                                x86_push_reg (code, ins->sreg2);
                                x86_alu_reg_reg (code, X86_XOR, X86_EDX, X86_EDX);
@@ -2822,6 +2846,13 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        }
                        break;
                case OP_DIV_IMM:
+#if defined( __native_client_codegen__ )
+                       if (ins->inst_imm == 0) {
+                               mono_add_patch_info (cfg, code - cfg->native_code, MONO_PATCH_INFO_EXC, "DivideByZeroException");
+                               x86_jump32 (code, 0);
+                               break;
+                       }
+#endif
                        x86_mov_reg_imm (code, ins->sreg2, ins->inst_imm);
                        x86_cdq (code);
                        x86_div_reg (code, ins->sreg2, TRUE);
@@ -3832,8 +3863,9 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        x86_fprem (code);
                        x86_fnstsw (code);
                        x86_alu_reg_imm (code, X86_AND, X86_EAX, X86_FP_C2);
-                       l2 = code + 2;
-                       x86_branch8 (code, X86_CC_NE, l1 - l2, FALSE);
+                       l2 = code;
+                       x86_branch8 (code, X86_CC_NE, 0, FALSE);
+                       x86_patch (l2, l1);
 
                        /* pop result */
                        x86_fstp (code, 1);
@@ -4886,8 +4918,17 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        break;
                }
                case OP_NACL_GC_SAFE_POINT: {
-#if defined(__native_client_codegen__)
-                       code = emit_call (cfg, code, MONO_PATCH_INFO_ABS, (gpointer)mono_nacl_gc);
+#if defined(__native_client_codegen__) && defined(__native_client_gc__)
+                       if (cfg->compile_aot)
+                               code = emit_call (cfg, code, MONO_PATCH_INFO_ABS, (gpointer)mono_nacl_gc);
+                       else {
+                               guint8 *br [1];
+
+                               x86_test_mem_imm8 (code, (gpointer)&__nacl_thread_suspension_needed, 0xFFFFFFFF);
+                               br[0] = code; x86_branch8 (code, X86_CC_EQ, 0, FALSE);
+                               code = emit_call (cfg, code, MONO_PATCH_INFO_ABS, (gpointer)mono_nacl_gc);
+                               x86_patch (br[0], code);
+                       }
 #endif
                        break;
                }
@@ -5290,19 +5331,38 @@ mono_arch_emit_prolog (MonoCompile *cfg)
                                max_offset += LOOP_ALIGNMENT;
 #ifdef __native_client_codegen__
                        /* max alignment for native client */
-                       max_offset += kNaClAlignment;
+                       if (bb->flags & BB_INDIRECT_JUMP_TARGET || bb->flags & BB_EXCEPTION_HANDLER)
+                               max_offset += kNaClAlignment;
 #endif
                        MONO_BB_FOR_EACH_INS (bb, ins) {
                                if (ins->opcode == OP_LABEL)
                                        ins->inst_c1 = max_offset;
 #ifdef __native_client_codegen__
+                               switch (ins->opcode)
                                {
-                                       int space_in_block = kNaClAlignment -
-                                               ((max_offset + cfg->code_len) & kNaClAlignmentMask);
-                                       int max_len = ((guint8 *)ins_get_spec (ins->opcode))[MONO_INST_LEN];
-                                       if (space_in_block < max_len && max_len < kNaClAlignment) {
-                                               max_offset += space_in_block;
-                                       }
+                                       case OP_FCALL:
+                                       case OP_LCALL:
+                                       case OP_VCALL:
+                                       case OP_VCALL2:
+                                       case OP_VOIDCALL:
+                                       case OP_CALL:
+                                       case OP_FCALL_REG:
+                                       case OP_LCALL_REG:
+                                       case OP_VCALL_REG:
+                                       case OP_VCALL2_REG:
+                                       case OP_VOIDCALL_REG:
+                                       case OP_CALL_REG:
+                                       case OP_FCALL_MEMBASE:
+                                       case OP_LCALL_MEMBASE:
+                                       case OP_VCALL_MEMBASE:
+                                       case OP_VCALL2_MEMBASE:
+                                       case OP_VOIDCALL_MEMBASE:
+                                       case OP_CALL_MEMBASE:
+                                               max_offset += kNaClAlignment;
+                                               break;
+                                       default:
+                                               max_offset += ((guint8 *)ins_get_spec (ins->opcode))[MONO_INST_LEN] - 1;
+                                               break;
                                }
 #endif  /* __native_client_codegen__ */
                                max_offset += ((guint8 *)ins_get_spec (ins->opcode))[MONO_INST_LEN];
index 28b66be959ff9fe33df01979916b3dd65ec2cc44..8357ca931c9561964147c62144c4ee5a39099f81 100644 (file)
@@ -462,6 +462,14 @@ void *mono_global_codeman_reserve (int size)
 }
 
 #if defined(__native_client_codegen__) && defined(__native_client__)
+void
+mono_nacl_gc()
+{
+#ifdef __native_client_gc__
+       __nacl_suspend_thread_if_needed();
+#endif
+}
+
 /* Given the temporary buffer (allocated by mono_global_codeman_reserve) into
  * which we are generating code, return a pointer to the destination in the
  * dynamic code segment into which the code will be copied when
@@ -2975,19 +2983,42 @@ mono_patch_info_hash (gconstpointer data)
        case MONO_PATCH_INFO_IID:
        case MONO_PATCH_INFO_ADJUSTED_IID:
        case MONO_PATCH_INFO_CLASS_INIT:
+       case MONO_PATCH_INFO_GENERIC_CLASS_INIT:
        case MONO_PATCH_INFO_METHODCONST:
        case MONO_PATCH_INFO_METHOD:
        case MONO_PATCH_INFO_METHOD_JUMP:
        case MONO_PATCH_INFO_IMAGE:
        case MONO_PATCH_INFO_JIT_ICALL_ADDR:
+       case MONO_PATCH_INFO_ICALL_ADDR:
        case MONO_PATCH_INFO_FIELD:
        case MONO_PATCH_INFO_SFLDA:
        case MONO_PATCH_INFO_SEQ_POINT_INFO:
+       case MONO_PATCH_INFO_METHOD_RGCTX:
+       case MONO_PATCH_INFO_DELEGATE_TRAMPOLINE:
+       case MONO_PATCH_INFO_SIGNATURE:
                return (ji->type << 8) | (gssize)ji->data.target;
        case MONO_PATCH_INFO_GSHAREDVT_CALL:
                return (ji->type << 8) | (gssize)ji->data.gsharedvt->method;
-       default:
+       case MONO_PATCH_INFO_RGCTX_FETCH: {
+               MonoJumpInfoRgctxEntry *e = ji->data.rgctx_entry;
+
+               return (ji->type << 8) | (gssize)e->method | (e->in_mrgctx) | e->info_type | mono_patch_info_hash (e->data);
+       }
+       case MONO_PATCH_INFO_INTERRUPTION_REQUEST_FLAG:
+       case MONO_PATCH_INFO_MSCORLIB_GOT_ADDR:
+       case MONO_PATCH_INFO_GC_CARD_TABLE_ADDR:
+       case MONO_PATCH_INFO_JIT_TLS_ID:
+       case MONO_PATCH_INFO_MONITOR_ENTER:
+       case MONO_PATCH_INFO_MONITOR_EXIT:
+       case MONO_PATCH_INFO_CASTCLASS_CACHE:
                return (ji->type << 8);
+       case MONO_PATCH_INFO_SWITCH:
+               return (ji->type << 8) | ji->data.table->table_size;
+       default:
+               printf ("info type: %d\n", ji->type);
+               mono_print_ji (ji); printf ("\n");
+               g_assert_not_reached ();
+               return 0;
        }
 }
 
@@ -3363,7 +3394,7 @@ mono_resolve_patch_target (MonoMethod *method, MonoDomain *domain, guint8 *code,
                break;
        }
        case MONO_PATCH_INFO_JIT_TLS_ID: {
-               target = (gpointer)mono_jit_tls_id;
+               target = (gpointer) (size_t) mono_jit_tls_id;
                break;
        }
        default:
@@ -5767,8 +5798,15 @@ mono_jit_compile_method_inner (MonoMethod *method, MonoDomain *target_domain, in
                        patch_info.data.method = method;
                        g_hash_table_remove (domain_jit_info (target_domain)->jump_target_hash, method);
 
+#if defined(__native_client_codegen__) && defined(__native_client__)
+                       /* These patches are applied after a method has been installed, no target munging is needed. */
+                       nacl_allow_target_modification (FALSE);
+#endif
                        for (tmp = jlist->list; tmp; tmp = tmp->next)
                                mono_arch_patch_code (NULL, target_domain, tmp->data, &patch_info, NULL, TRUE);
+#if defined(__native_client_codegen__) && defined(__native_client__)
+                       nacl_allow_target_modification (TRUE);
+#endif
                }
        }
 
@@ -7138,7 +7176,6 @@ print_jit_stats (void)
                g_print ("Biggest method:         %ld (%s)\n", mono_jit_stats.biggest_method_size,
                                 mono_jit_stats.biggest_method);
 
-               g_print ("\nCreated object count:   %ld\n", mono_stats.new_object_count);
                g_print ("Delegates created:      %ld\n", mono_stats.delegate_creations);
                g_print ("Initialized classes:    %ld\n", mono_stats.initialized_class_count);
                g_print ("Used classes:           %ld\n", mono_stats.used_class_count);
index 3bfb1e6a8da08f7fc70d71babca9e2b675699bf8..5f64c2ef1b4b9901af828173441a27f7ab5ba590 100644 (file)
@@ -29,6 +29,7 @@
 #include <mono/utils/mono-stack-unwinding.h>
 #include <mono/utils/mono-threads.h>
 #include <mono/utils/mono-tls.h>
+#include <mono/utils/atomic.h>
 
 #define MONO_BREAKPOINT_ARRAY_SIZE 64
 
 #include "mini-unwind.h"
 #include "jit.h"
 
+#ifdef __native_client_codegen__
+#include <nacl/nacl_dyncode.h>
+#endif
+
+
 /*
  * The mini code should not have any compile time dependencies on the GC being used, so the same object file from mini/
  * can be linked into both mono and mono-sgen.
@@ -1863,6 +1869,7 @@ void      mono_merge_basic_blocks           (MonoCompile *cfg, MonoBasicBlock *b
 void      mono_optimize_branches            (MonoCompile *cfg) MONO_INTERNAL;
 
 void      mono_blockset_print               (MonoCompile *cfg, MonoBitSet *set, const char *name, guint idom) MONO_INTERNAL;
+void      mono_print_ji                     (const MonoJumpInfo *ji) MONO_INTERNAL;
 void      mono_print_ins_index              (int i, MonoInst *ins) MONO_INTERNAL;
 void      mono_print_ins                    (MonoInst *ins) MONO_INTERNAL;
 void      mono_print_bb                     (MonoBasicBlock *bb, const char *msg) MONO_INTERNAL;
@@ -1955,6 +1962,8 @@ extern const guint kNaClAlignmentMask;
 #endif
 
 #if defined(__native_client__) || defined(__native_client_codegen__)
+extern volatile int __nacl_thread_suspension_needed;
+extern void __nacl_suspend_thread_if_needed();
 void mono_nacl_gc();
 #endif
 
@@ -2463,6 +2472,9 @@ mono_method_is_generic_sharable_impl (MonoMethod *method, gboolean allow_type_va
 gboolean
 mono_method_is_generic_sharable_impl_full (MonoMethod *method, gboolean allow_type_vars, gboolean allow_partial, gboolean allow_gsharedvt) MONO_INTERNAL;
 
+gboolean
+mini_class_is_generic_sharable (MonoClass *klass) MONO_INTERNAL;
+
 gboolean
 mono_is_partially_sharable_inst (MonoGenericInst *inst) MONO_INTERNAL;
 
@@ -2499,14 +2511,14 @@ void mono_cfg_add_try_hole (MonoCompile *cfg, MonoExceptionClause *clause, guint
 
 void mono_cfg_set_exception (MonoCompile *cfg, int type) MONO_INTERNAL;
 gboolean mini_type_is_reference (MonoCompile *cfg, MonoType *type) MONO_INTERNAL;
-gboolean mini_type_is_vtype (MonoCompile *cfg, MonoType *t) MONO_INTERNAL;
-gboolean mini_type_var_is_vt (MonoCompile *cfg, MonoType *type) MONO_INTERNAL;
-gboolean mini_is_gsharedvt_klass (MonoCompile *cfg, MonoClass *klass) MONO_INTERNAL;
+gboolean mini_type_is_vtype (MonoCompile *cfg, MonoType *t); /* should be internal but it's used by llvm */
+gboolean mini_type_var_is_vt (MonoCompile *cfg, MonoType *type); /* should be internal but it's used by llvm */
+gboolean mini_is_gsharedvt_klass (MonoCompile *cfg, MonoClass *klass); /* should be internal but it's used by llvm */
 gboolean mini_is_gsharedvt_type (MonoCompile *cfg, MonoType *t) MONO_INTERNAL;
 gboolean mini_is_gsharedvt_signature (MonoCompile *cfg, MonoMethodSignature *sig) MONO_INTERNAL;
 gboolean mini_is_gsharedvt_type_gsctx (MonoGenericSharingContext *gsctx, MonoType *t) MONO_INTERNAL;
 gboolean mini_is_gsharedvt_variable_type (MonoCompile *cfg, MonoType *t) MONO_INTERNAL;
-MonoType* mini_get_gsharedvt_alloc_type_for_type (MonoCompile *cfg, MonoType *t) MONO_INTERNAL;
+MonoType* mini_get_gsharedvt_alloc_type_for_type (MonoCompile *cfg, MonoType *t); /* should be internal but it's used by llvm */
 gboolean mini_is_gsharedvt_sharable_method (MonoMethod *method) MONO_INTERNAL;
 gboolean mini_is_gsharedvt_variable_signature (MonoMethodSignature *sig) MONO_INTERNAL;
 gboolean mini_is_gsharedvt_sharable_inst (MonoGenericInst *inst) MONO_INTERNAL;
index 24cd2c5cc8209dcf1b1b9f5ddc4025fd71285d99..d47645a1ef21de3720f7e0308c5a21f07d51ead8 100644 (file)
 using System;
 using Mono.Simd;
+using System.Threading;
+
+class A {
+       public void Print() { Console.WriteLine("A"); }
+}
+
+class B : A {
+       public void Print() { Console.WriteLine("B"); }
+}
+
+class ThreadRunner {
+       public Int32 Inc2(Int32 a) { return Inc1(a); }
+       public Int32 Inc1(Int32 a) { return a + 2; }
+       public void PrintA(A a) { a.Print(); ((B)a).Print(); }
+       public void Run() {
+               Console.WriteLine("Running thread" );
+               B b = new B();
+               Int32 a=0;
+               for(int i = 0; i < 1000000; i++) {
+                       a = Inc2(a);
+                       if(i % 100000 == 0) PrintA(b);
+               }
+               Console.WriteLine("Ending thread");
+       }
+}
+
+
+class Extensions { public static string BogusProperty { get; set; } }
+
+class RuntimeServices {
+       public System.Reflection.MemberInfo[] members = typeof(Extensions).GetMembers();
+       public void Run() {
+               foreach (var m in members) System.Console.WriteLine(m);
+       }
+}
 
 class Tests {
        struct myvt {
-         public int X;
-         public int Y;
+               public int X;
+               public int Y;
        }
 
        static int test_0_vector4i_cmp_gt () {
-               Vector4i a = new Vector4i (10, 5, 12, -1);
+               Vector4i a = new Vector4i (10, 5, 12, -1);
                Vector4i b = new Vector4i (-1, 5, 10, 10);
 
                Vector4i c = a.CompareGreaterThan (b);
-       
+
                if (c.X != -1)
                        return 1;
                if (c.Y != 0)
                        return 2;
                if (c.Z != -1)
-                 return 3;
+                       return 3;
                if (c.W != 0)
-                 return 4;
+                       return 4;
                return 0;
        }
 
        static myvt CompareGT(myvt a, myvt b) {
-         myvt r;
-         r.X = a.X > b.X ? -1 : 0;
-         r.Y = a.Y > b.Y ? -1 : 0;
-         return r;
+               myvt r;
+               r.X = a.X > b.X ? -1 : 0;
+               r.Y = a.Y > b.Y ? -1 : 0;
+               return r;
        }
 
        static int test_0_struct2i_cmp_gt() {
-         myvt a;
-         myvt b;
-         a.X = 10;
-         a.Y = 5;
-         b.X = -1;
-         b.Y = 5;
-         myvt c = CompareGT(a, b);
-         if (c.X != -1)
-           return 1;
-         if (c.Y != 0)
-           return 2;
-         return 0;
+               myvt a;
+               myvt b;
+               a.X = 10;
+               a.Y = 5;
+               b.X = -1;
+               b.Y = 5;
+               myvt c = CompareGT(a, b);
+               if (c.X != -1)
+                       return 1;
+               if (c.Y != 0)
+                       return 2;
+               return 0;
        }
 
        static int vararg_sum(params int[] args) {
-         int sum = 0;
-         foreach(int arg in args) {
-           sum += arg;
-         }
-         return sum;
+               int sum = 0;
+               foreach(int arg in args) {
+                       sum += arg;
+               }
+               return sum;
        }
        static int test_21_vararg_test() {
-         int sum = 0;
-         sum += vararg_sum();
-         sum += vararg_sum(1);
-         sum += vararg_sum(2, 3);
-         sum += vararg_sum(4, 5, 6);
-         return sum;
+               int sum = 0;
+               sum += vararg_sum();
+               sum += vararg_sum(1);
+               sum += vararg_sum(2, 3);
+               sum += vararg_sum(4, 5, 6);
+               return sum;
        }
+
+       static int test_0_threads() {
+               // Run a bunch of threads, make them JIT some code and
+               // do some casts
+               ThreadRunner runner = new ThreadRunner();
+               Thread[] threads = new Thread[10];
+               for (int i = 0; i < 10; i++) {
+                       threads[i] = new Thread(new ThreadStart(runner.Run));
+                       threads[i].Start();
+               }
+               for (int i = 0; i < 10; i++) {
+                       threads[i].Join();
+               }
+               return 0;
+       }
+
+
+       static int test_0_reflection() {
+               RuntimeServices r = new RuntimeServices();
+               r.Run();
+               return 0;
+       }
+
+       public class BaseClass {
+       }
+
+       public class LongClass : BaseClass {
+               public long Value;
+               public LongClass(long val) { Value = val; }
+       }
+
+       static public long add_two_LongClass(BaseClass l1, BaseClass l2) {
+               long l = checked (((LongClass)l1).Value + ((LongClass)l2).Value);
+               return l;
+       }
+
+       static int test_0_laddcc() {
+               long l = add_two_LongClass(new LongClass(System.Int64.MinValue), new LongClass(1234));
+               if (l == 1234)
+                       return 1;
+               return 0;
+       }
+
        public static int Main(String[] args) {
-         return TestDriver.RunTests(typeof(Tests));
+               return TestDriver.RunTests(typeof(Tests));
        }
 }
index c7689c42ee476586e5e2f6e50e5bb008043d7ab1..a16871b226c11a4b0c8f148328e4a6dafffd529f 100644 (file)
@@ -114,8 +114,8 @@ struct Gamma {
 
 class Tests {
 
-       static int Main () {
-               return TestDriver.RunTests (typeof (Tests));
+       public static int Main (string[] args) {
+               return TestDriver.RunTests (typeof (Tests), args);
        }
        
        public static int test_0_return () {
@@ -1577,5 +1577,23 @@ ncells ) {
                return 0;
        }
 
+       public static void do_throw () {
+               throw new Exception ();
+       }
+
+       [MethodImplAttribute (MethodImplOptions.NoInlining)]
+       static void empty () {
+       }
+
+       // #11297
+       public static int test_0_llvm_inline_throw () {
+               try {
+                       empty ();
+               } catch (Exception ex) {
+                       do_throw ();
+               }
+
+               return 0;
+       }
 }
 
index f043ddd6d55402ab6a17fb6d5d48293693da53af..9e910dc362e231df27f072bcfba0fa59f0264b04 100644 (file)
@@ -1,5 +1,8 @@
-
+#if defined(__native_client__) && defined(__x86_64__)
+typedef guint64 regmask_t;
+#else
 typedef size_t regmask_t;
+#endif
 
 enum {
        MONO_REG_INT,
index c873a1d243b809827baab1f627e26a243e0814bd..c2a31ce1ea3532db21c42ecd459079fa733bfac2 100644 (file)
@@ -3,7 +3,7 @@
 
 #include "mini.h"
 
-#if defined(HOST_WIN32) || !defined(HAVE_SYS_IPC_H) || !defined(HAVE_SYS_SEM_H)
+#if defined(HOST_WIN32) || !defined(HAVE_SYS_IPC_H) || !defined(HAVE_SYS_SEM_H) || (defined(__native_client__) && defined(__GLIBC__))
 
 int mini_wapi_hps (int argc, char **argv)
 {
index 7d103d3d5fc992921d06a8355704cce0d254e850..27f1a5f3cf9cf801d857e750382395fcb80cccff 100644 (file)
@@ -18,6 +18,11 @@ static int max_depth = 6;
 static int verbose = 0;
 static const char *graph_properties = "\tnode [fontsize=8.0]\n\tedge [len=2,color=red]\n";
 
+#if defined(__native_client__) || defined(__native_client_codegen__)
+volatile int __nacl_thread_suspension_needed = 0;
+void __nacl_suspend_thread_if_needed() {}
+#endif
+
 static void
 output_type_edge (MonoClass *first, MonoClass *second) {
        if (include_namespace)
@@ -1200,5 +1205,3 @@ main (int argc, char *argv[]) {
                fclose (output);
        return 0;
 }
-
-
index a6f029ab59049bd9db9348715527bbd936609c9b..25bb9b51f707d608ed13a4e80d042ebdb38f6349 100644 (file)
@@ -82,7 +82,11 @@ MCS = $(RUNTIME) $(mcs_topdir)/class/lib/build/mcs.exe -unsafe -nowarn:0162 -now
 testlog: $(PLOG_TESTS)
        $(with_mono_path) perl $(srcdir)/ptestrunner.pl $(top_builddir)
 
+if NACL_CODEGEN
+check-local:
+else
 check-local: testlog
+endif
 
 EXTRA_DIST=utils.c utils.h proflog.h log-profiler.txt perf_event.h \
        $(PLOG_TESTS_SRC) ptestrunner.pl
index 1f893ce8128de73911cd3db3216dcb675ccc970e..1383ae90b27e10fb2f9434cd9e856184a82fd5d3 100644 (file)
 #define HASH_SIZE 9371
 #define SMALL_HASH_SIZE 31
 
+#if defined(__native_client__) || defined(__native_client_codegen__)
+volatile int __nacl_thread_suspension_needed = 0;
+void __nacl_suspend_thread_if_needed() {}
+#endif
+
 static int debug = 0;
 static int collect_traces = 0;
 static int show_traces = 0;
index afdb911315a36013562ec58cb4e5400c4b881c04..d829fd68f4f9bd9d91047f5de17eb0fa10dcff8c 100644 (file)
@@ -13,6 +13,7 @@
 #include <mono/metadata/threads.h>
 #include <mono/metadata/mono-gc.h>
 #include <mono/metadata/debug-helpers.h>
+#include <mono/utils/atomic.h>
 #include <stdlib.h>
 #include <string.h>
 #include <assert.h>
@@ -1139,7 +1140,7 @@ thread_name (MonoProfiler *prof, uintptr_t tid, const char *name)
 }
 
 #ifndef HOST_WIN32
-#include "mono/io-layer/atomic.h"
+#include "mono/utils/atomic.h"
 #endif
 #define cmp_exchange InterlockedCompareExchangePointer
 /*#else
index 455a4b159409ec7d342845a5cc1b01e7fb533627..d6f4c3178862a14cfcdde0ca410e5719866e3858 100644 (file)
@@ -446,6 +446,91 @@ PLATFORM_DISABLED_TESTS=dynamic-method-resurrection.exe
 #PLATFORM_DISABLED_TESTS=dynamic-method-resurrection.exe exception17.exe
 endif
 
+if NACL_CODEGEN
+# Tests that use Thread.Abort()
+PLATFORM_DISABLED_TESTS= abort-stress-1.exe \
+                         abort-stress-2.exe \
+                         abort-stress-3.exe \
+                         appdomain-thread-abort.exe \
+                         async-exc-compilation.exe \
+                         bug-561239.exe \
+                         bug-70561.exe \
+                         finalizer-abort.exe \
+                         finally_guard.exe \
+                         main-returns-abort-resetabort.exe \
+                         main-returns-background-abort-resetabort.exe \
+                         thread6.exe \
+                         threadpool-exceptions5.exe \
+                         threadpool-exceptions6.exe
+
+# Tests that rely on AppDomain.Unload
+PLATFORM_DISABLED_TESTS+= appdomain-async-invoke.exe \
+                          appdomain-exit.exe \
+                          appdomain-unload-callback.exe \
+                          appdomain-unload.exe \
+                          domain-stress.exe \
+                          generic-unloading.2.exe \
+                          monitor.exe \
+                          remoting4.exe \
+                          threadpool-exceptions7.exe \
+                          xdomain-threads.exe
+
+# pinvoke2 attaches a thread to the runtime, but
+# doesn't 'unattach' it and it hangs in GC on exit
+PLATFORM_DISABLED_TESTS+= pinvoke2.exe
+
+# Tests that currently hang waiting for non-main threads
+# to exit in NaCl, need to investigate.  Most are AppDomain
+# creation and Delegate tests.
+PLATFORM_DISABLED_TESTS+= appdomain1.exe \
+                          delegate9.exe \
+                          marshal-valuetypes.exe \
+                          cross-domain.exe \
+                          stackframes-async.2.exe \
+                          generic-marshalbyref.2.exe \
+                          generic-xdomain.2.exe \
+                          bug-415577.exe
+
+# Tests that fail trying to write files (appdomain create mostly)
+PLATFORM_DISABLED_TESTS+= bug-335131.2.exe \
+                          bug-349190.2.exe \
+                          bug-80307.exe \
+                          bug-462592.exe
+
+# FIXME: don't know why delegate2.exe fails, it shouldn't
+PLATFORM_DISABLED_TESTS+= delegate2.exe
+
+# These tests newly fail with the latest revision. pinvoke3 fails because
+# of a thread attach, the others have not been investigated.  TODO revisit.
+PLATFORM_DISABLED_TESTS+= pinvoke3.exe \
+                          async_read.exe \
+                          async-with-cb-throws.exe \
+                          appdomain-unload-doesnot-raise-pending-events.exe \
+                          gsharing-valuetype-layout.exe
+
+if X86
+# FIXME: There are problems with async callbacks and results on NaCl 32-bit
+PLATFORM_DISABLED_TESTS+= delegate1.exe \
+                          delegate3.exe \
+                          delegate5.exe \
+                          delegate8.exe \
+                          threadpool.exe \
+                          threadpool1.exe \
+                          threadpool-exceptions3.exe \
+                          bug-323114.exe \
+                          delegate-exit.exe \
+                          bug-80392.2.exe
+
+# FIXME: These tests hang/fail for unknown reasons, deal with exiting
+PLATFORM_DISABLED_TESTS+= main-returns-background-resetabort.exe \
+                          main-returns-background.exe \
+                          main-returns-background-change.exe
+endif
+
+endif
+
+# The two finalizer tests only work under sgen
+# gc-altstack.exe fails under boehm because it has no support for altstack
 # bug-459094.exe creates an extremely deep directory tree
 # delegate-invoke.exe depends on 929c6bc9b6d76a273f251e6f5dfacac36e9c38bd which was
 # reverted.
@@ -599,17 +684,25 @@ tests: $(TESTSI_CS) $(TESTSI_IL) $(TESTBS) libtest.la $(PREREQSI_IL) $(PREREQSI_
 # Test that no symbols are missed in eglib-remap.h
 #
 OK_G_SYMBOLS='g_list\|g_slist\|g_concat_dir_and_file'
+if NACL_CODEGEN
+test-eglib-remap:
+else
 test-eglib-remap:
        @echo "Testing eglib remap..."
        @if which nm > /dev/null; then if nm $(top_builddir)/mono/mini/mono | grep -v $(OK_G_SYMBOLS) | grep 't g_'; then exit 1; else exit 0; fi; fi
+endif
 
 #
 # Tests that the internals in mono/io-layer/messages.c are ok by triggering the 
 # code that checks that the table is properly sorted
 #
+if NACL_CODEGEN
+test-messages:
+else
 test-messages: w32message.exe
        > test_messages.zero
        $(with_mono_path) $(JITTEST_PROG_RUN) w32message.exe >& w32message.allout && cmp test_messages.zero w32message.allout
+endif
 
 if MOONLIGHT
 test_2_1 : test-coreclr-security
@@ -1039,8 +1132,12 @@ test-generic-sharing-normal: $(GSHARED_TESTS)
 test-generic-sharing-managed: test-runner.exe $(GSHARED_TESTS)
        @$(RUNTIME) ./test-runner.exe -j a --opt-sets "gshared gshared,shared gshared,-inline gshared,-inline,shared" $(GSHARED_TESTS)
 
+if NACL_CODEGEN
+test-generic-sharing:
+else
 test-generic-sharing:
        @if test x$(M) != x; then $(MAKE) test-generic-sharing-managed; else $(MAKE) test-generic-sharing-normal; fi
+endif
 
 EXTRA_DIST += async-exceptions.cs
 async-exceptions.exe : async-exceptions.cs
@@ -1062,6 +1159,10 @@ patch-libtool:
        sed -e 's,LIBTOOL =,LIBTOOL2 =,g' Makefile > 2 && echo "LIBTOOL = bash ./libtool" > 1 && cat 1 2 > Makefile
        touch libtest.c
 
+
+if NACL_CODEGEN
+test-process-exit:
+else
 EXTRA_DIST += bug-438454.cs bug-438454.exe.stdout.expected threadpool-in-processexit.cs threadpool-in-processexit.exe.stdout.expected
 test-process-exit:
        @$(MCS) $(srcdir)/bug-438454.cs -out:bug-438454.exe
@@ -1072,6 +1173,7 @@ test-process-exit:
        @echo "Testing threadpool-in-processexit.exe..."
        @$(RUNTIME) threadpool-in-processexit.exe > threadpool-in-processexit.exe.stdout
        @diff -w threadpool-in-processexit.exe.stdout $(srcdir)/threadpool-in-processexit.exe.stdout.expected
+endif
 
 OOM_TESTS =    \
        gc-oom-handling.exe     \
index 2745782762e3ed40947febce383f2dcf27761db4..43b84cfa9b9c411f2c900e58c9a3b723783de0fa 100644 (file)
@@ -99,7 +99,9 @@ monoutils_sources = \
        mono-threads.h  \
        mono-tls.h      \
        linux_magic.h   \
-       mono-memory-model.h
+       mono-memory-model.h     \
+       atomic.h        \
+       atomic.c
 
 arch_sources = 
 
diff --git a/mono/utils/atomic.c b/mono/utils/atomic.c
new file mode 100644 (file)
index 0000000..8141bfd
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * atomic.c:  Workarounds for atomic operations for platforms that dont have
+ *           really atomic asm functions in atomic.h
+ *
+ * Author:
+ *     Dick Porter (dick@ximian.com)
+ *
+ * (C) 2002 Ximian, Inc.
+ */
+
+#include <config.h>
+#include <glib.h>
+#include <pthread.h>
+
+#include <mono/utils/atomic.h>
+
+#ifdef WAPI_NO_ATOMIC_ASM
+
+static pthread_mutex_t spin = PTHREAD_MUTEX_INITIALIZER;
+static mono_once_t spin_once=MONO_ONCE_INIT;
+
+static void spin_init(void)
+{
+       g_warning("Using non-atomic functions!  Expect race conditions when using process-shared handles!");
+}
+
+gint32 InterlockedCompareExchange(volatile gint32 *dest, gint32 exch,
+                                 gint32 comp)
+{
+       gint32 old;
+       int ret;
+       
+       mono_once(&spin_once, spin_init);
+       
+       pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+                             (void *)&spin);
+       ret = pthread_mutex_lock(&spin);
+       g_assert (ret == 0);
+       
+       old= *dest;
+       if(old==comp) {
+               *dest=exch;
+       }
+       
+       ret = pthread_mutex_unlock(&spin);
+       g_assert (ret == 0);
+       
+       pthread_cleanup_pop (0);
+
+       return(old);
+}
+
+gpointer InterlockedCompareExchangePointer(volatile gpointer *dest,
+                                          gpointer exch, gpointer comp)
+{
+       gpointer old;
+       int ret;
+       
+       mono_once(&spin_once, spin_init);
+       
+       pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+                             (void *)&spin);
+       ret = pthread_mutex_lock(&spin);
+       g_assert (ret == 0);
+       
+       old= *dest;
+       if(old==comp) {
+               *dest=exch;
+       }
+       
+       ret = pthread_mutex_unlock(&spin);
+       g_assert (ret == 0);
+       
+       pthread_cleanup_pop (0);
+
+       return(old);
+}
+
+gint32 InterlockedIncrement(volatile gint32 *dest)
+{
+       gint32 ret;
+       int thr_ret;
+       
+       mono_once(&spin_once, spin_init);
+       
+       pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+                             (void *)&spin);
+       thr_ret = pthread_mutex_lock(&spin);
+       g_assert (thr_ret == 0);
+
+       (*dest)++;
+       ret= *dest;
+       
+       thr_ret = pthread_mutex_unlock(&spin);
+       g_assert (thr_ret == 0);
+       
+       pthread_cleanup_pop (0);
+       
+       return(ret);
+}
+
+gint32 InterlockedDecrement(volatile gint32 *dest)
+{
+       gint32 ret;
+       int thr_ret;
+       
+       mono_once(&spin_once, spin_init);
+       
+       pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+                             (void *)&spin);
+       thr_ret = pthread_mutex_lock(&spin);
+       g_assert (thr_ret == 0);
+       
+       (*dest)--;
+       ret= *dest;
+       
+       thr_ret = pthread_mutex_unlock(&spin);
+       g_assert (thr_ret == 0);
+       
+       pthread_cleanup_pop (0);
+       
+       return(ret);
+}
+
+gint32 InterlockedExchange(volatile gint32 *dest, gint32 exch)
+{
+       gint32 ret;
+       int thr_ret;
+       
+       mono_once(&spin_once, spin_init);
+       
+       pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+                             (void *)&spin);
+       thr_ret = pthread_mutex_lock(&spin);
+       g_assert (thr_ret == 0);
+
+       ret=*dest;
+       *dest=exch;
+       
+       thr_ret = pthread_mutex_unlock(&spin);
+       g_assert (thr_ret == 0);
+       
+       pthread_cleanup_pop (0);
+       
+       return(ret);
+}
+
+gpointer InterlockedExchangePointer(volatile gpointer *dest, gpointer exch)
+{
+       gpointer ret;
+       int thr_ret;
+       
+       mono_once(&spin_once, spin_init);
+       
+       pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+                             (void *)&spin);
+       thr_ret = pthread_mutex_lock(&spin);
+       g_assert (thr_ret == 0);
+       
+       ret=*dest;
+       *dest=exch;
+       
+       thr_ret = pthread_mutex_unlock(&spin);
+       g_assert (thr_ret == 0);
+       
+       pthread_cleanup_pop (0);
+       
+       return(ret);
+}
+
+gint32 InterlockedExchangeAdd(volatile gint32 *dest, gint32 add)
+{
+       gint32 ret;
+       int thr_ret;
+       
+       mono_once(&spin_once, spin_init);
+       
+       pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock,
+                             (void *)&spin);
+       thr_ret = pthread_mutex_lock(&spin);
+       g_assert (thr_ret == 0);
+
+       ret= *dest;
+       *dest+=add;
+       
+       thr_ret = pthread_mutex_unlock(&spin);
+       g_assert (thr_ret == 0);
+
+       pthread_cleanup_pop (0);
+
+       return(ret);
+}
+
+#endif
diff --git a/mono/utils/atomic.h b/mono/utils/atomic.h
new file mode 100644 (file)
index 0000000..171c2a4
--- /dev/null
@@ -0,0 +1,1327 @@
+/*
+ * atomic.h:  Atomic operations
+ *
+ * Author:
+ *     Dick Porter (dick@ximian.com)
+ *
+ * (C) 2002 Ximian, Inc.
+ * Copyright 2012 Xamarin Inc
+ */
+
+#ifndef _WAPI_ATOMIC_H_
+#define _WAPI_ATOMIC_H_
+
+#if defined(__NetBSD__)
+#include <sys/param.h>
+
+#if __NetBSD_Version__ > 499004000
+#include <sys/atomic.h>
+#define HAVE_ATOMIC_OPS
+#endif
+
+#endif
+
+#include <glib.h>
+
+#if defined(__WIN32__) || defined(_WIN32)
+
+#include <windows.h>
+
+#elif defined(__NetBSD__) && defined(HAVE_ATOMIC_OPS)
+
+static inline gint32 InterlockedCompareExchange(volatile gint32 *dest,
+       gint32 exch, gint32 comp)
+{
+       return atomic_cas_32((uint32_t*)dest, comp, exch);
+}
+
+static inline gpointer InterlockedCompareExchangePointer(volatile gpointer *dest, gpointer exch, gpointer comp)
+{
+       return atomic_cas_ptr(dest, comp, exch);
+}
+
+static inline gint32 InterlockedIncrement(volatile gint32 *val)
+{
+       return atomic_inc_32_nv((uint32_t*)val);
+}
+
+static inline gint32 InterlockedDecrement(volatile gint32 *val)
+{
+       return atomic_dec_32_nv((uint32_t*)val);
+}
+
+static inline gint32 InterlockedExchange(volatile gint32 *val, gint32 new_val)
+{
+       return atomic_swap_32((uint32_t*)val, new_val);
+}
+
+static inline gpointer InterlockedExchangePointer(volatile gpointer *val,
+               gpointer new_val)
+{
+       return atomic_swap_ptr(val, new_val);
+}
+
+static inline gint32 InterlockedExchangeAdd(volatile gint32 *val, gint32 add)
+{
+       return atomic_add_32_nv((uint32_t*)val, add) - add;
+}
+
+#elif defined(__i386__) || defined(__x86_64__)
+
+/*
+ * NB: The *Pointer() functions here assume that
+ * sizeof(pointer)==sizeof(gint32)
+ *
+ * NB2: These asm functions assume 486+ (some of the opcodes dont
+ * exist on 386).  If this becomes an issue, we can get configure to
+ * fall back to the non-atomic C versions of these calls.
+ */
+
+static inline gint32 InterlockedCompareExchange(volatile gint32 *dest,
+                                               gint32 exch, gint32 comp)
+{
+       gint32 old;
+
+       __asm__ __volatile__ ("lock; cmpxchgl %2, %0"
+                             : "=m" (*dest), "=a" (old)
+                             : "r" (exch), "m" (*dest), "a" (comp));   
+       return(old);
+}
+
+static inline gpointer InterlockedCompareExchangePointer(volatile gpointer *dest, gpointer exch, gpointer comp)
+{
+       gpointer old;
+
+       __asm__ __volatile__ ("lock; "
+#if defined(__x86_64__)  && !defined(__native_client__)
+                             "cmpxchgq"
+#else
+                             "cmpxchgl"
+#endif
+                             " %2, %0"
+                             : "=m" (*dest), "=a" (old)
+                             : "r" (exch), "m" (*dest), "a" (comp));   
+
+       return(old);
+}
+
+static inline gint32 InterlockedIncrement(volatile gint32 *val)
+{
+       gint32 tmp;
+       
+       __asm__ __volatile__ ("lock; xaddl %0, %1"
+                             : "=r" (tmp), "=m" (*val)
+                             : "0" (1), "m" (*val));
+
+       return(tmp+1);
+}
+
+static inline gint32 InterlockedDecrement(volatile gint32 *val)
+{
+       gint32 tmp;
+       
+       __asm__ __volatile__ ("lock; xaddl %0, %1"
+                             : "=r" (tmp), "=m" (*val)
+                             : "0" (-1), "m" (*val));
+
+       return(tmp-1);
+}
+
+/*
+ * See
+ * http://msdn.microsoft.com/msdnmag/issues/0700/Win32/
+ * for the reasons for using cmpxchg and a loop here.
+ */
+static inline gint32 InterlockedExchange(volatile gint32 *val, gint32 new_val)
+{
+       gint32 ret;
+
+       __asm__ __volatile__ ("1:; lock; cmpxchgl %2, %0; jne 1b"
+                             : "=m" (*val), "=a" (ret)
+                             : "r" (new_val), "m" (*val), "a" (*val));
+       return(ret);
+}
+
+static inline gpointer InterlockedExchangePointer(volatile gpointer *val,
+                                                 gpointer new_val)
+{
+       gpointer ret;
+       
+       __asm__ __volatile__ ("1:; lock; "
+#if defined(__x86_64__)  && !defined(__native_client__)
+                             "cmpxchgq"
+#else
+                             "cmpxchgl"
+#endif
+                             " %2, %0; jne 1b"
+                             : "=m" (*val), "=a" (ret)
+                             : "r" (new_val), "m" (*val), "a" (*val));
+
+       return(ret);
+}
+
+static inline gint32 InterlockedExchangeAdd(volatile gint32 *val, gint32 add)
+{
+       gint32 ret;
+       
+       __asm__ __volatile__ ("lock; xaddl %0, %1"
+                             : "=r" (ret), "=m" (*val)
+                             : "0" (add), "m" (*val));
+       
+       return(ret);
+}
+
+#elif (defined(sparc) || defined (__sparc__)) && defined(__GNUC__)
+
+G_GNUC_UNUSED 
+static inline gint32 InterlockedCompareExchange(volatile gint32 *_dest, gint32 _exch, gint32 _comp)
+{
+       register volatile gint32 *dest asm("g1") = _dest;
+       register gint32 comp asm("o4") = _comp;
+       register gint32 exch asm("o5") = _exch;
+
+       __asm__ __volatile__(
+               /* cas [%%g1], %%o4, %%o5 */
+               ".word 0xdbe0500c"
+               : "=r" (exch)
+               : "0" (exch), "r" (dest), "r" (comp)
+               : "memory");
+
+       return exch;
+}
+
+G_GNUC_UNUSED 
+static inline gpointer InterlockedCompareExchangePointer(volatile gpointer *_dest, gpointer _exch, gpointer _comp)
+{
+       register volatile gpointer *dest asm("g1") = _dest;
+       register gpointer comp asm("o4") = _comp;
+       register gpointer exch asm("o5") = _exch;
+
+       __asm__ __volatile__(
+#ifdef SPARCV9
+               /* casx [%%g1], %%o4, %%o5 */
+               ".word 0xdbf0500c"
+#else
+               /* cas [%%g1], %%o4, %%o5 */
+               ".word 0xdbe0500c"
+#endif
+               : "=r" (exch)
+               : "0" (exch), "r" (dest), "r" (comp)
+               : "memory");
+
+       return exch;
+}
+
+G_GNUC_UNUSED 
+static inline gint32 InterlockedIncrement(volatile gint32 *_dest)
+{
+       register volatile gint32 *dest asm("g1") = _dest;
+       register gint32 tmp asm("o4");
+       register gint32 ret asm("o5");
+
+       __asm__ __volatile__(
+               "1:     ld      [%%g1], %%o4\n\t"
+               "       add     %%o4, 1, %%o5\n\t"
+               /*      cas     [%%g1], %%o4, %%o5 */
+               "       .word   0xdbe0500c\n\t"
+               "       cmp     %%o4, %%o5\n\t"
+               "       bne     1b\n\t"
+               "        add    %%o5, 1, %%o5"
+               : "=&r" (tmp), "=&r" (ret)
+               : "r" (dest)
+               : "memory", "cc");
+
+        return ret;
+}
+
+G_GNUC_UNUSED 
+static inline gint32 InterlockedDecrement(volatile gint32 *_dest)
+{
+       register volatile gint32 *dest asm("g1") = _dest;
+       register gint32 tmp asm("o4");
+       register gint32 ret asm("o5");
+
+       __asm__ __volatile__(
+               "1:     ld      [%%g1], %%o4\n\t"
+               "       sub     %%o4, 1, %%o5\n\t"
+               /*      cas     [%%g1], %%o4, %%o5 */
+               "       .word   0xdbe0500c\n\t"
+               "       cmp     %%o4, %%o5\n\t"
+               "       bne     1b\n\t"
+               "        sub    %%o5, 1, %%o5"
+               : "=&r" (tmp), "=&r" (ret)
+               : "r" (dest)
+               : "memory", "cc");
+
+        return ret;
+}
+
+G_GNUC_UNUSED
+static inline gint32 InterlockedExchange(volatile gint32 *_dest, gint32 exch)
+{
+       register volatile gint32 *dest asm("g1") = _dest;
+       register gint32 tmp asm("o4");
+       register gint32 ret asm("o5");
+
+       __asm__ __volatile__(
+               "1:     ld      [%%g1], %%o4\n\t"
+               "       mov     %3, %%o5\n\t"
+               /*      cas     [%%g1], %%o4, %%o5 */
+               "       .word   0xdbe0500c\n\t"
+               "       cmp     %%o4, %%o5\n\t"
+               "       bne     1b\n\t"
+               "        nop"
+               : "=&r" (tmp), "=&r" (ret)
+               : "r" (dest), "r" (exch)
+               : "memory", "cc");
+
+        return ret;
+}
+
+G_GNUC_UNUSED
+static inline gpointer InterlockedExchangePointer(volatile gpointer *_dest, gpointer exch)
+{
+       register volatile gpointer *dest asm("g1") = _dest;
+       register gpointer tmp asm("o4");
+       register gpointer ret asm("o5");
+
+       __asm__ __volatile__(
+#ifdef SPARCV9
+               "1:     ldx     [%%g1], %%o4\n\t"
+#else
+               "1:     ld      [%%g1], %%o4\n\t"
+#endif
+               "       mov     %3, %%o5\n\t"
+#ifdef SPARCV9
+               /*      casx    [%%g1], %%o4, %%o5 */
+               "       .word   0xdbf0500c\n\t"
+#else
+               /*      cas     [%%g1], %%o4, %%o5 */
+               "       .word   0xdbe0500c\n\t"
+#endif
+               "       cmp     %%o4, %%o5\n\t"
+               "       bne     1b\n\t"
+               "        nop"
+               : "=&r" (tmp), "=&r" (ret)
+               : "r" (dest), "r" (exch)
+               : "memory", "cc");
+
+        return ret;
+}
+
+G_GNUC_UNUSED
+static inline gint32 InterlockedExchangeAdd(volatile gint32 *_dest, gint32 add)
+{
+       register volatile gint32 *dest asm("g1") = _dest;
+       register gint32 tmp asm("o4");
+       register gint32 ret asm("o5");
+
+       __asm__ __volatile__(
+               "1:     ld      [%%g1], %%o4\n\t"
+               "       add     %%o4, %3, %%o5\n\t"
+               /*      cas     [%%g1], %%o4, %%o5 */
+               "       .word   0xdbe0500c\n\t"
+               "       cmp     %%o4, %%o5\n\t"
+               "       bne     1b\n\t"
+               "        add    %%o5, %3, %%o5"
+               : "=&r" (tmp), "=&r" (ret)
+               : "r" (dest), "r" (add)
+               : "memory", "cc");
+
+        return ret;
+}
+
+#elif __s390__
+
+static inline gint32 
+InterlockedCompareExchange(volatile gint32 *dest,
+                          gint32 exch, gint32 comp)
+{
+       gint32 old;
+
+       __asm__ __volatile__ ("\tLA\t1,%0\n"
+                             "\tLR\t%1,%3\n"
+                             "\tCS\t%1,%2,0(1)\n"
+                             : "+m" (*dest), "=&r" (old)
+                             : "r" (exch), "r" (comp)
+                             : "1", "cc");     
+       return(old);
+}
+
+#ifndef __s390x__
+static inline gpointer
+InterlockedCompareExchangePointer(volatile gpointer *dest,
+                          gpointer exch, gpointer comp)
+{
+       gpointer old;
+
+       __asm__ __volatile__ ("\tLA\t1,%0\n"
+                             "\tLR\t%1,%3\n"
+                             "\tCS\t%1,%2,0(1)\n"
+                             : "+m" (*dest), "=&r" (old)
+                             : "r" (exch), "r" (comp)
+                             : "1", "cc");     
+       return(old);
+}
+# else
+static inline gpointer 
+InterlockedCompareExchangePointer(volatile gpointer *dest, 
+                                 gpointer exch, 
+                                 gpointer comp)
+{
+       gpointer old;
+
+       __asm__ __volatile__ ("\tLA\t1,%0\n"
+                             "\tLGR\t%1,%3\n"
+                             "\tCSG\t%1,%2,0(1)\n"
+                             : "+m" (*dest), "=&r" (old)
+                             : "r" (exch), "r" (comp)
+                             : "1", "cc");
+
+       return(old);
+}
+# endif
+
+# ifndef __s390x__
+static inline gint32 
+InterlockedIncrement(volatile gint32 *val)
+{
+       gint32 tmp;
+       
+       __asm__ __volatile__ ("\tLA\t2,%1\n"
+                             "0:\tL\t%0,%1\n"
+                             "\tLR\t1,%0\n"
+                             "\tAHI\t1,1\n"
+                             "\tCS\t%0,1,0(2)\n"
+                             "\tJNZ\t0b\n"
+                             "\tLR\t%0,1"
+                             : "=r" (tmp), "+m" (*val)
+                             : : "1", "2", "cc");
+
+       return(tmp);
+}
+# else
+static inline gint32 
+InterlockedIncrement(volatile gint32 *val)
+{
+       gint32 tmp;
+       
+       __asm__ __volatile__ ("\tLA\t2,%1\n"
+                             "0:\tLGF\t%0,%1\n"
+                             "\tLGFR\t1,%0\n"
+                             "\tAGHI\t1,1\n"
+                             "\tCS\t%0,1,0(2)\n"
+                             "\tJNZ\t0b\n"
+                             "\tLGFR\t%0,1"
+                             : "=r" (tmp), "+m" (*val)
+                             : : "1", "2", "cc");
+
+       return(tmp);
+}
+# endif
+
+# ifndef __s390x__
+static inline gint32 
+InterlockedDecrement(volatile gint32 *val)
+{
+       gint32 tmp;
+       
+       __asm__ __volatile__ ("\tLA\t2,%1\n"
+                             "0:\tL\t%0,%1\n"
+                             "\tLR\t1,%0\n"
+                             "\tAHI\t1,-1\n"
+                             "\tCS\t%0,1,0(2)\n"
+                             "\tJNZ\t0b\n"
+                             "\tLR\t%0,1"
+                             : "=r" (tmp), "+m" (*val)
+                             : : "1", "2", "cc");
+
+       return(tmp);
+}
+# else
+static inline gint32 
+InterlockedDecrement(volatile gint32 *val)
+{
+       gint32 tmp;
+       
+       __asm__ __volatile__ ("\tLA\t2,%1\n"
+                             "0:\tLGF\t%0,%1\n"
+                             "\tLGFR\t1,%0\n"
+                             "\tAGHI\t1,-1\n"
+                             "\tCS\t%0,1,0(2)\n"
+                             "\tJNZ\t0b\n"
+                             "\tLGFR\t%0,1"
+                             : "=r" (tmp), "+m" (*val)
+                             : : "1", "2", "cc");
+
+       return(tmp);
+}
+# endif
+
+static inline gint32 
+InterlockedExchange(volatile gint32 *val, gint32 new_val)
+{
+       gint32 ret;
+       
+       __asm__ __volatile__ ("\tLA\t1,%0\n"
+                             "0:\tL\t%1,%0\n"
+                             "\tCS\t%1,%2,0(1)\n"
+                             "\tJNZ\t0b"
+                             : "+m" (*val), "=&r" (ret)
+                             : "r" (new_val)
+                             : "1", "cc");
+
+       return(ret);
+}
+
+# ifndef __s390x__
+static inline gpointer 
+InterlockedExchangePointer(volatile gpointer *val, gpointer new_val)
+{
+       gpointer ret;
+       
+       __asm__ __volatile__ ("\tLA\t1,%0\n"
+                             "0:\tL\t%1,%0\n"
+                             "\tCS\t%1,%2,0(1)\n"
+                             "\tJNZ\t0b"
+                             : "+m" (*val), "=&r" (ret)
+                             : "r" (new_val)
+                             : "1", "cc");
+
+       return(ret);
+}
+# else
+static inline gpointer
+InterlockedExchangePointer(volatile gpointer *val, gpointer new_val)
+{
+       gpointer ret;
+       
+       __asm__ __volatile__ ("\tLA\t1,%0\n"
+                             "0:\tLG\t%1,%0\n"
+                             "\tCSG\t%1,%2,0(1)\n"
+                             "\tJNZ\t0b"
+                             : "+m" (*val), "=&r" (ret)
+                             : "r" (new_val)
+                             : "1", "cc");
+
+       return(ret);
+}
+# endif
+
+# ifndef __s390x__
+static inline gint32 
+InterlockedExchangeAdd(volatile gint32 *val, gint32 add)
+{
+       gint32 ret;
+
+       __asm__ __volatile__ ("\tLA\t2,%1\n"
+                             "0:\tL\t%0,%1\n"
+                             "\tLR\t1,%0\n"
+                             "\tAR\t1,%2\n"
+                             "\tCS\t%0,1,0(2)\n"
+                             "\tJNZ\t0b"
+                             : "=&r" (ret), "+m" (*val)
+                             : "r" (add) 
+                             : "1", "2", "cc");
+       
+       return(ret);
+}
+# else
+static inline gint32 
+InterlockedExchangeAdd(volatile gint32 *val, gint32 add)
+{
+       gint32 ret;
+
+       __asm__ __volatile__ ("\tLA\t2,%1\n"
+                             "0:\tLGF\t%0,%1\n"
+                             "\tLGFR\t1,%0\n"
+                             "\tAGR\t1,%2\n"
+                             "\tCS\t%0,1,0(2)\n"
+                             "\tJNZ\t0b"
+                             : "=&r" (ret), "+m" (*val)
+                             : "r" (add) 
+                             : "1", "2", "cc");
+       
+       return(ret);
+}
+# endif
+
+#elif defined(__mono_ppc__)
+
+#ifdef G_COMPILER_CODEWARRIOR
+static inline gint32 InterlockedIncrement(volatile register gint32 *val)
+{
+       gint32 result = 0, tmp;
+       register gint32 result = 0;
+       register gint32 tmp;
+
+       asm
+       {
+               @1:
+                       lwarx   tmp, 0, val
+                       addi    result, tmp, 1
+                       stwcx.  result, 0, val
+                       bne-    @1
+       }
+       return result;
+}
+
+static inline gint32 InterlockedDecrement(register volatile gint32 *val)
+{
+       register gint32 result = 0;
+       register gint32 tmp;
+
+       asm
+       {
+               @1:
+                       lwarx   tmp, 0, val
+                       addi    result, tmp, -1
+                       stwcx.  result, 0, val
+                       bne-    @1
+       }
+
+       return result;
+}
+#define InterlockedCompareExchangePointer(dest,exch,comp) (void*)InterlockedCompareExchange((volatile gint32 *)(dest), (gint32)(exch), (gint32)(comp))
+
+static inline gint32 InterlockedCompareExchange(volatile register gint32 *dest, register gint32 exch, register gint32 comp)
+{
+       register gint32 tmp = 0;
+
+       asm
+       {
+               @1:
+                       lwarx   tmp, 0, dest
+                       cmpw    tmp, comp
+                       bne-    @2
+                       stwcx.  exch, 0, dest
+                       bne-    @1
+               @2:
+       }
+
+       return tmp;
+}
+static inline gint32 InterlockedExchange(register volatile gint32 *dest, register gint32 exch)
+{
+       register gint32 tmp = 0;
+
+       asm
+       {
+               @1:
+                       lwarx   tmp, 0, dest
+                       stwcx.  exch, 0, dest
+                       bne-    @1
+       }
+
+       return tmp;
+}
+#define InterlockedExchangePointer(dest,exch) (void*)InterlockedExchange((volatile gint32 *)(dest), (gint32)(exch))
+#else
+
+#if defined(__mono_ppc64__) && !defined(__mono_ilp32__)
+#define LDREGX "ldarx"
+#define STREGCXD "stdcx."
+#define CMPREG "cmpd"
+#else
+#define LDREGX "lwarx"
+#define STREGCXD "stwcx."
+#define CMPREG "cmpw"
+#endif
+
+static inline gint32 InterlockedIncrement(volatile gint32 *val)
+{
+       gint32 result = 0, tmp;
+
+       __asm__ __volatile__ ("\n1:\n\t"
+                             "lwarx  %0, 0, %2\n\t"
+                             "addi   %1, %0, 1\n\t"
+                              "stwcx. %1, 0, %2\n\t"
+                             "bne-   1b"
+                             : "=&b" (result), "=&b" (tmp): "r" (val): "cc", "memory");
+       return result + 1;
+}
+
+static inline gint32 InterlockedDecrement(volatile gint32 *val)
+{
+       gint32 result = 0, tmp;
+
+       __asm__ __volatile__ ("\n1:\n\t"
+                             "lwarx  %0, 0, %2\n\t"
+                             "addi   %1, %0, -1\n\t"
+                              "stwcx. %1, 0, %2\n\t"
+                             "bne-   1b"
+                             : "=&b" (result), "=&b" (tmp): "r" (val): "cc", "memory");
+       return result - 1;
+}
+
+static inline gpointer InterlockedCompareExchangePointer (volatile gpointer *dest,
+                                               gpointer exch, gpointer comp)
+{
+       gpointer tmp = NULL;
+
+       __asm__ __volatile__ ("\n1:\n\t"
+                            LDREGX " %0, 0, %1\n\t"
+                            CMPREG " %0, %2\n\t" 
+                            "bne-    2f\n\t"
+                            STREGCXD " %3, 0, %1\n\t"
+                            "bne-    1b\n"
+                            "2:"
+                            : "=&r" (tmp)
+                            : "b" (dest), "r" (comp), "r" (exch): "cc", "memory");
+       return(tmp);
+}
+
+static inline gint32 InterlockedCompareExchange(volatile gint32 *dest,
+                                               gint32 exch, gint32 comp) {
+       gint32 tmp = 0;
+
+       __asm__ __volatile__ ("\n1:\n\t"
+                            "lwarx   %0, 0, %1\n\t"
+                            "cmpw    %0, %2\n\t" 
+                            "bne-    2f\n\t"
+                            "stwcx.  %3, 0, %1\n\t"
+                            "bne-    1b\n"
+                            "2:"
+                            : "=&r" (tmp)
+                            : "b" (dest), "r" (comp), "r" (exch): "cc", "memory");
+       return(tmp);
+}
+
+static inline gint32 InterlockedExchange(volatile gint32 *dest, gint32 exch)
+{
+       gint32 tmp = 0;
+
+       __asm__ __volatile__ ("\n1:\n\t"
+                             "lwarx  %0, 0, %2\n\t"
+                             "stwcx. %3, 0, %2\n\t"
+                             "bne    1b"
+                             : "=r" (tmp) : "0" (tmp), "b" (dest), "r" (exch): "cc", "memory");
+       return(tmp);
+}
+
+static inline gpointer InterlockedExchangePointer (volatile gpointer *dest, gpointer exch)
+{
+       gpointer tmp = NULL;
+
+       __asm__ __volatile__ ("\n1:\n\t"
+                             LDREGX " %0, 0, %2\n\t"
+                             STREGCXD " %3, 0, %2\n\t"
+                             "bne    1b"
+                             : "=r" (tmp) : "0" (tmp), "b" (dest), "r" (exch): "cc", "memory");
+       return(tmp);
+}
+
+static inline gint32 InterlockedExchangeAdd(volatile gint32 *dest, gint32 add)
+{
+        gint32 result, tmp;
+        __asm__ __volatile__ ("\n1:\n\t"
+                              "lwarx  %0, 0, %2\n\t"
+                              "add    %1, %0, %3\n\t"
+                              "stwcx. %1, 0, %2\n\t"
+                              "bne    1b"
+                              : "=&r" (result), "=&r" (tmp)
+                              : "r" (dest), "r" (add) : "cc", "memory");
+        return(result);
+}
+
+#undef LDREGX
+#undef STREGCXD
+#undef CMPREG
+
+#endif /* !G_COMPILER_CODEWARRIOR */
+
+#elif defined(__arm__)
+
+#ifdef __native_client__
+#define MASK_REGISTER(reg, cond) "bic" cond " " reg ", " reg ", #0xc0000000\n"
+#define NACL_ALIGN() ".align 4\n"
+#else
+#define MASK_REGISTER(reg, cond)
+#define NACL_ALIGN()
+#endif
+
+/*
+ * Atomic operations on ARM doesn't contain memory barriers, and the runtime code
+ * depends on this, so we add them explicitly.
+ */
+
+static inline gint32 InterlockedCompareExchange(volatile gint32 *dest, gint32 exch, gint32 comp)
+{
+#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7S__)
+       gint32 ret, tmp;
+       __asm__ __volatile__ (  "1:\n"
+                               NACL_ALIGN()
+                               "dmb\n"
+                               "mov    %0, #0\n"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%2", "al")
+                               "ldrex %1, [%2]\n"
+                               "teq    %1, %3\n"
+                               "it eq\n"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%2", "eq")
+                               "strexeq %0, %4, [%2]\n"
+                               "teq %0, #0\n"
+                               "bne 1b\n"
+                               "dmb\n"
+                               : "=&r" (tmp), "=&r" (ret)
+                               : "r" (dest), "r" (comp), "r" (exch)
+                               : "memory", "cc");
+
+       return ret;
+#else
+       gint32 a, b;
+
+       __asm__ __volatile__ (    "0:\n\t"
+                                 NACL_ALIGN()
+                                 MASK_REGISTER("%2", "al")
+                                 "ldr %1, [%2]\n\t"
+                                 "cmp %1, %4\n\t"
+                                 "mov %0, %1\n\t"
+                                 "bne 1f\n\t"
+                                 NACL_ALIGN()
+                                 MASK_REGISTER("%2", "al")
+                                 "swp %0, %3, [%2]\n\t"
+                                 "cmp %0, %1\n\t"
+                                 NACL_ALIGN()
+                                 MASK_REGISTER("%2", "ne")
+                                 "swpne %3, %0, [%2]\n\t"
+                                 "bne 0b\n\t"
+                                 "1:"
+                                 : "=&r" (a), "=&r" (b)
+                                 : "r" (dest), "r" (exch), "r" (comp)
+                                 : "cc", "memory");
+
+       return a;
+#endif
+}
+
+static inline gpointer InterlockedCompareExchangePointer(volatile gpointer *dest, gpointer exch, gpointer comp)
+{
+#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7S__)
+       gpointer ret, tmp;
+       __asm__ __volatile__ (
+                               "dmb\n"
+                               "1:\n"
+                               NACL_ALIGN()
+                               "mov    %0, #0\n"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%2", "al")
+                               "ldrex %1, [%2]\n"
+                               "teq    %1, %3\n"
+                               "it eq\n"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%2", "eq")
+                               "strexeq %0, %4, [%2]\n"
+                               "teq %0, #0\n"
+                               "bne 1b\n"
+                               "dmb\n"
+                               : "=&r" (tmp), "=&r" (ret)
+                               : "r" (dest), "r" (comp), "r" (exch)
+                               : "memory", "cc");
+
+       return ret;
+#else
+       gpointer a, b;
+
+       __asm__ __volatile__ (    "0:\n\t"
+                                 NACL_ALIGN()
+                                 MASK_REGISTER("%2", "al")
+                                 "ldr %1, [%2]\n\t"
+                                 "cmp %1, %4\n\t"
+                                 "mov %0, %1\n\t"
+                                 "bne 1f\n\t"
+                                 NACL_ALIGN()
+                                 MASK_REGISTER("%2", "eq")
+                                 "swpeq %0, %3, [%2]\n\t"
+                                 "cmp %0, %1\n\t"
+                                 NACL_ALIGN()
+                                 MASK_REGISTER("%2", "ne")
+                                 "swpne %3, %0, [%2]\n\t"
+                                 "bne 0b\n\t"
+                                 "1:"
+                                 : "=&r" (a), "=&r" (b)
+                                 : "r" (dest), "r" (exch), "r" (comp)
+                                 : "cc", "memory");
+
+       return a;
+#endif
+}
+
+static inline gint32 InterlockedIncrement(volatile gint32 *dest)
+{
+#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7S__)
+       gint32 ret, flag;
+       __asm__ __volatile__ (
+                               "dmb\n"
+                               "1:\n"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%2", "al")
+                               "ldrex %0, [%2]\n"
+                               "add %0, %0, %3\n"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%2", "al")
+                               "strex %1, %0, [%2]\n"
+                               "teq %1, #0\n"
+                               "bne 1b\n"
+                               "dmb\n"
+                               : "=&r" (ret), "=&r" (flag)
+                               : "r" (dest), "r" (1)
+                               : "memory", "cc");
+
+       return ret;
+#else
+       gint32 a, b, c;
+
+       __asm__ __volatile__ (  "0:\n\t"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%3", "al")
+                               "ldr %0, [%3]\n\t"
+                               "add %1, %0, %4\n\t"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%3", "al")
+                               "swp %2, %1, [%3]\n\t"
+                               "cmp %0, %2\n\t"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%3", "ne")
+                               "swpne %1, %2, [%3]\n\t"
+                               "bne 0b"
+                               : "=&r" (a), "=&r" (b), "=&r" (c)
+                               : "r" (dest), "r" (1)
+                               : "cc", "memory");
+
+       return b;
+#endif
+}
+
+static inline gint32 InterlockedDecrement(volatile gint32 *dest)
+{
+#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7S__)
+       gint32 ret, flag;
+       __asm__ __volatile__ (
+                               "dmb\n"
+                               "1:\n"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%2", "al")
+                               "ldrex %0, [%2]\n"
+                               "sub %0, %0, %3\n"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%2", "al")
+                               "strex %1, %0, [%2]\n"
+                               "teq %1, #0\n"
+                               "bne 1b\n"
+                               "dmb\n"
+                               : "=&r" (ret), "=&r" (flag)
+                               : "r" (dest), "r" (1)
+                               : "memory", "cc");
+
+       return ret;
+#else
+       gint32 a, b, c;
+
+       __asm__ __volatile__ (  "0:\n\t"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%3", "al")
+                               "ldr %0, [%3]\n\t"
+                               "add %1, %0, %4\n\t"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%3", "al")
+                               "swp %2, %1, [%3]\n\t"
+                               "cmp %0, %2\n\t"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%3", "ne")
+                               "swpne %1, %2, [%3]\n\t"
+                               "bne 0b"
+                               : "=&r" (a), "=&r" (b), "=&r" (c)
+                               : "r" (dest), "r" (-1)
+                               : "cc", "memory");
+
+       return b;
+#endif
+}
+
+static inline gint32 InterlockedExchange(volatile gint32 *dest, gint32 exch)
+{
+#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7S__)
+       gint32 ret, flag;
+       __asm__ __volatile__ (
+                                 "dmb\n"
+                             "1:\n"
+                             NACL_ALIGN()
+                             MASK_REGISTER("%3", "al")
+                             "ldrex %0, [%3]\n"
+                             NACL_ALIGN()
+                             MASK_REGISTER("%3", "al")
+                             "strex %1, %2, [%3]\n"
+                             "teq %1, #0\n"
+                             "bne 1b\n"
+                                 "dmb\n"
+                             : "=&r" (ret), "=&r" (flag)
+                             : "r" (exch), "r" (dest)
+                             : "memory", "cc");
+       return ret;
+#else
+       gint32 a;
+
+       __asm__ __volatile__ (  NACL_ALIGN()
+                               MASK_REGISTER("%1", "al")
+                                "swp %0, %2, [%1]"
+                               : "=&r" (a)
+                               : "r" (dest), "r" (exch));
+
+       return a;
+#endif
+}
+
+static inline gpointer InterlockedExchangePointer(volatile gpointer *dest, gpointer exch)
+{
+#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7S__)
+       gpointer ret, flag;
+       __asm__ __volatile__ (
+                                 "dmb\n"
+                             "1:\n"
+                             NACL_ALIGN()
+                             MASK_REGISTER("%3", "al")
+                             "ldrex %0, [%3]\n"
+                             NACL_ALIGN()
+                             MASK_REGISTER("%3", "al")
+                             "strex %1, %2, [%3]\n"
+                             "teq %1, #0\n"
+                             "bne 1b\n"
+                                 "dmb\n"
+                             : "=&r" (ret), "=&r" (flag)
+                             : "r" (exch), "r" (dest)
+                             : "memory", "cc");
+       return ret;
+#else
+       gpointer a;
+
+       __asm__ __volatile__ (  NACL_ALIGN()
+                               MASK_REGISTER("%1", "al")
+                                "swp %0, %2, [%1]"
+                               : "=&r" (a)
+                               : "r" (dest), "r" (exch));
+
+       return a;
+#endif
+}
+
+static inline gint32 InterlockedExchangeAdd(volatile gint32 *dest, gint32 add)
+{
+#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7S__)
+       gint32 ret, tmp, flag;
+       __asm__ __volatile__ (
+                               "dmb\n"
+                               "1:\n"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%3", "al")
+                               "ldrex %0, [%3]\n"
+                               "add %1, %0, %4\n"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%3", "al")
+                               "strex %2, %1, [%3]\n"
+                               "teq %2, #0\n"
+                               "bne 1b\n"
+                               "dmb\n"
+                               : "=&r" (ret), "=&r" (tmp), "=&r" (flag)
+                               : "r" (dest), "r" (add)
+                               : "memory", "cc");
+
+       return ret;
+#else
+       int a, b, c;
+
+       __asm__ __volatile__ (  "0:\n\t"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%3", "al")
+                               "ldr %0, [%3]\n\t"
+                               "add %1, %0, %4\n\t"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%3", "al")
+                               "swp %2, %1, [%3]\n\t"
+                               "cmp %0, %2\n\t"
+                               NACL_ALIGN()
+                               MASK_REGISTER("%3", "ne")
+                               "swpne %1, %2, [%3]\n\t"
+                               "bne 0b"
+                               : "=&r" (a), "=&r" (b), "=&r" (c)
+                               : "r" (dest), "r" (add)
+                               : "cc", "memory");
+
+       return a;
+#endif
+}
+
+#elif defined(__ia64__)
+
+#ifdef __INTEL_COMPILER
+#include <ia64intrin.h>
+#endif
+
+static inline gint32 InterlockedCompareExchange(gint32 volatile *dest,
+                                               gint32 exch, gint32 comp)
+{
+       gint32 old;
+       guint64 real_comp;
+
+#ifdef __INTEL_COMPILER
+       old = _InterlockedCompareExchange (dest, exch, comp);
+#else
+       /* cmpxchg4 zero extends the value read from memory */
+       real_comp = (guint64)(guint32)comp;
+       asm volatile ("mov ar.ccv = %2 ;;\n\t"
+                                 "cmpxchg4.acq %0 = [%1], %3, ar.ccv\n\t"
+                                 : "=r" (old) : "r" (dest), "r" (real_comp), "r" (exch));
+#endif
+
+       return(old);
+}
+
+static inline gpointer InterlockedCompareExchangePointer(gpointer volatile *dest,
+                                               gpointer exch, gpointer comp)
+{
+       gpointer old;
+
+#ifdef __INTEL_COMPILER
+       old = _InterlockedCompareExchangePointer (dest, exch, comp);
+#else
+       asm volatile ("mov ar.ccv = %2 ;;\n\t"
+                                 "cmpxchg8.acq %0 = [%1], %3, ar.ccv\n\t"
+                                 : "=r" (old) : "r" (dest), "r" (comp), "r" (exch));
+#endif
+
+       return(old);
+}
+
+static inline gint32 InterlockedIncrement(gint32 volatile *val)
+{
+#ifdef __INTEL_COMPILER
+       return _InterlockedIncrement (val);
+#else
+       gint32 old;
+
+       do {
+               old = *val;
+       } while (InterlockedCompareExchange (val, old + 1, old) != old);
+
+       return old + 1;
+#endif
+}
+
+static inline gint32 InterlockedDecrement(gint32 volatile *val)
+{
+#ifdef __INTEL_COMPILER
+       return _InterlockedDecrement (val);
+#else
+       gint32 old;
+
+       do {
+               old = *val;
+       } while (InterlockedCompareExchange (val, old - 1, old) != old);
+
+       return old - 1;
+#endif
+}
+
+static inline gint32 InterlockedExchange(gint32 volatile *dest, gint32 new_val)
+{
+#ifdef __INTEL_COMPILER
+       return _InterlockedExchange (dest, new_val);
+#else
+       gint32 res;
+
+       do {
+               res = *dest;
+       } while (InterlockedCompareExchange (dest, new_val, res) != res);
+
+       return res;
+#endif
+}
+
+static inline gpointer InterlockedExchangePointer(gpointer volatile *dest, gpointer new_val)
+{
+#ifdef __INTEL_COMPILER
+       return (gpointer)_InterlockedExchange64 ((gint64*)dest, (gint64)new_val);
+#else
+       gpointer res;
+
+       do {
+               res = *dest;
+       } while (InterlockedCompareExchangePointer (dest, new_val, res) != res);
+
+       return res;
+#endif
+}
+
+static inline gint32 InterlockedExchangeAdd(gint32 volatile *val, gint32 add)
+{
+       gint32 old;
+
+#ifdef __INTEL_COMPILER
+       old = _InterlockedExchangeAdd (val, add);
+#else
+       do {
+               old = *val;
+       } while (InterlockedCompareExchange (val, old + add, old) != old);
+
+       return old;
+#endif
+}
+
+#elif defined(__mips__)
+
+#if SIZEOF_REGISTER == 8
+#error "Not implemented."
+#endif
+
+static inline gint32 InterlockedIncrement(volatile gint32 *val)
+{
+       gint32 tmp, result = 0;
+
+       __asm__ __volatile__ ("    .set    mips32\n"
+                             "1:  ll      %0, %2\n"
+                             "    addu    %1, %0, 1\n"
+                              "    sc      %1, %2\n"
+                             "    beqz    %1, 1b\n"
+                             "    .set    mips0\n"
+                             : "=&r" (result), "=&r" (tmp), "=m" (*val)
+                             : "m" (*val));
+       return result + 1;
+}
+
+static inline gint32 InterlockedDecrement(volatile gint32 *val)
+{
+       gint32 tmp, result = 0;
+
+       __asm__ __volatile__ ("    .set    mips32\n"
+                             "1:  ll      %0, %2\n"
+                             "    subu    %1, %0, 1\n"
+                              "    sc      %1, %2\n"
+                             "    beqz    %1, 1b\n"
+                             "    .set    mips0\n"
+                             : "=&r" (result), "=&r" (tmp), "=m" (*val)
+                             : "m" (*val));
+       return result - 1;
+}
+
+static inline gint32 InterlockedCompareExchange(volatile gint32 *dest,
+                                               gint32 exch, gint32 comp) {
+       gint32 old, tmp;
+
+       __asm__ __volatile__ ("    .set    mips32\n"
+                             "1:  ll      %0, %2\n"
+                             "    bne     %0, %5, 2f\n"
+                             "    move    %1, %4\n"
+                              "    sc      %1, %2\n"
+                             "    beqz    %1, 1b\n"
+                             "2:  .set    mips0\n"
+                             : "=&r" (old), "=&r" (tmp), "=m" (*dest)
+                             : "m" (*dest), "r" (exch), "r" (comp));
+       return(old);
+}
+
+static inline gpointer InterlockedCompareExchangePointer(volatile gpointer *dest, gpointer exch, gpointer comp)
+{
+       return (gpointer)(InterlockedCompareExchange((volatile gint32 *)(dest), (gint32)(exch), (gint32)(comp)));
+}
+
+static inline gint32 InterlockedExchange(volatile gint32 *dest, gint32 exch)
+{
+       gint32 result, tmp;
+
+       __asm__ __volatile__ ("    .set    mips32\n"
+                             "1:  ll      %0, %2\n"
+                             "    move    %1, %4\n"
+                              "    sc      %1, %2\n"
+                             "    beqz    %1, 1b\n"
+                             "    .set    mips0\n"
+                             : "=&r" (result), "=&r" (tmp), "=m" (*dest)
+                             : "m" (*dest), "r" (exch));
+       return(result);
+}
+
+static inline gpointer InterlockedExchangePointer(volatile gpointer *dest, gpointer exch)
+{
+       return (gpointer)InterlockedExchange((volatile gint32 *)(dest), (gint32)(exch));
+}
+
+static inline gint32 InterlockedExchangeAdd(volatile gint32 *dest, gint32 add)
+{
+        gint32 result, tmp;
+
+       __asm__ __volatile__ ("    .set    mips32\n"
+                             "1:  ll      %0, %2\n"
+                             "    addu    %1, %0, %4\n"
+                              "    sc      %1, %2\n"
+                             "    beqz    %1, 1b\n"
+                             "    .set    mips0\n"
+                             : "=&r" (result), "=&r" (tmp), "=m" (*dest)
+                             : "m" (*dest), "r" (add));
+        return result;
+}
+
+#else
+
+#define WAPI_NO_ATOMIC_ASM
+
+extern gint32 InterlockedCompareExchange(volatile gint32 *dest, gint32 exch, gint32 comp);
+extern gpointer InterlockedCompareExchangePointer(volatile gpointer *dest, gpointer exch, gpointer comp);
+extern gint32 InterlockedIncrement(volatile gint32 *dest);
+extern gint32 InterlockedDecrement(volatile gint32 *dest);
+extern gint32 InterlockedExchange(volatile gint32 *dest, gint32 exch);
+extern gpointer InterlockedExchangePointer(volatile gpointer *dest, gpointer exch);
+extern gint32 InterlockedExchangeAdd(volatile gint32 *dest, gint32 add);
+
+#endif
+
+/* Not yet used */
+#ifdef USE_GCC_ATOMIC_OPS
+
+static inline gint32 InterlockedCompareExchange(volatile gint32 *dest,
+                                               gint32 exch, gint32 comp)
+{
+       return __sync_val_compare_and_swap (dest, comp, exch);
+}
+
+static inline gpointer InterlockedCompareExchangePointer(volatile gpointer *dest, gpointer exch, gpointer comp)
+{
+       return __sync_val_compare_and_swap (dest, comp, exch);
+}
+
+static inline gint32 InterlockedIncrement(volatile gint32 *val)
+{
+       return __sync_add_and_fetch (val, 1);
+}
+
+static inline gint32 InterlockedDecrement(volatile gint32 *val)
+{
+       return __sync_add_and_fetch (val, -1);
+}
+
+static inline gint32 InterlockedExchange(volatile gint32 *val, gint32 new_val)
+{
+       gint32 old_val;
+       do {
+               old_val = *val;
+       } while (__sync_val_compare_and_swap (val, old_val, new_val) != old_val);
+       return old_val;
+}
+
+static inline gpointer InterlockedExchangePointer(volatile gpointer *val,
+                                                 gpointer new_val)
+{
+       gpointer old_val;
+       do {
+               old_val = *val;
+       } while (__sync_val_compare_and_swap (val, old_val, new_val) != old_val);
+       return old_val;
+}
+
+static inline gint32 InterlockedExchangeAdd(volatile gint32 *val, gint32 add)
+{
+       return __sync_fetch_and_add (val, add);
+}
+#endif
+
+#endif /* _WAPI_ATOMIC_H_ */
index 916a1aac0886a4e0f17c18a82c2bc8dcba4edb95..1e5cad6498ea236a582ad51a272c4b0e39a31d30 100644 (file)
@@ -82,7 +82,7 @@
 #include <glib.h>
 #include <stdlib.h>
 
-#include <mono/io-layer/io-layer.h>
+#include <mono/utils/atomic.h>
 #include <mono/utils/mono-mmap.h>
 #include <mono/utils/mono-membar.h>
 #include <mono/utils/hazard-pointer.h>
index 6f692f976e8f169f54c51ca5057fb2aeec2044f9..be343caeb3e1b0246260f86a4680cdb47facd351 100644 (file)
@@ -16,7 +16,7 @@
  * entry data, and then sets the state to USED or FREE.
  */
 
-#include <mono/io-layer/io-layer.h>
+#include <mono/utils/atomic.h>
 #include <mono/utils/mono-membar.h>
 #include <mono/utils/mono-mmap.h>
 
index 0053304e930a6210bd7eeef284fd35ebf635dde0..9a84edfedf8809c442d1562a6ee3a9bfe46e4441 100644 (file)
@@ -53,7 +53,7 @@
 
 #include <mono/utils/mono-membar.h>
 #include <mono/utils/hazard-pointer.h>
-#include <mono/io-layer/io-layer.h>
+#include <mono/utils/atomic.h>
 
 #include <mono/utils/lock-free-queue.h>
 
index 4efcea0ae25500addaca763aaa9bb3721d495734..dcee2a99b3e28e16ecea4ebddc4de6e968b151e8 100644 (file)
@@ -91,7 +91,7 @@ struct _MonoCodeManager {
        CodeChunk *current;
        CodeChunk *full;
 #if defined(__native_client_codegen__) && defined(__native_client__)
-       MonoGHashTable *hash;
+       GHashTable *hash;
 #endif
 };
 
@@ -228,14 +228,16 @@ mono_code_manager_new (void)
        if (next_dynamic_code_addr == NULL) {
                const guint kPageMask = 0xFFFF; /* 64K pages */
                next_dynamic_code_addr = (uintptr_t)(etext + kPageMask) & ~kPageMask;
+#if defined (__GLIBC__)
+               /* TODO: For now, just jump 64MB ahead to avoid dynamic libraries. */
+               next_dynamic_code_addr += (uintptr_t)0x4000000;
+#else
                /* Workaround bug in service runtime, unable to allocate */
                /* from the first page in the dynamic code section.    */
-               /* TODO: remove */
                next_dynamic_code_addr += (uintptr_t)0x10000;
+#endif
        }
-       cman->hash =  mono_g_hash_table_new (NULL, NULL);
-       /* Keep the hash table from being collected */
-       mono_gc_register_root (&cman->hash, sizeof (void*), NULL);
+       cman->hash =  g_hash_table_new (NULL, NULL);
        if (patch_source_base == NULL) {
                patch_source_base = g_malloc (kMaxPatchDepth * sizeof(unsigned char *));
                patch_dest_base = g_malloc (kMaxPatchDepth * sizeof(unsigned char *));
@@ -546,7 +548,7 @@ mono_code_manager_reserve_align (MonoCodeManager *cman, int size, int alignment)
        /* Allocate code space from the service runtime */
        code_ptr = allocate_code (size);
        /* Insert pointer to code space in hash, keyed by buffer ptr */
-       mono_g_hash_table_insert (cman->hash, temp_ptr, code_ptr);
+       g_hash_table_insert (cman->hash, temp_ptr, code_ptr);
 
        nacl_jit_check_init ();
 
@@ -598,7 +600,7 @@ mono_code_manager_commit (MonoCodeManager *cman, void *data, int size, int newsi
        unsigned char *code;
        int status;
        g_assert (newsize <= size);
-       code = mono_g_hash_table_lookup (cman->hash, data);
+       code = g_hash_table_lookup (cman->hash, data);
        g_assert (code != NULL);
        /* Pad space after code with HLTs */
        /* TODO: this is x86/amd64 specific */
@@ -608,9 +610,15 @@ mono_code_manager_commit (MonoCodeManager *cman, void *data, int size, int newsi
        }
        status = nacl_dyncode_create (code, data, newsize);
        if (status != 0) {
+               unsigned char *codep;
+               fprintf(stderr, "Error creating Native Client dynamic code section attempted to be\n"
+                               "emitted at %p (hex dissasembly of code follows):\n", code);
+               for (codep = data; codep < data + newsize; codep++)
+                       fprintf(stderr, "%02x ", *codep);
+               fprintf(stderr, "\n");
                g_assert_not_reached ();
        }
-       mono_g_hash_table_remove (cman->hash, data);
+       g_hash_table_remove (cman->hash, data);
        g_assert (data == patch_source_base[patch_current_depth]);
        g_assert (code == patch_dest_base[patch_current_depth]);
        patch_current_depth--;
@@ -623,7 +631,7 @@ mono_code_manager_commit (MonoCodeManager *cman, void *data, int size, int newsi
 void *
 nacl_code_manager_get_code_dest (MonoCodeManager *cman, void *data)
 {
-       return mono_g_hash_table_lookup (cman->hash, data);
+       return g_hash_table_lookup (cman->hash, data);
 }
 #endif
 
index 81e2fe69b353d55e41be11e2874a025cb9006575..81f3ca84ec30ae4da29072e8b9db66d8beb0a4d4 100644 (file)
@@ -252,6 +252,8 @@ mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx)
 {
 #ifdef MONO_CROSS_COMPILE
        g_assert_not_reached ();
+#elif defined(__native_client__)
+       g_assert_not_reached ();
 #else
        arm_ucontext *my_uc = sigctx;
 
@@ -270,6 +272,8 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *ctx)
 {
 #ifdef MONO_CROSS_COMPILE
        g_assert_not_reached ();
+#elif defined(__native_client__)
+       g_assert_not_reached ();
 #else
        arm_ucontext *my_uc = ctx;
 
index 819fcf625b9f8a1262b43cd07ead5070e901db54..e4aa50345e3ef0607d2ba1edcb7e81b8d35ca46a 100644 (file)
@@ -6,8 +6,8 @@
 
 typedef struct _MonoDl MonoDl;
 
-MonoDl*     mono_dl_open       (const char *name, int flags, char **error_msg) MONO_INTERNAL;
-char*       mono_dl_symbol     (MonoDl *module, const char *name, void **symbol) MONO_INTERNAL;
+MonoDl*     mono_dl_open       (const char *name, int flags, char **error_msg) MONO_LLVM_INTERNAL;
+char*       mono_dl_symbol     (MonoDl *module, const char *name, void **symbol) MONO_LLVM_INTERNAL;
 void        mono_dl_close      (MonoDl *module) MONO_INTERNAL;
 
 char*       mono_dl_build_path (const char *directory, const char *name, void **iter) MONO_INTERNAL;
index cc9c235b70fe5270d01cc9be982a326398037d42..3536d25d8445900a99b12dd7b1c67851899b809d 100644 (file)
@@ -16,8 +16,7 @@
 
 #include <mono/utils/mono-linked-list-set.h>
 
-/*atomics.*/
-#include <mono/io-layer/io-layer.h>
+#include <mono/utils/atomic.h>
 
 static inline gpointer
 mask (gpointer n, uintptr_t bit)
index 412a23b3fff33713e20a6b18489384fc19d1a32b..087259fd15129cebee0d23876a50a24404706d2b 100644 (file)
@@ -405,6 +405,20 @@ mono_file_unmap (void *addr, void *handle)
  *
  * Returns: 0 on success.
  */
+#if defined(__native_client__)
+int
+mono_mprotect (void *addr, size_t length, int flags)
+{
+       int prot = prot_from_flags (flags);
+       void *new_addr;
+
+       if (flags & MONO_MMAP_DISCARD) memset (addr, 0, length);
+
+       new_addr = mmap(addr, length, prot, MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0);
+       if (new_addr == addr) return 0;
+        return -1;
+}
+#else
 int
 mono_mprotect (void *addr, size_t length, int flags)
 {
@@ -427,6 +441,7 @@ mono_mprotect (void *addr, size_t length, int flags)
        }
        return mprotect (addr, length, prot);
 }
+#endif // __native_client__
 
 #else
 
index 88b5d25a71904ff89e0923b1b7f967034f0b3c34..0a443aa41f76c1a977ac108b5e0a4a635651ae6e 100644 (file)
@@ -44,14 +44,9 @@ mono_path_canonicalize (const char *path)
        if (g_path_is_absolute (path)) {
                abspath = g_strdup (path);
        } else {
-#ifdef __native_client__
-               gchar *tmpdir = ".";
-               abspath = g_build_filename (tmpdir, path, NULL);
-#else
                gchar *tmpdir = g_get_current_dir ();
                abspath = g_build_filename (tmpdir, path, NULL);
                g_free (tmpdir);
-#endif
        }
 
 #ifdef HOST_WIN32
index cc8b61d9d9c5afedff24cffab6e522d5d8ed6d9e..a1db7cb41650c10aeb2d33c4b82af8aa627dc6e6 100644 (file)
@@ -169,6 +169,9 @@ mono_threads_pthread_kill (MonoThreadInfo *info, int signum)
                errno = old_errno;
        }
        return result;
+#elif defined(__native_client__)
+       /* Workaround pthread_kill abort() in NaCl glibc. */
+       return 0;
 #else
        return pthread_kill (mono_thread_info_get_tid (info), signum);
 #endif
index c71da25ba5c931129e5c7b0ca1e79cdec6c21220..5ff68938f6d94ed70392744cc0e429be1c00278c 100644 (file)
@@ -285,7 +285,11 @@ my_g_bit_nth_lsf (gsize mask, gint nth_bit)
        if ((mask == 0) || (nth_bit == BITS_PER_CHUNK))
                return -1;
 
-#if defined(__i386__) && defined(__GNUC__)
+#if defined(__native_client__) && (defined(__i386__) || defined(__x86_64))
+#define USE_X86_32BIT_INSTRUCTIONS 1
+#endif
+
+#if (defined(__i386__) && defined(__GNUC__)) || defined(USE_X86_32BIT_INSTRUCTIONS)
  {
         int r;
         /* This depends on mask != 0 */
@@ -315,7 +319,7 @@ static inline gint
 my_g_bit_nth_lsf_nomask (gsize mask)
 {
        /* Mask is expected to be != 0 */
-#if defined(__i386__) && defined(__GNUC__)
+#if (defined(__i386__) && defined(__GNUC__)) || defined(USE_X86_32BIT_INSTRUCTIONS)
        int r;
 
        __asm__("bsfl %1,%0\n\t"
@@ -817,4 +821,3 @@ main() {
 }
 
 #endif
-
index 8f55ad205eaabf92716643d26d40581b3e903019..9a73939cde68f007d576cecad81f5dfe3f15fe95 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>\r
+<?xml version="1.0" encoding="utf-8"?>\r
 <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
   <ItemGroup Label="ProjectConfigurations">\r
     <ProjectConfiguration Include="Debug_SGen|Win32">\r
@@ -96,7 +96,6 @@
     <ClCompile Include="..\mono\metadata\sgen-hash-table.c" />\r
     <ClCompile Include="..\mono\metadata\sgen-internal.c" />\r
     <ClCompile Include="..\mono\metadata\sgen-los.c" />\r
-    <ClCompile Include="..\mono\metadata\sgen-major-copying.c" />\r
     <ClCompile Include="..\mono\metadata\sgen-marksweep-fixed-par.c" />\r
     <ClCompile Include="..\mono\metadata\sgen-marksweep-fixed.c" />\r
     <ClCompile Include="..\mono\metadata\sgen-marksweep-par.c" />\r
     <ClCompile Include="..\mono\metadata\sgen-protocol.c" />\r
     <ClCompile Include="..\mono\metadata\sgen-simple-nursery.c" />\r
     <ClCompile Include="..\mono\metadata\sgen-split-nursery.c" />\r
-    <ClCompile Include="..\mono\metadata\sgen-ssb.c" />\r
     <ClCompile Include="..\mono\metadata\sgen-toggleref.c" />\r
     <ClCompile Include="..\mono\metadata\sgen-workers.c" />\r
     <ClCompile Include="..\mono\metadata\socket-io.c" />\r
     <ClInclude Include="..\mono\metadata\sgen-pinning.h" />\r
     <ClInclude Include="..\mono\metadata\sgen-protocol.h" />\r
     <ClInclude Include="..\mono\metadata\sgen-scan-object.h" />\r
-    <ClInclude Include="..\mono\metadata\sgen-ssb.h" />\r
     <ClInclude Include="..\mono\metadata\sgen-toggleref.h" />\r
     <ClInclude Include="..\mono\metadata\sgen-workers.h" />\r
     <ClInclude Include="..\mono\metadata\socket-io.h" />\r
diff --git a/nacl/README b/nacl/README
new file mode 100644 (file)
index 0000000..03a77ba
--- /dev/null
@@ -0,0 +1,2 @@
+Building NaCl Mono with glibc (newlib support is eliminated but should still be buildable with small effort) is complex.  Instructions live here for the adventurous: https://docs.google.com/a/google.com/document/d/1Jd_4M7mlmxF8daVbepAy_8RKYcRbhifXanRYyBKkVa4/pub
+
diff --git a/nacl/common.sh b/nacl/common.sh
new file mode 100644 (file)
index 0000000..65e7dc7
--- /dev/null
@@ -0,0 +1,217 @@
+# Copyright (c) 2011 The Native Client Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that be
+# found in the LICENSE file.
+#
+
+set -o nounset
+set -o errexit
+
+# scripts that source this file must be run from within packages tree
+readonly SAVE_PWD=$(pwd)
+
+# Pick platform directory for compiler.
+readonly OS_NAME=$(uname -s)
+if [ $OS_NAME = "Darwin" ]; then
+  readonly OS_SUBDIR="mac"
+  readonly OS_SUBDIR_SHORT="mac"
+elif [ $OS_NAME = "Linux" ]; then
+  readonly OS_SUBDIR="linux"
+  readonly OS_SUBDIR_SHORT="linux"
+else
+  readonly OS_SUBDIR="windows"
+  readonly OS_SUBDIR_SHORT="win"
+fi
+
+readonly MACHINE=$(uname -m)
+if [ $MACHINE = "x86_64" ]; then
+  readonly TARGET_BITSIZE=${TARGET_BITSIZE:-"64"}
+  readonly HOST_BITSIZE=${HOST_BITSIZE:-"64"}
+else
+  # uname -m reports i686 on Linux and i386 on Mac
+  readonly TARGET_BITSIZE=${TARGET_BITSIZE:-"32"}
+  readonly HOST_BITSIZE=${HOST_BITSIZE:-"32"}
+fi
+
+if [ $TARGET_BITSIZE == "64" ]; then
+  readonly TARGET_BIT_PREFIX="64"
+  readonly CROSS_ID=x86_64
+else
+  readonly TARGET_BIT_PREFIX=""
+  readonly CROSS_ID=i686
+fi
+# we might want to override the detected host platform (e.g. on OSX 10.6)
+if [ $HOST_BITSIZE == "64" ]; then
+  readonly HOST_BIT_PREFIX="64"
+else
+  readonly HOST_BIT_PREFIX=""
+fi
+
+export NACL_CROSS_PREFIX=${CROSS_ID}-nacl
+export NACL_CROSS_PREFIX_DASH=${NACL_CROSS_PREFIX}-
+
+readonly NACL_NEWLIB=${NACL_NEWLIB:-"0"}
+
+if [ $NACL_NEWLIB = "1" ]; then
+  readonly NACL_SDK_BASE=${NACL_SDK_ROOT}/toolchain/${OS_SUBDIR_SHORT}_x86_newlib
+else
+case "${NACL_SDK_ROOT}" in
+*pepper_15* | *pepper_16* | *pepper_17*)
+  readonly NACL_SDK_BASE=${NACL_SDK_ROOT}/toolchain/${OS_SUBDIR_SHORT}_x86
+  ;;
+*)
+  readonly NACL_SDK_BASE=${NACL_SDK_ROOT}/toolchain/${OS_SUBDIR_SHORT}_x86_glibc
+  ;;
+esac
+fi
+
+readonly NACL_BIN_PATH=${NACL_SDK_BASE}/bin
+export NACLCC=${NACL_BIN_PATH}/${NACL_CROSS_PREFIX_DASH}gcc
+export NACLCXX=${NACL_BIN_PATH}/${NACL_CROSS_PREFIX_DASH}g++
+export NACLAR=${NACL_BIN_PATH}/${NACL_CROSS_PREFIX_DASH}ar
+export NACLRANLIB=${NACL_BIN_PATH}/${NACL_CROSS_PREFIX_DASH}ranlib
+export NACLLD=${NACL_BIN_PATH}/${NACL_CROSS_PREFIX_DASH}ld
+export NACLAS=${NACL_BIN_PATH}/${NACL_CROSS_PREFIX_DASH}as
+
+# NACL_SDK_GCC_SPECS_PATH is where nacl-gcc 'specs' file will be installed
+readonly NACL_SDK_GCC_SPECS_PATH=${NACL_SDK_BASE}/lib/gcc/x86_64-nacl/4.4.3
+
+# NACL_SDK_USR is where the headers, libraries, etc. will be installed
+readonly NACL_SDK_USR=${NACL_SDK_BASE}/${NACL_CROSS_PREFIX}/usr
+readonly NACL_SDK_USR_INCLUDE=${NACL_SDK_USR}/include
+readonly NACL_SDK_USR_LIB=${NACL_SDK_USR}/lib
+
+
+######################################################################
+# Helper functions
+######################################################################
+
+Banner() {
+  echo "######################################################################"
+  echo $*
+  echo "######################################################################"
+}
+
+
+VerifyPath() {
+  # make sure path isn't all slashes (possibly from an unset variable)
+  local PATH=$1
+  local TRIM=${PATH##/}
+  if [ ${#TRIM} -ne 0 ]; then
+    return 0
+  else
+    return 1
+  fi
+}
+
+
+ChangeDir() {
+  local NAME=$1
+  if VerifyPath ${NAME}; then
+    cd ${NAME}
+  else
+    echo "ChangeDir called with bad path."
+    exit -1
+  fi
+}
+
+
+Remove() {
+  local NAME=$1
+  if VerifyPath ${NAME}; then
+    rm -rf ${NAME}
+  else
+    echo "Remove called with bad path."
+    exit -1
+  fi
+}
+
+
+MakeDir() {
+  local NAME=$1
+  if VerifyPath ${NAME}; then
+    mkdir -p ${NAME}
+  else
+    echo "MakeDir called with bad path."
+    exit -1
+  fi
+}
+
+
+PatchSpecFile() {
+  # fix up spaces so gcc sees entire path
+  local SED_SAFE_SPACES_USR_INCLUDE=${NACL_SDK_USR_INCLUDE/ /\ /}
+  local SED_SAFE_SPACES_USR_LIB=${NACL_SDK_USR_LIB/ /\ /}
+  # have nacl-gcc dump specs file & add include & lib search paths
+  ${NACL_SDK_BASE}/bin/x86_64-nacl-gcc -dumpspecs |\
+    sed "/*cpp:/{
+      N
+      s|$| -I${SED_SAFE_SPACES_USR_INCLUDE}|
+    }" |\
+    sed "/*link_libgcc:/{
+      N
+      s|$| -L${SED_SAFE_SPACES_USR_LIB}|
+    }" >${NACL_SDK_GCC_SPECS_PATH}/specs
+}
+
+
+DefaultConfigureStep() {
+  Banner "Configuring ${PACKAGE_NAME}"
+  # export the nacl tools
+  export CC=${NACLCC}
+  export CXX=${NACLCXX}
+  export AR=${NACLAR}
+  export RANLIB=${NACLRANLIB}
+  export PKG_CONFIG_PATH=${NACL_SDK_USR_LIB}/pkgconfig
+  export PKG_CONFIG_LIBDIR=${NACL_SDK_USR_LIB}
+  export PATH=${NACL_BIN_PATH}:${PATH};
+  ChangeDir ${NACL_PACKAGES_REPOSITORY}/${PACKAGE_NAME}
+  Remove ${PACKAGE_NAME}-build
+  MakeDir ${PACKAGE_NAME}-build
+  cd ${PACKAGE_NAME}-build
+  ../configure \
+    --host=nacl \
+    --disable-shared \
+    --prefix=${NACL_SDK_USR} \
+    --exec-prefix=${NACL_SDK_USR} \
+    --libdir=${NACL_SDK_USR_LIB} \
+    --oldincludedir=${NACL_SDK_USR_INCLUDE} \
+    --with-http=off \
+    --with-html=off \
+    --with-ftp=off \
+    --with-x=no
+}
+
+
+DefaultBuildStep() {
+  # assumes pwd has makefile
+  make clean
+if [ $TARGET_BITSIZE == "64" ]; then
+  make -j8
+else
+  make
+fi
+}
+
+
+DefaultInstallStep() {
+  # assumes pwd has makefile
+  make install
+}
+
+
+DefaultCleanUpStep() {
+  PatchSpecFile
+  ChangeDir ${SAVE_PWD}
+}
+
+
+DefaultPackageInstall() {
+  DefaultPreInstallStep
+  DefaultDownloadStep
+  DefaultExtractStep
+  DefaultPatchStep
+  DefaultConfigureStep
+  DefaultBuildStep
+  DefaultInstallStep
+  DefaultCleanUpStep
+}
diff --git a/nacl/config-nacl-runtime.cache b/nacl/config-nacl-runtime.cache
new file mode 100644 (file)
index 0000000..4bd26c4
--- /dev/null
@@ -0,0 +1,19 @@
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+ac_cv_func_mmap=${ac_cv_func_mmap=no}
+ac_cv_var_timezone=${ac_cv_var_timezone=yes}
+ac_cv_host=${ac_cv_host=i686-pc-nacl}
+ac_cv_target=${ac_cv_target=i686-pc-nacl}
+ac_cv_func_backtrace_symbols=${ac_cv_func_backtrace_symbols=no}
+mono_cv_uscore=${mono_cv_uscore=no}
diff --git a/nacl/config-nacl-runtime64.cache b/nacl/config-nacl-runtime64.cache
new file mode 100644 (file)
index 0000000..b952fef
--- /dev/null
@@ -0,0 +1,19 @@
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+ac_cv_func_mmap=${ac_cv_func_mmap=no}
+ac_cv_var_timezone=${ac_cv_var_timezone=yes}
+ac_cv_host=${ac_cv_host=x86_64-pc-nacl}
+ac_cv_target=${ac_cv_target=x86_64-pc-nacl}
+ac_cv_func_backtrace_symbols=${ac_cv_func_backtrace_symbols=no}
+mono_cv_uscore=${mono_cv_uscore=no}
diff --git a/nacl/nacl-runtime-mono.sh b/nacl/nacl-runtime-mono.sh
new file mode 100755 (executable)
index 0000000..d93bb97
--- /dev/null
@@ -0,0 +1,82 @@
+#!/bin/bash
+# Copyright (c) 2009 The Native Client Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that be
+# found in the LICENSE file.
+#
+
+# nacl-runtime-mono.sh
+#
+# usage:  nacl-runtime-mono.sh
+#
+# this script builds mono runtime for Native Client 
+#
+
+readonly MONO_TRUNK_NACL=$(pwd)
+
+source common.sh
+
+readonly PACKAGE_NAME=runtime${TARGET_BIT_PREFIX}-build
+readonly INSTALL_PATH=${MONO_TRUNK_NACL}/naclmono-${CROSS_ID}
+
+
+CustomConfigureStep() {
+  Banner "Configuring ${PACKAGE_NAME}"
+  # export the nacl tools
+  set +e
+  if [ -f ${PACKAGE_NAME}/Makefile ]
+  then
+    cd ${PACKAGE_NAME}
+  fi
+  make distclean
+  cd ${MONO_TRUNK_NACL}
+  set -e
+  if [ $TARGET_BITSIZE == "32" ]; then
+    CONFIG_OPTS="--host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --target=i686-pc-linux-gnu"
+  else
+    CONFIG_OPTS="--host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --target=x86_64-pc-linux-gnu"
+  fi
+  # UGLY hack to allow dynamic linking
+  sed -i -e s/elf_i386/elf_nacl/ -e s/elf_x86_64/elf64_nacl/ ../configure
+  sed -i -e s/elf_i386/elf_nacl/ -e s/elf_x86_64/elf64_nacl/ ../libgc/configure
+  sed -i -e s/elf_i386/elf_nacl/ -e s/elf_x86_64/elf64_nacl/ ../eglib/configure
+  Remove ${PACKAGE_NAME}
+  MakeDir ${PACKAGE_NAME}
+  cd ${PACKAGE_NAME}
+  CC=${NACLCC} CXX=${NACLCXX} AR=${NACLAR} RANLIB=${NACLRANLIB} PKG_CONFIG_PATH=${NACL_SDK_USR_LIB}/pkgconfig LD="${NACLLD}" \
+  PKG_CONFIG_LIBDIR=${NACL_SDK_USR_LIB} PATH=${NACL_BIN_PATH}:${PATH} LIBS="-lnacl_dyncode -lc -lg -lnosys -lnacl" \
+  CFLAGS="-g -O2 -D_POSIX_PATH_MAX=256 -DPATH_MAX=256" ../../configure \
+    ${CONFIG_OPTS} \
+    --exec-prefix=${INSTALL_PATH} \
+    --libdir=${INSTALL_PATH}/lib \
+    --prefix=${INSTALL_PATH} \
+    --program-prefix="" \
+    --oldincludedir=${INSTALL_PATH}/include \
+    --with-glib=embedded \
+    --with-tls=pthread \
+    --enable-threads=posix \
+    --without-sigaltstack \
+    --without-mmap \
+    --with-gc=included \
+    --enable-nacl-gc \
+    --with-sgen=no \
+    --enable-nls=no \
+    --enable-nacl-codegen \
+    --disable-system-aot \
+    --enable-shared \
+    --disable-parallel-mark \
+    --with-static-mono=no
+
+}
+
+CustomInstallStep() {
+  make install
+}
+
+CustomPackageInstall() {
+  CustomConfigureStep
+  DefaultBuildStep
+  CustomInstallStep
+}
+
+CustomPackageInstall
+exit 0
diff --git a/nacl/nacl_interp_loader_sdk.sh b/nacl/nacl_interp_loader_sdk.sh
new file mode 100755 (executable)
index 0000000..1e4bd31
--- /dev/null
@@ -0,0 +1,56 @@
+#!/bin/bash
+# Copyright (c) 2012 The Native Client Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# Usage: nacl_interp_loader.sh PLATFORM NEXE ARGS...
+
+# Assumes this file is sitting in the source tree.
+# This should be changed for some proper SDK installation setup.
+NACL_SDK_ROOT=${NACL_SDK_ROOT:-/path/to/naclsdk/pepper_XX}
+
+case "$1" in
+i?86)
+  arch=x86_32
+  libdir=lib32
+  ;;
+x86_64)
+  arch=x86_64
+  libdir=lib64
+  ;;
+arm|v7l)
+  arch=arm
+  libdir=lib32
+  ;;
+*)
+  echo >&2 "$0: Do not recognize architecture \"$1\""
+  exit 127
+  ;;
+esac
+
+shift
+
+case "${NACL_SDK_ROOT}" in
+*pepper_15* | *pepper_16* | *pepper_17*)
+  SEL_LDR="$NACL_SDK_ROOT/toolchain/linux_x86/bin/sel_ldr_${arch}"
+  IRT="$NACL_SDK_ROOT/toolchain/linux_x86/runtime/irt_core_${arch}.nexe"
+  RTLD="$NACL_SDK_ROOT/toolchain/linux_x86/x86_64-nacl/${libdir}/runnable-ld.so"
+  LIBDIR="$NACL_SDK_ROOT/toolchain/linux_x86/x86_64-nacl/${libdir}"
+  ;;
+*)
+  SEL_LDR="$NACL_SDK_ROOT/tools/sel_ldr_${arch}"
+  IRT="$NACL_SDK_ROOT/tools/irt_core_${arch}.nexe"
+  RTLD="$NACL_SDK_ROOT/toolchain/linux_x86_glibc/x86_64-nacl/${libdir}/runnable-ld.so"
+  LIBDIR="$NACL_SDK_ROOT/toolchain/linux_x86_glibc/x86_64-nacl/${libdir}"
+  ;;
+esac
+
+IGNORE_VALIDATOR_ARG=""
+if [ x"$NACL_IGNORE_VALIDATOR" == x"1" ]; then
+  IGNORE_VALIDATOR_ARG="-c"
+fi
+
+exec "$SEL_LDR" -E "NACL_PWD=`pwd`" -E "MONO_PATH=$MONO_PATH" \
+  -E "MONO_CFG_DIR=$MONO_CFG_DIR" -E "MONO_SHARED_DIR=$MONO_SHARED_DIR" \
+  -a $IGNORE_VALIDATOR_ARG -S -B "$IRT" -l /dev/null -- "$RTLD" \
+  --library-path $LIBDIR "$@"
index f8d500502a3ac246de0cb38b27d37721f2425dc8..93b44b4bdc35670eea40ffebd7619e5dc8b57e17 100644 (file)
@@ -169,8 +169,12 @@ mcs-compileall: mono-wrapper etc/mono/config
            fi; done; done; \
        $$ok
 
+if NACL_CODEGEN
+check-local:
+else
 check-local: mcs-compileall mcs-do-test-profiles
        $(MAKE) $(test_select) mcs-do-run-test-profiles
+endif
 
 # Compile all mcs tests
 test: mcs-do-test-profiles
index eb6cd895921f9eaa9eec3b678180f6483d211563..18c8cb5e47b959b19d0c26b29a9f2bc42ae35cce 100644 (file)
@@ -4,4 +4,13 @@ MONO_CFG_DIR='@mono_cfg_dir@'
 PATH="$r/runtime/_tmpinst/bin:$PATH"
 MONO_SHARED_DIR=$r/runtime
 export MONO_CFG_DIR MONO_SHARED_DIR PATH
+if [ -n "@nacl_self_host@" ]; then
+  case "$@" in
+    # gacutil.exe and mdoc.exe require filesystem functionality not
+    # exposed in NaCl.
+    # mcs.exe was added to the list recently because mcs under NaCl
+    # no longer produces equivalent output. TODO: investigate
+    */mcs.exe* | */gacutil.exe* | */mdoc.exe* ) exec /usr/local/bin/mono "$@";;
+  esac
+fi
 exec "$r/libtool" --mode=execute "$r/@mono_runtime@" --config "@mono_cfg_dir@/mono/config" "$@"
index 26c3c193202509cca341368b899e5fba54fa58ec..e0273c1d06034870d066e58def44dc4f660f27c2 100644 (file)
@@ -187,19 +187,21 @@ REWRITE_COMMON = sed \
 
 REWRITE = $(REWRITE_COMMON) -e 's,@''mono_interp@,$(mono_interp),g'
 REWRITE_DEBUG = $(REWRITE_COMMON) -e 's,@''mono_interp@,$(mono_interp) --debug,g'
+REWRITE2_DEBUG = $(REWRITE_DEBUG) -e 's,@''framework_version@,2.0,g'
 
 REWRITE2 = $(REWRITE) -e 's,@''framework_version@,2.0,g'
 REWRITE2_1 = $(REWRITE) -e 's,@''framework_version@,2.1,g'
-if INSTALL_4_0
+if INSTALL_4_5
 REWRITE4 = $(REWRITE) -e 's,@''framework_version@,4.5,g'
-else
-REWRITE4 = $(REWRITE) -e 's,@''framework_version@,2.0,g'
-endif
-REWRITE2_DEBUG = $(REWRITE_DEBUG) -e 's,@''framework_version@,2.0,g'
-if INSTALL_4_0
 REWRITE4_DEBUG = $(REWRITE_DEBUG) -e 's,@''framework_version@,4.5,g'
-else
-REWRITE4_DEBUG = $(REWRITE_DEBUG) -e 's,@''framework_version@,2.0,g'
+else 
+       if INSTALL_4_0
+       REWRITE4 = $(REWRITE) -e 's,@''framework_version@,4.0,g'
+       REWRITE4_DEBUG = $(REWRITE_DEBUG) -e 's,@''framework_version@,4.0,g'
+       else
+       REWRITE4 = $(REWRITE) -e 's,@''framework_version@,2.0,g'
+       REWRITE4_DEBUG = $(REWRITE_DEBUG) -e 's,@''framework_version@,2.0,g'
+       endif
 endif
 
 peverify: peverify.in Makefile
index 1de8fc77cb7cc9d7c81e813785563d353d63f022..c339ebced737526b4eed078345d66c4f46d9ae61 100644 (file)
@@ -43,6 +43,7 @@ MPH_UNIX_SOURCE =                             \
        sys-stat.c                              \
        sys-statvfs.c                           \
        sys-time.c                              \
+       sys-uio.c                               \
        sys-utsname.c   \
        sys-wait.c                              \
        sys-xattr.c                             \
@@ -141,6 +142,7 @@ refresh:
        --autoconf-header="<sys/statvfs.h>"                   \
        --autoconf-header="<sys/xattr.h>"                     \
        --autoconf-header="<sys/mman.h>"                      \
+       --autoconf-header="<sys/uio.h>"                       \
        --autoconf-header="<unistd.h>"                        \
        --impl-header="<fcntl.h>"                             \
        --impl-header="<signal.h>"                            \
index 939d915d949553729d64b6e89577b9152cc3aa54..bc1b3e238e16730ad5113258b05eb174ec214b6f 100644 (file)
@@ -78,6 +78,7 @@ Mono_Posix_Syscall_readdir (void *dirp, struct Mono_Posix_Syscall__Dirent *entry
                return -1;
        }
 
+       errno = 0;
        d = readdir (dirp);
 
        if (d == NULL) {
index 013d9cd416793007bae98ab55c4011339ffa7af7..12947991c00fa9387a9d1b2896e2c008e5313256 100644 (file)
@@ -100,6 +100,16 @@ Mono_Posix_Syscall_open_mode (const char *pathname, gint32 flags, guint32 mode)
        return open (pathname, flags, mode);
 }
 
+gint32
+Mono_Posix_Syscall_get_at_fdcwd ()
+{
+#ifdef AT_FDCWD
+       return AT_FDCWD;
+#else
+       return -1;
+#endif
+}
+
 gint32
 Mono_Posix_Syscall_creat (const char *pathname, guint32 mode)
 {
index cb653bcda9a81e0c8f09b4e26c3da802b1c4ab96..42fdf7cfaadfbfe04b825b13b538ac9427f8b02e 100644 (file)
@@ -45,6 +45,9 @@
 #ifdef HAVE_SYS_MMAN_H
 #include <sys/mman.h>
 #endif /* ndef HAVE_SYS_MMAN_H */
+#ifdef HAVE_SYS_UIO_H
+#include <sys/uio.h>
+#endif /* ndef HAVE_SYS_UIO_H */
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif /* ndef HAVE_UNISTD_H */
@@ -292,6 +295,72 @@ int Mono_Posix_ToAccessModes (int x, int *r)
        return 0;
 }
 
+int Mono_Posix_FromAtFlags (int x, int *r)
+{
+       *r = 0;
+       if ((x & Mono_Posix_AtFlags_AT_EMPTY_PATH) == Mono_Posix_AtFlags_AT_EMPTY_PATH)
+#ifdef AT_EMPTY_PATH
+               *r |= AT_EMPTY_PATH;
+#else /* def AT_EMPTY_PATH */
+               {errno = EINVAL; return -1;}
+#endif /* ndef AT_EMPTY_PATH */
+       if ((x & Mono_Posix_AtFlags_AT_NO_AUTOMOUNT) == Mono_Posix_AtFlags_AT_NO_AUTOMOUNT)
+#ifdef AT_NO_AUTOMOUNT
+               *r |= AT_NO_AUTOMOUNT;
+#else /* def AT_NO_AUTOMOUNT */
+               {errno = EINVAL; return -1;}
+#endif /* ndef AT_NO_AUTOMOUNT */
+       if ((x & Mono_Posix_AtFlags_AT_REMOVEDIR) == Mono_Posix_AtFlags_AT_REMOVEDIR)
+#ifdef AT_REMOVEDIR
+               *r |= AT_REMOVEDIR;
+#else /* def AT_REMOVEDIR */
+               {errno = EINVAL; return -1;}
+#endif /* ndef AT_REMOVEDIR */
+       if ((x & Mono_Posix_AtFlags_AT_SYMLINK_FOLLOW) == Mono_Posix_AtFlags_AT_SYMLINK_FOLLOW)
+#ifdef AT_SYMLINK_FOLLOW
+               *r |= AT_SYMLINK_FOLLOW;
+#else /* def AT_SYMLINK_FOLLOW */
+               {errno = EINVAL; return -1;}
+#endif /* ndef AT_SYMLINK_FOLLOW */
+       if ((x & Mono_Posix_AtFlags_AT_SYMLINK_NOFOLLOW) == Mono_Posix_AtFlags_AT_SYMLINK_NOFOLLOW)
+#ifdef AT_SYMLINK_NOFOLLOW
+               *r |= AT_SYMLINK_NOFOLLOW;
+#else /* def AT_SYMLINK_NOFOLLOW */
+               {errno = EINVAL; return -1;}
+#endif /* ndef AT_SYMLINK_NOFOLLOW */
+       if (x == 0)
+               return 0;
+       return 0;
+}
+
+int Mono_Posix_ToAtFlags (int x, int *r)
+{
+       *r = 0;
+       if (x == 0)
+               return 0;
+#ifdef AT_EMPTY_PATH
+       if ((x & AT_EMPTY_PATH) == AT_EMPTY_PATH)
+               *r |= Mono_Posix_AtFlags_AT_EMPTY_PATH;
+#endif /* ndef AT_EMPTY_PATH */
+#ifdef AT_NO_AUTOMOUNT
+       if ((x & AT_NO_AUTOMOUNT) == AT_NO_AUTOMOUNT)
+               *r |= Mono_Posix_AtFlags_AT_NO_AUTOMOUNT;
+#endif /* ndef AT_NO_AUTOMOUNT */
+#ifdef AT_REMOVEDIR
+       if ((x & AT_REMOVEDIR) == AT_REMOVEDIR)
+               *r |= Mono_Posix_AtFlags_AT_REMOVEDIR;
+#endif /* ndef AT_REMOVEDIR */
+#ifdef AT_SYMLINK_FOLLOW
+       if ((x & AT_SYMLINK_FOLLOW) == AT_SYMLINK_FOLLOW)
+               *r |= Mono_Posix_AtFlags_AT_SYMLINK_FOLLOW;
+#endif /* ndef AT_SYMLINK_FOLLOW */
+#ifdef AT_SYMLINK_NOFOLLOW
+       if ((x & AT_SYMLINK_NOFOLLOW) == AT_SYMLINK_NOFOLLOW)
+               *r |= Mono_Posix_AtFlags_AT_SYMLINK_NOFOLLOW;
+#endif /* ndef AT_SYMLINK_NOFOLLOW */
+       return 0;
+}
+
 int Mono_Posix_FromConfstrName (int x, int *r)
 {
        *r = 0;
@@ -2764,6 +2833,38 @@ Mono_Posix_ToFlock (struct flock *from, struct Mono_Posix_Flock *to)
 #endif /* ndef HAVE_STRUCT_FLOCK */
 
 
+#ifdef HAVE_STRUCT_IOVEC
+int
+Mono_Posix_FromIovec (struct Mono_Posix_Iovec *from, struct iovec *to)
+{
+       _cnm_return_val_if_overflow (guint64, from->iov_len, -1);
+
+       memset (to, 0, sizeof(*to));
+
+       to->iov_base = from->iov_base;
+       to->iov_len  = from->iov_len;
+
+       return 0;
+}
+#endif /* ndef HAVE_STRUCT_IOVEC */
+
+
+#ifdef HAVE_STRUCT_IOVEC
+int
+Mono_Posix_ToIovec (struct iovec *from, struct Mono_Posix_Iovec *to)
+{
+       _cnm_return_val_if_overflow (guint64, from->iov_len, -1);
+
+       memset (to, 0, sizeof(*to));
+
+       to->iov_base = from->iov_base;
+       to->iov_len  = from->iov_len;
+
+       return 0;
+}
+#endif /* ndef HAVE_STRUCT_IOVEC */
+
+
 int Mono_Posix_FromLockType (short x, short *r)
 {
        *r = 0;
@@ -3367,6 +3468,12 @@ int Mono_Posix_FromOpenFlags (int x, int *r)
 #else /* def O_ASYNC */
                {errno = EINVAL; return -1;}
 #endif /* ndef O_ASYNC */
+       if ((x & Mono_Posix_OpenFlags_O_CLOEXEC) == Mono_Posix_OpenFlags_O_CLOEXEC)
+#ifdef O_CLOEXEC
+               *r |= O_CLOEXEC;
+#else /* def O_CLOEXEC */
+               {errno = EINVAL; return -1;}
+#endif /* ndef O_CLOEXEC */
        if ((x & Mono_Posix_OpenFlags_O_CREAT) == Mono_Posix_OpenFlags_O_CREAT)
 #ifdef O_CREAT
                *r |= O_CREAT;
@@ -3415,6 +3522,12 @@ int Mono_Posix_FromOpenFlags (int x, int *r)
 #else /* def O_NONBLOCK */
                {errno = EINVAL; return -1;}
 #endif /* ndef O_NONBLOCK */
+       if ((x & Mono_Posix_OpenFlags_O_PATH) == Mono_Posix_OpenFlags_O_PATH)
+#ifdef O_PATH
+               *r |= O_PATH;
+#else /* def O_PATH */
+               {errno = EINVAL; return -1;}
+#endif /* ndef O_PATH */
        if ((x & Mono_Posix_OpenFlags_O_RDONLY) == Mono_Posix_OpenFlags_O_RDONLY)
 #ifdef O_RDONLY
                *r |= O_RDONLY;
@@ -3463,6 +3576,10 @@ int Mono_Posix_ToOpenFlags (int x, int *r)
        if ((x & O_ASYNC) == O_ASYNC)
                *r |= Mono_Posix_OpenFlags_O_ASYNC;
 #endif /* ndef O_ASYNC */
+#ifdef O_CLOEXEC
+       if ((x & O_CLOEXEC) == O_CLOEXEC)
+               *r |= Mono_Posix_OpenFlags_O_CLOEXEC;
+#endif /* ndef O_CLOEXEC */
 #ifdef O_CREAT
        if ((x & O_CREAT) == O_CREAT)
                *r |= Mono_Posix_OpenFlags_O_CREAT;
@@ -3495,6 +3612,10 @@ int Mono_Posix_ToOpenFlags (int x, int *r)
        if ((x & O_NONBLOCK) == O_NONBLOCK)
                *r |= Mono_Posix_OpenFlags_O_NONBLOCK;
 #endif /* ndef O_NONBLOCK */
+#ifdef O_PATH
+       if ((x & O_PATH) == O_PATH)
+               *r |= Mono_Posix_OpenFlags_O_PATH;
+#endif /* ndef O_PATH */
 #ifdef O_RDONLY
        if ((x & O_RDONLY) == O_RDONLY)
                *r |= Mono_Posix_OpenFlags_O_RDONLY;
@@ -4486,86 +4607,6 @@ int Mono_Posix_ToSignum (int x, int *r)
        errno = EINVAL; return -1;
 }
 
-#ifdef HAVE_STRUCT_STAT
-int
-Mono_Posix_FromStat (struct Mono_Posix_Stat *from, struct stat *to)
-{
-       _cnm_return_val_if_overflow (dev_t, from->st_dev, -1);
-       _cnm_return_val_if_overflow (ino_t, from->st_ino, -1);
-       _cnm_return_val_if_overflow (nlink_t, from->st_nlink, -1);
-       _cnm_return_val_if_overflow (uid_t, from->st_uid, -1);
-       _cnm_return_val_if_overflow (gid_t, from->st_gid, -1);
-       _cnm_return_val_if_overflow (dev_t, from->st_rdev, -1);
-       _cnm_return_val_if_overflow (off_t, from->st_size, -1);
-       _cnm_return_val_if_overflow (blksize_t, from->st_blksize, -1);
-       _cnm_return_val_if_overflow (blkcnt_t, from->st_blocks, -1);
-       _cnm_return_val_if_overflow (time_t, from->st_atime_, -1);
-       _cnm_return_val_if_overflow (time_t, from->st_mtime_, -1);
-       _cnm_return_val_if_overflow (time_t, from->st_ctime_, -1);
-
-       memset (to, 0, sizeof(*to));
-
-       to->st_dev     = from->st_dev;
-       to->st_ino     = from->st_ino;
-       if (Mono_Posix_FromFilePermissions (from->st_mode, &to->st_mode) != 0) {
-               return -1;
-       }
-       to->st_nlink   = from->st_nlink;
-       to->st_uid     = from->st_uid;
-       to->st_gid     = from->st_gid;
-       to->st_rdev    = from->st_rdev;
-       to->st_size    = from->st_size;
-       to->st_blksize = from->st_blksize;
-       to->st_blocks  = from->st_blocks;
-       to->st_atime   = from->st_atime_;
-       to->st_mtime   = from->st_mtime_;
-       to->st_ctime   = from->st_ctime_;
-
-       return 0;
-}
-#endif /* ndef HAVE_STRUCT_STAT */
-
-
-#ifdef HAVE_STRUCT_STAT
-int
-Mono_Posix_ToStat (struct stat *from, struct Mono_Posix_Stat *to)
-{
-       _cnm_return_val_if_overflow (guint64, from->st_dev, -1);
-       _cnm_return_val_if_overflow (guint64, from->st_ino, -1);
-       _cnm_return_val_if_overflow (guint64, from->st_nlink, -1);
-       _cnm_return_val_if_overflow (unsigned int, from->st_uid, -1);
-       _cnm_return_val_if_overflow (unsigned int, from->st_gid, -1);
-       _cnm_return_val_if_overflow (guint64, from->st_rdev, -1);
-       _cnm_return_val_if_overflow (gint64, from->st_size, -1);
-       _cnm_return_val_if_overflow (gint64, from->st_blksize, -1);
-       _cnm_return_val_if_overflow (gint64, from->st_blocks, -1);
-       _cnm_return_val_if_overflow (gint64, from->st_atime, -1);
-       _cnm_return_val_if_overflow (gint64, from->st_mtime, -1);
-       _cnm_return_val_if_overflow (gint64, from->st_ctime, -1);
-
-       memset (to, 0, sizeof(*to));
-
-       to->st_dev     = from->st_dev;
-       to->st_ino     = from->st_ino;
-       if (Mono_Posix_ToFilePermissions (from->st_mode, &to->st_mode) != 0) {
-               return -1;
-       }
-       to->st_nlink   = from->st_nlink;
-       to->st_uid     = from->st_uid;
-       to->st_gid     = from->st_gid;
-       to->st_rdev    = from->st_rdev;
-       to->st_size    = from->st_size;
-       to->st_blksize = from->st_blksize;
-       to->st_blocks  = from->st_blocks;
-       to->st_atime_  = from->st_atime;
-       to->st_mtime_  = from->st_mtime;
-       to->st_ctime_  = from->st_ctime;
-
-       return 0;
-}
-#endif /* ndef HAVE_STRUCT_STAT */
-
-
 int Mono_Posix_FromSysconfName (int x, int *r)
 {
        *r = 0;
index aab06b7b9cd87633ac75ad4b535a413d09a946db..a78caf0ef9e478cc30e1f40e3a8afa6b90f73aa2 100644 (file)
@@ -35,6 +35,21 @@ enum Mono_Posix_AccessModes {
 int Mono_Posix_FromAccessModes (int x, int *r);
 int Mono_Posix_ToAccessModes (int x, int *r);
 
+enum Mono_Posix_AtFlags {
+       Mono_Posix_AtFlags_AT_EMPTY_PATH             = 0x00001000,
+       #define Mono_Posix_AtFlags_AT_EMPTY_PATH       Mono_Posix_AtFlags_AT_EMPTY_PATH
+       Mono_Posix_AtFlags_AT_NO_AUTOMOUNT           = 0x00000800,
+       #define Mono_Posix_AtFlags_AT_NO_AUTOMOUNT     Mono_Posix_AtFlags_AT_NO_AUTOMOUNT
+       Mono_Posix_AtFlags_AT_REMOVEDIR              = 0x00000200,
+       #define Mono_Posix_AtFlags_AT_REMOVEDIR        Mono_Posix_AtFlags_AT_REMOVEDIR
+       Mono_Posix_AtFlags_AT_SYMLINK_FOLLOW         = 0x00000400,
+       #define Mono_Posix_AtFlags_AT_SYMLINK_FOLLOW   Mono_Posix_AtFlags_AT_SYMLINK_FOLLOW
+       Mono_Posix_AtFlags_AT_SYMLINK_NOFOLLOW       = 0x00000100,
+       #define Mono_Posix_AtFlags_AT_SYMLINK_NOFOLLOW Mono_Posix_AtFlags_AT_SYMLINK_NOFOLLOW
+};
+int Mono_Posix_FromAtFlags (int x, int *r);
+int Mono_Posix_ToAtFlags (int x, int *r);
+
 enum Mono_Posix_ConfstrName {
        Mono_Posix_ConfstrName__CS_GNU_LIBC_VERSION                      = 0x00000002,
        #define Mono_Posix_ConfstrName__CS_GNU_LIBC_VERSION                Mono_Posix_ConfstrName__CS_GNU_LIBC_VERSION
@@ -669,6 +684,8 @@ enum Mono_Posix_OpenFlags {
        #define Mono_Posix_OpenFlags_O_APPEND    Mono_Posix_OpenFlags_O_APPEND
        Mono_Posix_OpenFlags_O_ASYNC           = 0x00002000,
        #define Mono_Posix_OpenFlags_O_ASYNC     Mono_Posix_OpenFlags_O_ASYNC
+       Mono_Posix_OpenFlags_O_CLOEXEC         = 0x00080000,
+       #define Mono_Posix_OpenFlags_O_CLOEXEC   Mono_Posix_OpenFlags_O_CLOEXEC
        Mono_Posix_OpenFlags_O_CREAT           = 0x00000040,
        #define Mono_Posix_OpenFlags_O_CREAT     Mono_Posix_OpenFlags_O_CREAT
        Mono_Posix_OpenFlags_O_DIRECT          = 0x00004000,
@@ -685,6 +702,8 @@ enum Mono_Posix_OpenFlags {
        #define Mono_Posix_OpenFlags_O_NOFOLLOW  Mono_Posix_OpenFlags_O_NOFOLLOW
        Mono_Posix_OpenFlags_O_NONBLOCK        = 0x00000800,
        #define Mono_Posix_OpenFlags_O_NONBLOCK  Mono_Posix_OpenFlags_O_NONBLOCK
+       Mono_Posix_OpenFlags_O_PATH            = 0x00200000,
+       #define Mono_Posix_OpenFlags_O_PATH      Mono_Posix_OpenFlags_O_PATH
        Mono_Posix_OpenFlags_O_RDONLY          = 0x00000000,
        #define Mono_Posix_OpenFlags_O_RDONLY    Mono_Posix_OpenFlags_O_RDONLY
        Mono_Posix_OpenFlags_O_RDWR            = 0x00000002,
@@ -1411,6 +1430,7 @@ int Mono_Posix_ToXattrFlags (int x, int *r);
  */
 
 struct Mono_Posix_Flock;
+struct Mono_Posix_Iovec;
 struct Mono_Posix_Pollfd;
 struct Mono_Posix_Stat;
 struct Mono_Posix_Statvfs;
@@ -1430,8 +1450,8 @@ struct Mono_Unix_UnixSignal_SignalInfo;
  */
 
 struct flock;
+struct iovec;
 struct pollfd;
-struct stat;
 struct timespec;
 struct timeval;
 struct timezone;
@@ -1461,6 +1481,17 @@ int
 Mono_Posix_ToFlock (struct flock *from, struct Mono_Posix_Flock* to);
 
 
+struct Mono_Posix_Iovec {
+       void*   iov_base;
+       guint64 iov_len;
+};
+
+int
+Mono_Posix_FromIovec (struct Mono_Posix_Iovec* from, struct iovec *to);
+int
+Mono_Posix_ToIovec (struct iovec *from, struct Mono_Posix_Iovec* to);
+
+
 struct Mono_Posix_Pollfd {
        int   fd;
        short events;
@@ -1474,28 +1505,25 @@ Mono_Posix_ToPollfd (struct pollfd *from, struct Mono_Posix_Pollfd* to);
 
 
 struct Mono_Posix_Stat {
-       guint64      st_dev;      /* dev_t     */
-       guint64      st_ino;      /* ino_t     */
+       guint64      st_dev;         /* dev_t     */
+       guint64      st_ino;         /* ino_t     */
        unsigned int st_mode;
        unsigned int _padding_;
-       guint64      st_nlink;    /* nlink_t   */
-       unsigned int st_uid;      /* uid_t     */
-       unsigned int st_gid;      /* gid_t     */
-       guint64      st_rdev;     /* dev_t     */
-       gint64       st_size;     /* off_t     */
-       gint64       st_blksize;  /* blksize_t */
-       gint64       st_blocks;   /* blkcnt_t  */
-       gint64       st_atime_;   /* time_t    */
-       gint64       st_mtime_;   /* time_t    */
-       gint64       st_ctime_;   /* time_t    */
+       guint64      st_nlink;       /* nlink_t   */
+       unsigned int st_uid;         /* uid_t     */
+       unsigned int st_gid;         /* gid_t     */
+       guint64      st_rdev;        /* dev_t     */
+       gint64       st_size;        /* off_t     */
+       gint64       st_blksize;     /* blksize_t */
+       gint64       st_blocks;      /* blkcnt_t  */
+       gint64       st_atime_;      /* time_t    */
+       gint64       st_mtime_;      /* time_t    */
+       gint64       st_ctime_;      /* time_t    */
+       gint64       st_atime_nsec;
+       gint64       st_mtime_nsec;
+       gint64       st_ctime_nsec;
 };
 
-int
-Mono_Posix_FromStat (struct Mono_Posix_Stat* from, struct stat *to);
-int
-Mono_Posix_ToStat (struct stat *from, struct Mono_Posix_Stat* to);
-
-
 struct Mono_Posix_Statvfs {
        guint64 f_bsize;
        guint64 f_frsize;
@@ -1626,6 +1654,7 @@ int map_Mono_Posix_FileMode (int mode);
 int map_Mono_Posix_OpenFlags (int flags);
 int map_Mono_Posix_WaitOptions (int wait_options);
 int Mono_Posix_FromRealTimeSignum (int offset, int* rval);
+int Mono_Posix_FromStat (struct Mono_Posix_Stat* source, void* destination);
 int Mono_Posix_FromStatvfs (struct Mono_Posix_Statvfs* source, void* destination);
 int Mono_Posix_SIGRTMAX (void);
 int Mono_Posix_SIGRTMIN (void);
@@ -1685,9 +1714,14 @@ gint64 Mono_Posix_Syscall_fpathconf (int filedes, int name, int defaultError);
 int Mono_Posix_Syscall_fremovexattr (int fd, const char* name);
 int Mono_Posix_Syscall_fsetxattr (int fd, const char* name, unsigned char* value, guint64 size, int flags);
 int Mono_Posix_Syscall_fstat (int filedes, struct Mono_Posix_Stat* buf);
+int Mono_Posix_Syscall_fstatat (int dirfd, const char* file_name, struct Mono_Posix_Stat* buf, int flags);
 int Mono_Posix_Syscall_fstatvfs (int fd, struct Mono_Posix_Statvfs* buf);
 int Mono_Posix_Syscall_ftruncate (int fd, gint64 length);
+int Mono_Posix_Syscall_futimens (int fd, struct Mono_Posix_Timespec* times);
 int Mono_Posix_Syscall_futimes (int fd, struct Mono_Posix_Timeval* tvp);
+int Mono_Posix_Syscall_get_at_fdcwd (void);
+gint64 Mono_Posix_Syscall_get_utime_now (void);
+gint64 Mono_Posix_Syscall_get_utime_omit (void);
 void* Mono_Posix_Syscall_getcwd (char* buf, guint64 size);
 int Mono_Posix_Syscall_getdomainname (char* name, guint64 len);
 int Mono_Posix_Syscall_getfsent (struct Mono_Posix_Syscall__Fstab* fs);
@@ -1721,6 +1755,7 @@ int Mono_Posix_Syscall_lstat (const char* file_name, struct Mono_Posix_Stat* buf
 int Mono_Posix_Syscall_lutimes (const char* filename, struct Mono_Posix_Timeval* tvp);
 int Mono_Posix_Syscall_mincore (void* start, guint64 length, unsigned char* vec);
 int Mono_Posix_Syscall_mknod (const char* pathname, unsigned int mode, guint64 dev);
+int Mono_Posix_Syscall_mknodat (int dirfd, const char* pathname, unsigned int mode, guint64 dev);
 int Mono_Posix_Syscall_mlock (void* start, guint64 len);
 void* Mono_Posix_Syscall_mmap (void* start, guint64 length, int prot, int flags, int fd, gint64 offset);
 int Mono_Posix_Syscall_mprotect (void* start, guint64 len, int prot);
@@ -1738,12 +1773,16 @@ int Mono_Posix_Syscall_posix_fadvise (int fd, gint64 offset, gint64 len, int adv
 int Mono_Posix_Syscall_posix_fallocate (int fd, gint64 offset, guint64 len);
 int Mono_Posix_Syscall_posix_madvise (void* addr, guint64 len, int advice);
 gint64 Mono_Posix_Syscall_pread (int fd, void* buf, guint64 count, gint64 offset);
+gint64 Mono_Posix_Syscall_preadv (int fd, struct Mono_Posix_Iovec* iov, int iovcnt, gint64 offset);
 int Mono_Posix_Syscall_psignal (int sig, const char* s);
 gint64 Mono_Posix_Syscall_pwrite (int fd, void* buf, guint64 count, gint64 offset);
+gint64 Mono_Posix_Syscall_pwritev (int fd, struct Mono_Posix_Iovec* iov, int iovcnt, gint64 offset);
 gint64 Mono_Posix_Syscall_read (int fd, void* buf, guint64 count);
 int Mono_Posix_Syscall_readdir (void* dir, struct Mono_Posix_Syscall__Dirent* dentry);
 int Mono_Posix_Syscall_readdir_r (void* dirp, struct Mono_Posix_Syscall__Dirent* entry, void** result);
 int Mono_Posix_Syscall_readlink (const char* path, char* buf, guint64 bufsiz);
+int Mono_Posix_Syscall_readlinkat (int dirfd, const char* pathname, char* buf, guint64 bufsiz);
+gint64 Mono_Posix_Syscall_readv (int fd, struct Mono_Posix_Iovec* iov, int iovcnt);
 int Mono_Posix_Syscall_remap_file_pages (void* start, guint64 size, int prot, gint64 pgoff, int flags);
 int Mono_Posix_Syscall_removexattr (const char* path, const char* name);
 int Mono_Posix_Syscall_rewinddir (void* dir);
@@ -1773,14 +1812,17 @@ int Mono_Posix_Syscall_truncate (const char* path, gint64 length);
 int Mono_Posix_Syscall_ttyname_r (int fd, char* buf, guint64 buflen);
 int Mono_Posix_Syscall_uname (struct Mono_Posix_Syscall__Utsname* buf);
 int Mono_Posix_Syscall_utime (const char* filename, struct Mono_Posix_Utimbuf* buf, int use_buf);
+int Mono_Posix_Syscall_utimensat (int dirfd, const char* pathname, struct Mono_Posix_Timespec* times, int flags);
 int Mono_Posix_Syscall_utimes (const char* filename, struct Mono_Posix_Timeval* tvp);
 int Mono_Posix_Syscall_WEXITSTATUS (int status);
 int Mono_Posix_Syscall_WIFEXITED (int status);
 int Mono_Posix_Syscall_WIFSIGNALED (int status);
 int Mono_Posix_Syscall_WIFSTOPPED (int status);
 gint64 Mono_Posix_Syscall_write (int fd, void* buf, guint64 count);
+gint64 Mono_Posix_Syscall_writev (int fd, struct Mono_Posix_Iovec* iov, int iovcnt);
 int Mono_Posix_Syscall_WSTOPSIG (int status);
 int Mono_Posix_Syscall_WTERMSIG (int status);
+int Mono_Posix_ToStat (void* source, struct Mono_Posix_Stat* destination);
 int Mono_Posix_ToStatvfs (void* source, struct Mono_Posix_Statvfs* destination);
 void* Mono_Unix_UnixSignal_install (int signum);
 int Mono_Unix_UnixSignal_uninstall (void* info);
index f50922d76af193bb3ca10fe9e0c88eb16650765f..60ad23d594eb20f8d6caf2e003aee5389c2fedf3 100644 (file)
@@ -373,6 +373,12 @@ ReadEvents (gpointer sock, gpointer buffer, gint32 count, gint32 size)
        return 0;
 }
 
+int
+CreateNLSocket (void)
+{
+       return -1;
+}
+
 int
 CloseNLSocket (gpointer sock)
 {
index a635dd485edc000625353e8c034b90370361845a..8f16106f59f47b55a88d86d4a43510462c007154 100644 (file)
@@ -27,7 +27,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <pthread.h>
-#include <mono/io-layer/atomic.h>
+#include <mono/utils/atomic.h>
 #include <mono/metadata/appdomain.h>
 #endif
 
@@ -107,7 +107,7 @@ int Mono_Posix_FromRealTimeSignum (int offset, int *r)
 
 #ifndef HOST_WIN32
 
-#ifdef WAPI_ATOMIC_ASM
+#ifndef WAPI_NO_ATOMIC_ASM
        #define mph_int_get(p)     InterlockedExchangeAdd ((p), 0)
        #define mph_int_inc(p)     InterlockedIncrement ((p))
        #define mph_int_dec_test(p)     (InterlockedDecrement ((p)) == 0)
index 952a46363dbb687052d045404063c46142ac4cd7..52ab1cf46898e6a3f810341b656e6e211f453d40 100644 (file)
 
 G_BEGIN_DECLS
 
+int
+Mono_Posix_FromStat (struct Mono_Posix_Stat *from, void *_to)
+{
+       struct stat *to = _to;
+       memset (to, 0, sizeof(*to));
+
+       to->st_dev         = from->st_dev;
+       to->st_ino         = from->st_ino;
+       if (Mono_Posix_FromFilePermissions (from->st_mode, &to->st_mode) != 0) {
+               return -1;
+       }
+       to->st_nlink       = from->st_nlink;
+       to->st_uid         = from->st_uid;
+       to->st_gid         = from->st_gid;
+       to->st_rdev        = from->st_rdev;
+       to->st_size        = from->st_size;
+       to->st_blksize     = from->st_blksize;
+       to->st_blocks      = from->st_blocks;
+       to->st_atime       = from->st_atime_;
+       to->st_mtime       = from->st_mtime_;
+       to->st_ctime       = from->st_ctime_;
+#ifdef HAVE_STRUCT_STAT_ST_ATIM
+       to->st_atim.tv_nsec = from->st_atime_nsec;
+#endif
+#ifdef HAVE_STRUCT_STAT_ST_MTIM
+       to->st_mtim.tv_nsec = from->st_mtime_nsec;
+#endif
+#ifdef HAVE_STRUCT_STAT_ST_CTIM
+       to->st_ctim.tv_nsec = from->st_ctime_nsec;
+#endif
+
+       return 0;
+}
+
+int
+Mono_Posix_ToStat (void *_from, struct Mono_Posix_Stat *to)
+{
+       struct stat *from = _from;
+       memset (to, 0, sizeof(*to));
+
+       to->st_dev        = from->st_dev;
+       to->st_ino        = from->st_ino;
+       if (Mono_Posix_ToFilePermissions (from->st_mode, &to->st_mode) != 0) {
+               return -1;
+       }
+       to->st_nlink      = from->st_nlink;
+       to->st_uid        = from->st_uid;
+       to->st_gid        = from->st_gid;
+       to->st_rdev       = from->st_rdev;
+       to->st_size       = from->st_size;
+       to->st_blksize    = from->st_blksize;
+       to->st_blocks     = from->st_blocks;
+       to->st_atime_     = from->st_atime;
+       to->st_mtime_     = from->st_mtime;
+       to->st_ctime_     = from->st_ctime;
+#ifdef HAVE_STRUCT_STAT_ST_ATIM
+       to->st_atime_nsec = from->st_atim.tv_nsec;
+#endif
+#ifdef HAVE_STRUCT_STAT_ST_MTIM
+       to->st_mtime_nsec = from->st_mtim.tv_nsec;
+#endif
+#ifdef HAVE_STRUCT_STAT_ST_CTIM
+       to->st_ctime_nsec = from->st_ctim.tv_nsec;
+#endif
+
+       return 0;
+}
+
 gint32
 Mono_Posix_Syscall_stat (const char *file_name, struct Mono_Posix_Stat *buf)
 {
@@ -70,6 +138,27 @@ Mono_Posix_Syscall_lstat (const char *file_name, struct Mono_Posix_Stat *buf)
        return r;
 }
 
+#ifdef HAVE_FSTATAT
+gint32
+Mono_Posix_Syscall_fstatat (gint32 dirfd, const char *file_name, struct Mono_Posix_Stat *buf, gint32 flags)
+{
+       int r;
+       struct stat _buf;
+
+       if (Mono_Posix_FromAtFlags (flags, &flags) == -1)
+               return -1;
+
+       if (buf == NULL) {
+               errno = EFAULT;
+               return -1;
+       }
+       r = fstatat (dirfd, file_name, &_buf, flags);
+       if (r != -1 && Mono_Posix_ToStat (&_buf, buf) == -1)
+               r = -1;
+       return r;
+}
+#endif
+
 gint32
 Mono_Posix_Syscall_mknod (const char *pathname, guint32 mode, mph_dev_t dev)
 {
@@ -78,8 +167,79 @@ Mono_Posix_Syscall_mknod (const char *pathname, guint32 mode, mph_dev_t dev)
        return mknod (pathname, mode, dev);
 }
 
+#ifdef HAVE_MKNODAT
+gint32
+Mono_Posix_Syscall_mknodat (int dirfd, const char *pathname, guint32 mode, mph_dev_t dev)
+{
+       if (Mono_Posix_FromFilePermissions (mode, &mode) == -1)
+               return -1;
+       return mknodat (dirfd, pathname, mode, dev);
+}
+#endif
+
 G_END_DECLS
 
+gint64
+Mono_Posix_Syscall_get_utime_now ()
+{
+#ifdef UTIME_NOW
+       return UTIME_NOW;
+#else
+       return -1;
+#endif
+}
+
+gint64
+Mono_Posix_Syscall_get_utime_omit ()
+{
+#ifdef UTIME_OMIT
+       return UTIME_OMIT;
+#else
+       return -1;
+#endif
+}
+
+static inline struct timespec*
+copy_utimens (struct timespec* to, struct Mono_Posix_Timespec *from)
+{
+       if (from) {
+               to[0].tv_sec  = from[0].tv_sec;
+               to[0].tv_nsec = from[0].tv_nsec;
+               to[1].tv_sec  = from[1].tv_sec;
+               to[1].tv_nsec = from[1].tv_nsec;
+               return to;
+       }
+
+       return NULL;
+}
+
+#ifdef HAVE_FUTIMENS
+gint32
+Mono_Posix_Syscall_futimens(int fd, struct Mono_Posix_Timespec *tv)
+{
+       struct timespec _tv[2];
+       struct timespec *ptv;
+
+       ptv = copy_utimens (_tv, tv);
+
+       return futimens (fd, ptv);
+}
+#endif /* def HAVE_FUTIMENS */
+
+#ifdef HAVE_UTIMENSAT
+gint32
+Mono_Posix_Syscall_utimensat(int dirfd, const char *pathname, struct Mono_Posix_Timespec *tv, int flags)
+{
+       struct timespec _tv[2];
+       struct timespec *ptv;
+
+       ptv = copy_utimens (_tv, tv);
+
+       return utimensat (dirfd, pathname, ptv, flags);
+}
+#endif /* def HAVE_UTIMENSAT */
+
+
 /*
  * vim: noexpandtab
  */
diff --git a/support/sys-uio.c b/support/sys-uio.c
new file mode 100644 (file)
index 0000000..f6b80e0
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * <sys/uio.h> wrapper functions.
+ *
+ * Authors:
+ *   Steffen Kiess (s-kiess@web.de)
+ *
+ * Copyright (C) 2012 Steffen Kiess
+ */
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif /* ndef _GNU_SOURCE */
+
+#include <sys/uio.h>
+
+#include "map.h"
+#include "mph.h"
+
+G_BEGIN_DECLS
+
+static struct iovec*
+from_iovec (struct Mono_Posix_Iovec *iov, gint32 iovcnt)
+{
+       struct iovec* v;
+       gint32 i;
+
+       if (iovcnt < 0) {
+               errno = EINVAL;
+               return NULL;
+       }
+
+       v = malloc (iovcnt * sizeof (struct iovec));
+       if (!v) {
+               return NULL;
+       }
+
+       for (i = 0; i < iovcnt; i++) {
+               if (Mono_Posix_FromIovec (&iov[i], &v[i]) != 0) {
+                       free (v);
+                       return NULL;
+               }
+       }
+
+       return v;
+}
+
+#ifdef HAVE_READV
+gint64
+Mono_Posix_Syscall_readv (int dirfd, struct Mono_Posix_Iovec *iov, gint32 iovcnt)
+{
+       struct iovec* v;
+       gint64 res;
+
+       v = from_iovec (iov, iovcnt);
+       if (!v) {
+               return -1;
+       }
+
+       res = readv(dirfd, v, iovcnt);
+       free (v);
+       return res;
+}
+#endif /* def HAVE_READV */
+
+#ifdef HAVE_WRITEV
+gint64
+Mono_Posix_Syscall_writev (int dirfd, struct Mono_Posix_Iovec *iov, gint32 iovcnt)
+{
+       struct iovec* v;
+       gint64 res;
+
+       v = from_iovec (iov, iovcnt);
+       if (!v) {
+               return -1;
+       }
+
+       res = writev (dirfd, v, iovcnt);
+       free (v);
+       return res;
+}
+#endif /* def HAVE_WRITEV */
+
+#ifdef HAVE_PREADV
+gint64
+Mono_Posix_Syscall_preadv (int dirfd, struct Mono_Posix_Iovec *iov, gint32 iovcnt, gint64 off)
+{
+       struct iovec* v;
+       gint64 res;
+
+       mph_return_if_off_t_overflow (off);
+
+       v = from_iovec (iov, iovcnt);
+       if (!v) {
+               return -1;
+       }
+
+       res = preadv (dirfd, v, iovcnt, (off_t) off);
+       free (v);
+       return res;
+}
+#endif /* def HAVE_PREADV */
+
+#ifdef HAVE_PWRITEV
+gint64
+Mono_Posix_Syscall_pwritev (int dirfd, struct Mono_Posix_Iovec *iov, gint32 iovcnt, gint64 off)
+{
+       struct iovec* v;
+       gint64 res;
+
+       mph_return_if_off_t_overflow (off);
+
+       v = from_iovec (iov, iovcnt);
+       if (!v) {
+               return -1;
+       }
+
+       res = pwritev (dirfd, v, iovcnt, (off_t) off);
+       free (v);
+       return res;
+}
+#endif /* def HAVE_PWRITEV */
+
+
+/*
+ * vim: noexpandtab
+ */
index 5652329e13ff78abe8ca97b54789c5ded2522e7e..da2750abe8a35758ca832e5cc760bbf06dac02ca 100644 (file)
@@ -147,6 +147,19 @@ Mono_Posix_Syscall_readlink (const char *path, char *buf, mph_size_t len)
        return r;
 }
 
+#ifdef HAVE_READLINKAT
+gint32
+Mono_Posix_Syscall_readlinkat (int dirfd, const char *path, char *buf, mph_size_t len)
+{
+       int r;
+       mph_return_if_size_t_overflow (len);
+       r = readlinkat (dirfd, path, buf, (size_t) len);
+       if (r >= 0 && r < len)
+               buf [r] = '\0';
+       return r;
+}
+#endif /* def HAVE_READLINKAT */
+
 #if HAVE_GETLOGIN_R
 gint32
 Mono_Posix_Syscall_getlogin_r (char *buf, mph_size_t len)
index d21955f9cf845a3071b80747dafda0b386142d3b..11b0980667bb2a806455e8665393569e3f9bcede 100644 (file)
@@ -71,6 +71,7 @@ namespace Mono.Tools.LocaleBuilder
                List<CultureInfoEntry> cultures;
                Dictionary<string, string> region_currency;
                Dictionary<string, string> currency_fractions;
+               Dictionary<string, string> extra_parent_locales; 
 
                // The lang is the language that display names will be displayed in
                public string Lang
@@ -261,6 +262,19 @@ namespace Mono.Tools.LocaleBuilder
                                region_currency.Add (entry.Attributes["iso3166"].Value, child.Attributes["iso4217"].Value);
                        }
 
+                       // Parent locales
+                       extra_parent_locales = new Dictionary<string, string> (StringComparer.OrdinalIgnoreCase);
+                       foreach (XmlNode entry in supplemental.SelectNodes ("supplementalData/parentLocales/parentLocale")) {
+                               var parent = entry.Attributes["parent"].Value;
+
+                               if (parent == "root")
+                                       continue;
+
+                               var locales = entry.Attributes["locales"].Value;
+                               foreach (var locale in locales.Split (' '))
+                                       extra_parent_locales.Add (locale, parent);
+                       }
+
                        var lcdids = GetXmlDocument ("lcids.xml");
                        foreach (XmlNode lcid in lcdids.SelectNodes ("lcids/lcid")) {
                                var name = lcid.Attributes["name"].Value;
@@ -837,7 +851,17 @@ namespace Mono.Tools.LocaleBuilder
 
                                        fname += part;
 
-                                       var xml = GetXmlDocument (Path.Combine (data_root, "main", fname + ".xml"));
+                                       XmlDocument xml;
+                                       string extra;
+                                       if (extra_parent_locales.TryGetValue (fname, out extra)) {
+                                               xml = GetXmlDocument (Path.Combine (data_root, "main", extra + ".xml"));
+                                               if (doc == null)
+                                                       doc = xml;
+
+                                               Import (xml, data);
+                                       }
+
+                                       xml = GetXmlDocument (Path.Combine (data_root, "main", fname + ".xml"));
                                        if (doc == null)
                                                doc = xml;
 
@@ -886,14 +910,6 @@ namespace Mono.Tools.LocaleBuilder
                                                }
                                        }
                                }
-
-                               if (data.DateTimeFormatEntry.MonthGenitiveNames[0] == null)
-                                       data.DateTimeFormatEntry.MonthGenitiveNames = data.DateTimeFormatEntry.MonthNames;
-
-                               if (data.DateTimeFormatEntry.AbbreviatedMonthGenitiveNames[0] == null)
-                                       data.DateTimeFormatEntry.AbbreviatedMonthGenitiveNames = data.DateTimeFormatEntry.AbbreviatedMonthNames;
-
-
                        }
 
                        // It looks like it never changes
@@ -981,8 +997,12 @@ namespace Mono.Tools.LocaleBuilder
                                ProcessAllNodes (nodes, df.AbbreviatedMonthNames, AddOrReplaceValue);
 
                                nodes = node.SelectNodes ("months/monthContext[@type='format']/monthWidth[@type='wide']/month");
-                               if (nodes != null)
+                               if (nodes != null) {
                                        ProcessAllNodes (nodes, df.MonthGenitiveNames, AddOrReplaceValue);
+                               }
+
+                               // All values seem to match
+                               Array.Copy (df.AbbreviatedMonthNames, df.AbbreviatedMonthGenitiveNames, df.AbbreviatedMonthNames.Length);
 
                                nodes = node.SelectNodes ("days/dayContext[@type='format']/dayWidth[@type='wide']/day");
                                ProcessAllNodes (nodes, df.DayNames, AddOrReplaceDayValue);
@@ -1070,7 +1090,10 @@ namespace Mono.Tools.LocaleBuilder
                                // We cannot use the value from CLDR because many broken
                                // .NET serializers (e.g. JSON) use text value of NegativeInfinity
                                // and different value would break interoperability with .NET
-                               if (el != null && el.InnerText != "∞") {
+                               var inf = GetInfinitySymbol (ci);
+                               if (inf != null)
+                                       ni.InfinitySymbol = inf;
+                               else if (el != null && el.InnerText != "∞") {
                                        ni.InfinitySymbol = el.InnerText;
                                }
 
@@ -1095,6 +1118,50 @@ namespace Mono.Tools.LocaleBuilder
                        }
                }
 
+               string GetInfinitySymbol (CultureInfoEntry ci)
+               {
+                       // TODO: Add more
+                       switch (ci.TwoLetterISOLanguageName) {
+                               case "ca":
+                                       return "Infinit";
+                               case "cs":
+                               case "sk":
+                                       return "+nekonečno";
+                               case "de":
+                                       return "+unendlich";
+                               case "el":
+                                       return "Άπειρο";
+                               case "es":
+                               case "gl":
+                                       return "Infinito";
+                               case "it":
+                               case "pt":
+                                       return "+Infinito";
+                               case "nl":
+                                       return "oneindig";
+                               case "fr":
+                               case "tzm":
+                                       return "+Infini";
+                               case "pl":
+                                       return "+nieskończoność";
+                               case "ru":
+                               case "tg":
+                                       return "бесконечность";
+                               case "sl":
+                                       return "neskončnost";
+                               case "rm":
+                                       return "+infinit";
+                               case "lv":
+                                       return "bezgalība";
+                               case "lt":
+                                       return "begalybė";
+                               case "eu":
+                                       return "Infinitu";
+                       }
+
+                       return null;
+               }
+
                static string ConvertDatePatternFormat (string format)
                {
                        //
index c30980292626d72826c9d9f4d17a9685694373f7..d94c4b6058273cea63cc6eef1a97942dcff0015b 100644 (file)
@@ -42,7 +42,7 @@ minimal: locale-builder.exe locale-data
 
 locale-data:
        if ! test -d CLDR/common ; then \
-               wget http://www.unicode.org/Public/cldr/21/core.zip ; \
+               curl http://www.unicode.org/Public/cldr/21/core.zip -o core.zip ; \
                unzip core.zip -d CLDR ; \
        fi
 
index 68a3ca0a17cb700819914dec43c66c7f8b462345..5d4f1d0d817f0f7df47dd1b0a64d11396c3a2682 100644 (file)
@@ -68,6 +68,9 @@ namespace Mono.Tools.LocaleBuilder
                {
                        get
                        {
+                               if (InfinitySymbol.StartsWith (PositiveSign))
+                                       return NegativeSign + InfinitySymbol.Substring (1, InfinitySymbol.Length - 1);
+       
                                return NegativeSign + InfinitySymbol;
                        }
                }
@@ -76,7 +79,7 @@ namespace Mono.Tools.LocaleBuilder
                {
                        get
                        {
-                               return InfinitySymbol == "Infinity" ? InfinitySymbol : PositiveSign + InfinitySymbol;
+                               return InfinitySymbol;
                        }
                }
 
index b36a586ce1b1e44be4104bbce89e405b2c2913db..f50d85d7e9bada616567394c0ff8c043ff0355fc 100644 (file)
@@ -87,7 +87,7 @@ namespace Mono.Tools.LocaleBuilder
                        { 0x0037, new [] { ".", "yyyy 'წლის' dd MM, dddd", "H:mm:ss", "dd.MM.yyyy", "H:mm", "dd MM", "MMMM yyyy" } },
                        { 0x0038, new [] { "-", "d. MMMM yyyy", "HH:mm:ss", "dd-MM-yyyy", "HH:mm", "d. MMMM", "MMMM yyyy" } },
                        { 0x0039, new [] { "-", "dd MMMM yyyy", "HH:mm:ss", "dd-MM-yyyy", "HH:mm", "dd MMMM", "MMMM, yyyy" } },
-                       { 0x003a, new [] { "/", "dddd, d' ta\' 'MMMM yyyy", "HH:mm:ss", "dd/MM/yyyy", "HH:mm", "d' ta\' 'MMMM", "MMMM yyyy" } },
+                       { 0x003a, new [] { "/", "dddd, d' ta\\' 'MMMM yyyy", "HH:mm:ss", "dd/MM/yyyy", "HH:mm", "d' ta\\' 'MMMM", "MMMM yyyy" } },
                        { 0x003b, new [] { ".", "MMMM d'. b. 'yyyy", "HH:mm:ss", "dd.MM.yyyy", "HH:mm", "MMMM d'. b. '", "MMMM yyyy" } },
                        { 0x003c, new [] { "/", "d MMMM yyyy", "HH:mm:ss", "dd/MM/yyyy", "HH:mm", "dd MMMM", "MMMM yyyy" } },
                        { 0x003e, new [] { "/", "dd MMMM yyyy", "H:mm:ss", "dd/MM/yyyy", "H:mm", "dd MMMM", "MMMM yyyy" } },
@@ -202,7 +202,7 @@ namespace Mono.Tools.LocaleBuilder
                        { 0x0437, new [] { ".", "yyyy 'წლის' dd MM, dddd", "H:mm:ss", "dd.MM.yyyy", "H:mm", "dd MM", "MMMM yyyy" } },
                        { 0x0438, new [] { "-", "d. MMMM yyyy", "HH:mm:ss", "dd-MM-yyyy", "HH:mm", "d. MMMM", "MMMM yyyy" } },
                        { 0x0439, new [] { "-", "dd MMMM yyyy", "HH:mm:ss", "dd-MM-yyyy", "HH:mm", "dd MMMM", "MMMM, yyyy" } },
-                       { 0x043a, new [] { "/", "dddd, d' ta\' 'MMMM yyyy", "HH:mm:ss", "dd/MM/yyyy", "HH:mm", "d' ta\' 'MMMM", "MMMM yyyy" } },
+                       { 0x043a, new [] { "/", "dddd, d' ta\\' 'MMMM yyyy", "HH:mm:ss", "dd/MM/yyyy", "HH:mm", "d' ta\\' 'MMMM", "MMMM yyyy" } },
                        { 0x043b, new [] { ".", "MMMM d'. b. 'yyyy", "HH:mm:ss", "dd.MM.yyyy", "HH:mm", "MMMM d'. b. '", "MMMM yyyy" } },
                        { 0x043e, new [] { "/", "dd MMMM yyyy", "H:mm:ss", "dd/MM/yyyy", "H:mm", "dd MMMM", "MMMM yyyy" } },
                        { 0x043f, new [] { ".", "d MMMM yyyy 'ж.'", "H:mm:ss", "dd.MM.yyyy", "H:mm", "d MMMM", "MMMM yyyy" } },
@@ -390,19 +390,19 @@ namespace Mono.Tools.LocaleBuilder
                static readonly Dictionary<int, string[][]> DateTime2 = new Dictionary<int, string[][]> {
                        { 0x0001, new[] { new[] { "dd/MM/yy", "dd/MM/yyyy" }, new[] { "dd/MMMM/yyyy", "dddd, dd MMMM, yyyy" }, new[] { "hh:mm tt", "HH:mm" }, new[] { "hh:mm:ss tt", "HH:mm:ss" } } },
                        { 0x0002, new[] { new[] { "d.M.yyyy 'г.'", "dd.M.yyyy 'г.'", "d.MM.yyyy 'г.'", "dd.MM.yyyy 'г.'" }, new[] { "dd MMMM yyyy 'г.'", "d MMMM yyyy 'г.'", "dddd, dd MMMM yyyy 'г.'", "dddd, d MMMM yyyy 'г.'" }, new[] { "HH:mm 'ч.'", "H:mm 'ч.'" }, new[] { "HH:mm:ss 'ч.'", "H:mm:ss 'ч.'" } } },
-                       { 0x0003, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "yyyy-MM-dd", "d/MM/yy", "d/M/yy", "dd-MM-yy", "dd.MM.yy" }, new[] { "dddd, d' / 'MMMM' / 'yyyy", "d'/'MMMM'/'yyyy", "d' 'MMMM' 'yyyy" }, new[] { "HH:mm", "H:mm", "HH'H'mm'\''" }, new[] { "HH:mm:ss", "H:mm:ss", "HH'H'mm'\''ss'\'\''" } } },
+                       { 0x0003, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "yyyy-MM-dd", "d/MM/yy", "d/M/yy", "dd-MM-yy", "dd.MM.yy" }, new[] { "dddd, d' / 'MMMM' / 'yyyy", "d'/'MMMM'/'yyyy", "d' 'MMMM' 'yyyy" }, new[] { "HH:mm", "H:mm", "HH'H'mm'\\''" }, new[] { "HH:mm:ss", "H:mm:ss", "HH'H'mm'\\''ss'\\'\\''" } } },
                        { 0x0004, new[] { new[] { "yyyy/M/d", "yyyy-M-d", "yyyy.M.d", "yyyy-MM-dd", "yyyy/MM/dd", "yyyy.MM.dd", "yy-M-d", "yy/M/d", "yy.M.d", "yy/MM/dd" }, new[] { "yyyy'年'M'月'd'日'", "yyyy'年'M'月'd'日',dddd", "dddd,yyyy'年'M'月'd'日'" }, new[] { "H:mm", "HH:mm", "tt h:mm", "tt hh:mm" }, new[] { "H:mm:ss", "HH:mm:ss", "tt h:mm:ss", "tt hh:mm:ss" } } },
                        { 0x0005, new[] { new[] { "d.M.yyyy", "d-M-yy", "yyyy-MM-dd", "yyyy-M-d", "yy-M-d" }, new[] { "d. MMMM yyyy" }, new[] { "H:mm", "HH:mm", "h.mm tt", "H.mm" }, new[] { "H:mm:ss", "HH:mm:ss", "h.mm.ss tt", "H.mm.ss" } } },
                        { 0x0006, new[] { new[] { "dd-MM-yyyy", "dd-MM-yy", "yyyy-MM-dd", "yyyy MM dd" }, new[] { "d. MMMM yyyy", "dd. MMMM yyyy" }, new[] { "HH:mm", "H:mm" }, new[] { "HH:mm:ss", "H:mm:ss" } } },
                        { 0x0007, new[] { new[] { "dd.MM.yyyy", "dd.MMM.yyyy", "dd.MM.yy", "d.MM.yy", "d.M.yy", "d.M.yyyy", "yyyy-MM-dd" }, new[] { "dddd, d. MMMM yyyy", "d. MMMM yyyy", "d. MMM yyyy" }, new[] { "HH:mm", "H:mm", "H.mm", "H.mm' Uhr'" }, new[] { "HH:mm:ss", "H:mm:ss' Uhr'", "HH:mm:ss' Uhr'", "HHmmss" } } },
                        { 0x0008, new[] { new[] { "d/M/yyyy", "dd/MM/yyyy", "d/M/yy", "dd/MM/yy", "dd/MMM/yyyy", "yyyy-MM-dd" }, new[] { "dddd, d MMMM yyyy", "d MMMM yyyy" }, new[] { "h:mm tt", "hh:mm tt", "H:mm", "HH:mm" }, new[] { "h:mm:ss tt", "hh:mm:ss tt", "H:mm:ss", "HH:mm:ss" } } },
                        { 0x0009, new[] { new[] { "M/d/yyyy", "M/d/yy", "MM/dd/yy", "MM/dd/yyyy", "yy/MM/dd", "yyyy-MM-dd", "dd-MMM-yy" }, new[] { "dddd, MMMM dd, yyyy", "MMMM dd, yyyy", "dddd, dd MMMM, yyyy", "dd MMMM, yyyy" }, new[] { "h:mm tt", "hh:mm tt", "H:mm", "HH:mm" }, new[] { "h:mm:ss tt", "hh:mm:ss tt", "H:mm:ss", "HH:mm:ss" } } },
-                       { 0x000a, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "d/MM/yy", "d/M/yy", "dd-MM-yy", "dd.MM.yy", "yyyy-MM-dd", "dd.MMM.yyyy" }, new[] { "dddd, dd' de 'MMMM' de 'yyyy", "dddd d' de 'MMMM' de 'yyyy", "d' de 'MMMM' de 'yyyy" }, new[] { "H:mm", "HH:mm", "HH'H'mm'\''" }, new[] { "H:mm:ss", "HH:mm:ss", "HH'H'mm'\''ss'\'\''" } } },
+                       { 0x000a, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "d/MM/yy", "d/M/yy", "dd-MM-yy", "dd.MM.yy", "yyyy-MM-dd", "dd.MMM.yyyy" }, new[] { "dddd, dd' de 'MMMM' de 'yyyy", "dddd d' de 'MMMM' de 'yyyy", "d' de 'MMMM' de 'yyyy" }, new[] { "H:mm", "HH:mm", "HH'H'mm'\\''" }, new[] { "H:mm:ss", "HH:mm:ss", "HH'H'mm'\\''ss'\\'\\''" } } },
                        { 0x000b, new[] { new[] { "d.M.yyyy", "dd.MM.yyyy", "d.M.yy", "yyyy-MM-dd" }, new[] { "d. MMMM'ta 'yyyy", "dd. MMMM'ta 'yyyy" }, new[] { "H:mm", "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss" } } },
                        { 0x000c, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "dd.MM.yy", "dd-MM-yy", "yyyy-MM-dd" }, new[] { "dddd d MMMM yyyy", "d MMM yy", "d MMMM yyyy" }, new[] { "HH:mm", "H:mm", "HH.mm", "HH' h 'mm", "HH'h'mm" }, new[] { "HH:mm:ss", "H:mm:ss" } } },
                        { 0x000d, new[] { new[] { "dd/MM/yyyy", "dd MMMM yyyy", "dd/MM/yy", "dd/MMMM/yyyy", "dd-MM-yy", "dd-MM-yyyy", "dd-MMMM-yyyy", "yyyy-MM-dd", "dd 'ב'MMMM yyyy", "dd MMM yy" }, new[] { "dddd dd MMMM yyyy", "dd MMMM yyyy", "dddd dd 'ב'MMMM yyyy", "ddd dd 'ב'MMMM yyyy", "dd 'ב'MMMM yyyy" }, new[] { "HH:mm", "hh:mm tt" }, new[] { "HH:mm:ss", "hh:mm:ss tt" } } },
                        { 0x000e, new[] { new[] { "yyyy.MM.dd.", "yyyy. MM. dd.", "yyyy-MM-dd", "yy-MM-dd" }, new[] { "yyyy. MMMM d." }, new[] { "H:mm", "HH:mm", "h:mm tt" }, new[] { "H:mm:ss", "HH:mm:ss", "h:mm:ss tt" } } },
-                       { 0x000f, new[] { new[] { "d.M.yyyy", "dd.MM.yy", "d. M. yyyy.", "d. M. '\''yy.", "yyyy-MM-dd", "yy MM dd" }, new[] { "d. MMMM yyyy", "dd. MMMM yyyy" }, new[] { "HH:mm", "H:mm" }, new[] { "HH:mm:ss", "H:mm:ss" } } },
+                       { 0x000f, new[] { new[] { "d.M.yyyy", "dd.MM.yy", "d. M. yyyy.", "d. M. '\\''yy.", "yyyy-MM-dd", "yy MM dd" }, new[] { "d. MMMM yyyy", "dd. MMMM yyyy" }, new[] { "HH:mm", "H:mm" }, new[] { "HH:mm:ss", "H:mm:ss" } } },
                        { 0x0010, new[] { new[] { "dd/MM/yyyy", "dd/MMM/yyyy", "dd/MM/yy", "dd.M.yy", "d/M/yy", "yyyy-MM-dd" }, new[] { "dddd d MMMM yyyy", "d-MMM-yy", "d MMMM yyyy" }, new[] { "HH:mm", "H:mm", "H.mm", "HH.mm" }, new[] { "HH:mm:ss", "H.mm.ss", "HH.mm.ss" } } },
                        { 0x0011, new[] { new[] { "yyyy/MM/dd", "yy/MM/dd", "yy/M/d", "yyyy/M/d", "yy/MM/dd' ('ddd')'", "yy/M/d' ('ddd')'", "yyyy/MM/dd' ('ddd')'", "yyyy-MM-dd" }, new[] { "yyyy'年'M'月'd'日'", "yyyy'年'MM'月'dd'日'", "yyyy'年'M'月'd'日' dddd", "yyyy'年'MM'月'dd'日' dddd" }, new[] { "H:mm", "HH:mm", "tt h:mm", "tt hh:mm" }, new[] { "H:mm:ss", "HH:mm:ss", "tt h:mm:ss", "tt hh:mm:ss" } } },
                        { 0x0012, new[] { new[] { "yyyy-MM-dd", "yy-MM-dd", "yy-M-d", "yyyy-M-d" }, new[] { "yyyy'년' M'월' d'일' dddd", "yyyy'년' M'월' d'일'", "yy'년' M'월' d'일' dddd", "yy'년' M'월' d'일'", "yyyy'년' MM'월' dd'일' dddd", "yyyy'년' MM'월' dd'일'" }, new[] { "tt h:mm", "tt hh:mm", "H:mm", "HH:mm" }, new[] { "tt h:mm:ss", "tt hh:mm:ss", "H:mm:ss", "HH:mm:ss" } } },
@@ -432,7 +432,7 @@ namespace Mono.Tools.LocaleBuilder
                        { 0x002a, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "dd-MM-yy", "dd-MM-yyyy", "yyyy-MM-dd" }, new[] { "dd MMMM yyyy" }, new[] { "h:mm tt", "hh:mm tt", "H:mm", "HH:mm" }, new[] { "h:mm:ss tt", "hh:mm:ss tt", "H:mm:ss", "HH:mm:ss" } } },
                        { 0x002b, new[] { new[] { "dd.MM.yyyy", "dd.MM.yy", "d/MM/yyyy", "dd/MM/yyyy", "d/MMM/yyyy", "dd/MMM/yyyy", "yyyy-MM-dd" }, new[] { "d MMMM, yyyy", "dddd, d MMMM yyyy", "dddd, dd MMMM yyyy", "dd MMMM yyyy", "d-MMM-yyyy", "dd-MMM-yyyy", "ddd, d-MMMM-yyyy", "ddd, dd-MMMM-yyyy" }, new[] { "H:mm", "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss" } } },
                        { 0x002c, new[] { new[] { "dd.MM.yyyy", "dd.MM.yy", "d.M.yy", "dd/MM/yy", "yyyy-MM-dd" }, new[] { "d MMMM yyyy", "dd MMMM yyyy" }, new[] { "H:mm", "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss" } } },
-                       { 0x002d, new[] { new[] { "yyyy/MM/dd", "yyyy-MM-dd" }, new[] { "dddd, yyyy.'eko' MMMM'k 'd" }, new[] { "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss", "HH'H'mm'\''ss'\'\''" } } },
+                       { 0x002d, new[] { new[] { "yyyy/MM/dd", "yyyy-MM-dd" }, new[] { "dddd, yyyy.'eko' MMMM'k 'd" }, new[] { "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss", "HH'H'mm'\\''ss'\\'\\''" } } },
                        { 0x002e, new[] { new[] { "d. M. yyyy", "d. M. yy", "dd.MM.yyyy", "dd.MM.yy", "yyyy-MM-dd" }, new[] { "dddd, 'dnja' d. MMMM yyyy", "dddd, d. MMMM yyyy", "d. MMMM yyyy", "d. M. yyyy" }, new[] { "H.mm 'hodź.'", "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss" } } },
                        { 0x002f, new[] { new[] { "dd.MM.yyyy", "dd.MM.yy", "yyyy-MM-dd" }, new[] { "dddd, dd MMMM yyyy" }, new[] { "HH:mm" }, new[] { "HH:mm:ss" } } },
                        { 0x0032, new[] { new[] { "yyyy/MM/dd", "yy/MM/dd", "yyyy-MM-dd" }, new[] { "dd MMMM yyyy" }, new[] { "hh:mm tt", "h:mm tt", "HH:mm" }, new[] { "hh:mm:ss tt", "h:mm:ss tt", "HH:mm:ss" } } },
@@ -442,7 +442,7 @@ namespace Mono.Tools.LocaleBuilder
                        { 0x0037, new[] { new[] { "dd.MM.yyyy", "dd.MM.yy", "d.M.yy", "dd/MM/yy", "yyyy-MM-dd" }, new[] { "yyyy 'წლის' dd MM, dddd" }, new[] { "H:mm", "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss" } } },
                        { 0x0038, new[] { new[] { "dd-MM-yyyy", "dd-MM-yy", "yyyy-MM-dd" }, new[] { "d. MMMM yyyy" }, new[] { "HH:mm", "HH.mm" }, new[] { "HH:mm:ss", "HH.mm.ss" } } },
                        { 0x0039, new[] { new[] { "dd-MM-yyyy", "dd-MM-yy", "d-M-yy", "d.M.yy", "yyyy-MM-dd" }, new[] { "dd MMMM yyyy", "d MMMM yyyy" }, new[] { "HH:mm", "H:mm", "tt hh:mm", "tt h:mm" }, new[] { "HH:mm:ss", "H:mm:ss", "tt hh:mm:ss", "tt h:mm:ss" } } },
-                       { 0x003a, new[] { new[] { "dd/MM/yyyy", "yyyy-MM-dd", "ddMMyyyy", "d-M-yyyy", "d/M/yyyy" }, new[] { "dddd, d' ta\' 'MMMM yyyy", "d' ta\' 'MMMM yyyy", "dd MMM yyyy" }, new[] { "HH:mm", "h:mm tt", "H:mm", "hh:mm tt" }, new[] { "HH:mm:ss", "h:mm:ss tt", "H:mm:ss", "hh:mm:ss tt" } } },
+                       { 0x003a, new[] { new[] { "dd/MM/yyyy", "yyyy-MM-dd", "ddMMyyyy", "d-M-yyyy", "d/M/yyyy" }, new[] { "dddd, d' ta\\' 'MMMM yyyy", "d' ta\\' 'MMMM yyyy", "dd MMM yyyy" }, new[] { "HH:mm", "h:mm tt", "H:mm", "hh:mm tt" }, new[] { "HH:mm:ss", "h:mm:ss tt", "H:mm:ss", "hh:mm:ss tt" } } },
                        { 0x003b, new[] { new[] { "dd.MM.yyyy", "dd.MM.yy", "d.M.yy", "yyyy-MM-dd" }, new[] { "MMMM d'. b. 'yyyy" }, new[] { "HH:mm", "H:mm", "HH.mm" }, new[] { "HH:mm:ss", "H:mm:ss", "HH.mm.ss" } } },
                        { 0x003c, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "d/M/yy", "d.M.yy", "yyyy-MM-dd" }, new[] { "d MMMM yyyy", "dd MMMM yyyy", "dd MMM yyyy", "d MMM yyyy" }, new[] { "HH:mm", "H:mm" }, new[] { "HH:mm:ss", "H:mm:ss" } } },
                        { 0x003e, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "yyyy-MM-dd" }, new[] { "dd MMMM yyyy" }, new[] { "H:mm", "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss" } } },
@@ -468,7 +468,7 @@ namespace Mono.Tools.LocaleBuilder
                        { 0x0052, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "d/M/yy", "d.M.yy", "yyyy-MM-dd" }, new[] { "dd MMMM yyyy", "d MMMM yyyy" }, new[] { "HH:mm", "H:mm", "hh:mm tt", "h:mm tt" }, new[] { "HH:mm:ss", "H:mm:ss", "hh:mm:ss tt", "h:mm:ss tt" } } },
                        { 0x0053, new[] { new[] { "yyyy-MM-dd" }, new[] { "d MMMM yyyy", "ddd d MMMM yyyy" }, new[] { "H:mm tt" }, new[] { "HH:mm:ss" } } },
                        { 0x0054, new[] { new[] { "dd/MM/yyyy", "yyyy-MM-dd" }, new[] { "dd MMMM yyyy" }, new[] { "H:mm tt" }, new[] { "HH:mm:ss" } } },
-                       { 0x0056, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "d/MM/yy", "d/M/yy", "dd-MM-yy", "dd.MM.yy", "yyyy-MM-dd" }, new[] { "dddd, dd' de 'MMMM' de 'yyyy", "dddd d' de 'MMMM' de 'yyyy", "d' de 'MMMM' de 'yyyy" }, new[] { "H:mm", "HH:mm", "hh:mm tt", "HH'H'mm'\''" }, new[] { "H:mm:ss", "HH:mm:ss", "hh:mm:ss tt", "HH'H'mm'\''ss'\'\''" } } },
+                       { 0x0056, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "d/MM/yy", "d/M/yy", "dd-MM-yy", "dd.MM.yy", "yyyy-MM-dd" }, new[] { "dddd, dd' de 'MMMM' de 'yyyy", "dddd d' de 'MMMM' de 'yyyy", "d' de 'MMMM' de 'yyyy" }, new[] { "H:mm", "HH:mm", "hh:mm tt", "HH'H'mm'\\''" }, new[] { "H:mm:ss", "HH:mm:ss", "hh:mm:ss tt", "HH'H'mm'\\''ss'\\'\\''" } } },
                        { 0x0057, new[] { new[] { "dd-MM-yyyy", "dd-MM-yy", "d-M-yy", "d.M.yy", "yyyy-MM-dd" }, new[] { "dd MMMM yyyy", "d MMMM yyyy" }, new[] { "HH:mm", "H:mm", "tt hh:mm", "tt h:mm" }, new[] { "HH:mm:ss", "H:mm:ss", "tt hh:mm:ss", "tt h:mm:ss" } } },
                        { 0x005a, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "yyyy-MM-dd" }, new[] { "dd MMMM, yyyy", "dddd, dd MMMM, yyyy" }, new[] { "hh:mm tt", "HH:mm" }, new[] { "hh:mm:ss tt", "HH:mm:ss" } } },
                        { 0x005b, new[] { new[] { "yyyy-MM-dd", "yyyy/MM/dd", "yy/MM/dd", "dd/MM/yyyy", "dd/MM/yy" }, new[] { "yyyy MMMM' මස 'dd' වැනිදා 'dddd" }, new[] { "h:mm tt", "hh:mm tt", "H:mm", "HH:mm" }, new[] { "h:mm:ss tt", "hh:mm:ss tt", "H:mm:ss", "HH:mm:ss" } } },
@@ -505,7 +505,7 @@ namespace Mono.Tools.LocaleBuilder
                        { 0x0091, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "d/M/yy", "d.M.yy", "yyyy-MM-dd" }, new[] { "dd MMMM yyyy", "d MMMM yyyy" }, new[] { "HH:mm", "H:mm", "hh:mm tt", "h:mm tt" }, new[] { "HH:mm:ss", "H:mm:ss", "hh:mm:ss tt", "h:mm:ss tt" } } },
                        { 0x0401, new[] { new[] { "dd/MM/yy", "dd/MM/yyyy" }, new[] { "dd/MMMM/yyyy", "dddd, dd MMMM, yyyy" }, new[] { "hh:mm tt", "HH:mm" }, new[] { "hh:mm:ss tt", "HH:mm:ss" } } },
                        { 0x0402, new[] { new[] { "d.M.yyyy 'г.'", "dd.M.yyyy 'г.'", "d.MM.yyyy 'г.'", "dd.MM.yyyy 'г.'" }, new[] { "dd MMMM yyyy 'г.'", "d MMMM yyyy 'г.'", "dddd, dd MMMM yyyy 'г.'", "dddd, d MMMM yyyy 'г.'" }, new[] { "HH:mm 'ч.'", "H:mm 'ч.'" }, new[] { "HH:mm:ss 'ч.'", "H:mm:ss 'ч.'" } } },
-                       { 0x0403, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "yyyy-MM-dd", "d/MM/yy", "d/M/yy", "dd-MM-yy", "dd.MM.yy" }, new[] { "dddd, d' / 'MMMM' / 'yyyy", "d'/'MMMM'/'yyyy", "d' 'MMMM' 'yyyy" }, new[] { "HH:mm", "H:mm", "HH'H'mm'\''" }, new[] { "HH:mm:ss", "H:mm:ss", "HH'H'mm'\''ss'\'\''" } } },
+                       { 0x0403, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "yyyy-MM-dd", "d/MM/yy", "d/M/yy", "dd-MM-yy", "dd.MM.yy" }, new[] { "dddd, d' / 'MMMM' / 'yyyy", "d'/'MMMM'/'yyyy", "d' 'MMMM' 'yyyy" }, new[] { "HH:mm", "H:mm", "HH'H'mm'\\''" }, new[] { "HH:mm:ss", "H:mm:ss", "HH'H'mm'\\''ss'\\'\\''" } } },
                        { 0x0404, new[] { new[] { "yyyy/M/d", "yyyy/MM/dd", "yyyy-MM-dd" }, new[] { "yyyy'年'M'月'd'日'", "yyyy'年'MM'月'dd'日'" }, new[] { "tt hh:mm", "tt h:mm", "HH:mm", "H:mm" }, new[] { "tt hh:mm:ss", "tt h:mm:ss", "HH:mm:ss", "H:mm:ss" } } },
                        { 0x0405, new[] { new[] { "d.M.yyyy", "d-M-yy", "yyyy-MM-dd", "yyyy-M-d", "yy-M-d" }, new[] { "d. MMMM yyyy" }, new[] { "H:mm", "HH:mm", "h.mm tt", "H.mm" }, new[] { "H:mm:ss", "HH:mm:ss", "h.mm.ss tt", "H.mm.ss" } } },
                        { 0x0406, new[] { new[] { "dd-MM-yyyy", "dd-MM-yy", "yyyy-MM-dd", "yyyy MM dd" }, new[] { "d. MMMM yyyy", "dd. MMMM yyyy" }, new[] { "HH:mm", "H:mm" }, new[] { "HH:mm:ss", "H:mm:ss" } } },
@@ -516,7 +516,7 @@ namespace Mono.Tools.LocaleBuilder
                        { 0x040c, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "dd.MM.yy", "dd-MM-yy", "yyyy-MM-dd" }, new[] { "dddd d MMMM yyyy", "d MMM yy", "d MMMM yyyy" }, new[] { "HH:mm", "H:mm", "HH.mm", "HH' h 'mm", "HH'h'mm" }, new[] { "HH:mm:ss", "H:mm:ss" } } },
                        { 0x040d, new[] { new[] { "dd/MM/yyyy", "dd MMMM yyyy", "dd/MM/yy", "dd/MMMM/yyyy", "dd-MM-yy", "dd-MM-yyyy", "dd-MMMM-yyyy", "yyyy-MM-dd", "dd 'ב'MMMM yyyy", "dd MMM yy" }, new[] { "dddd dd MMMM yyyy", "dd MMMM yyyy", "dddd dd 'ב'MMMM yyyy", "ddd dd 'ב'MMMM yyyy", "dd 'ב'MMMM yyyy" }, new[] { "HH:mm", "hh:mm tt" }, new[] { "HH:mm:ss", "hh:mm:ss tt" } } },
                        { 0x040e, new[] { new[] { "yyyy.MM.dd.", "yyyy. MM. dd.", "yyyy-MM-dd", "yy-MM-dd" }, new[] { "yyyy. MMMM d." }, new[] { "H:mm", "HH:mm", "h:mm tt" }, new[] { "H:mm:ss", "HH:mm:ss", "h:mm:ss tt" } } },
-                       { 0x040f, new[] { new[] { "d.M.yyyy", "dd.MM.yy", "d. M. yyyy.", "d. M. '\''yy.", "yyyy-MM-dd", "yy MM dd" }, new[] { "d. MMMM yyyy", "dd. MMMM yyyy" }, new[] { "HH:mm", "H:mm" }, new[] { "HH:mm:ss", "H:mm:ss" } } },
+                       { 0x040f, new[] { new[] { "d.M.yyyy", "dd.MM.yy", "d. M. yyyy.", "d. M. '\\''yy.", "yyyy-MM-dd", "yy MM dd" }, new[] { "d. MMMM yyyy", "dd. MMMM yyyy" }, new[] { "HH:mm", "H:mm" }, new[] { "HH:mm:ss", "H:mm:ss" } } },
                        { 0x0410, new[] { new[] { "dd/MM/yyyy", "dd/MMM/yyyy", "dd/MM/yy", "dd.M.yy", "d/M/yy", "yyyy-MM-dd" }, new[] { "dddd d MMMM yyyy", "d-MMM-yy", "d MMMM yyyy" }, new[] { "HH:mm", "H:mm", "H.mm", "HH.mm" }, new[] { "HH:mm:ss", "H.mm.ss", "HH.mm.ss" } } },
                        { 0x0411, new[] { new[] { "yyyy/MM/dd", "yy/MM/dd", "yy/M/d", "yyyy/M/d", "yy/MM/dd' ('ddd')'", "yy/M/d' ('ddd')'", "yyyy/MM/dd' ('ddd')'", "yyyy-MM-dd" }, new[] { "yyyy'年'M'月'd'日'", "yyyy'年'MM'月'dd'日'", "yyyy'年'M'月'd'日' dddd", "yyyy'年'MM'月'dd'日' dddd" }, new[] { "H:mm", "HH:mm", "tt h:mm", "tt hh:mm" }, new[] { "H:mm:ss", "HH:mm:ss", "tt h:mm:ss", "tt hh:mm:ss" } } },
                        { 0x0412, new[] { new[] { "yyyy-MM-dd", "yy-MM-dd", "yy-M-d", "yyyy-M-d" }, new[] { "yyyy'년' M'월' d'일' dddd", "yyyy'년' M'월' d'일'", "yy'년' M'월' d'일' dddd", "yy'년' M'월' d'일'", "yyyy'년' MM'월' dd'일' dddd", "yyyy'년' MM'월' dd'일'" }, new[] { "tt h:mm", "tt hh:mm", "H:mm", "HH:mm" }, new[] { "tt h:mm:ss", "tt hh:mm:ss", "H:mm:ss", "HH:mm:ss" } } },
@@ -546,7 +546,7 @@ namespace Mono.Tools.LocaleBuilder
                        { 0x042a, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "dd-MM-yy", "dd-MM-yyyy", "yyyy-MM-dd" }, new[] { "dd MMMM yyyy" }, new[] { "h:mm tt", "hh:mm tt", "H:mm", "HH:mm" }, new[] { "h:mm:ss tt", "hh:mm:ss tt", "H:mm:ss", "HH:mm:ss" } } },
                        { 0x042b, new[] { new[] { "dd.MM.yyyy", "dd.MM.yy", "d/MM/yyyy", "dd/MM/yyyy", "d/MMM/yyyy", "dd/MMM/yyyy", "yyyy-MM-dd" }, new[] { "d MMMM, yyyy", "dddd, d MMMM yyyy", "dddd, dd MMMM yyyy", "dd MMMM yyyy", "d-MMM-yyyy", "dd-MMM-yyyy", "ddd, d-MMMM-yyyy", "ddd, dd-MMMM-yyyy" }, new[] { "H:mm", "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss" } } },
                        { 0x042c, new[] { new[] { "dd.MM.yyyy", "dd.MM.yy", "d.M.yy", "dd/MM/yy", "yyyy-MM-dd" }, new[] { "d MMMM yyyy", "dd MMMM yyyy" }, new[] { "H:mm", "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss" } } },
-                       { 0x042d, new[] { new[] { "yyyy/MM/dd", "yyyy-MM-dd" }, new[] { "dddd, yyyy.'eko' MMMM'k 'd" }, new[] { "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss", "HH'H'mm'\''ss'\'\''" } } },
+                       { 0x042d, new[] { new[] { "yyyy/MM/dd", "yyyy-MM-dd" }, new[] { "dddd, yyyy.'eko' MMMM'k 'd" }, new[] { "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss", "HH'H'mm'\\''ss'\\'\\''" } } },
                        { 0x042e, new[] { new[] { "d. M. yyyy", "d. M. yy", "dd.MM.yyyy", "dd.MM.yy", "yyyy-MM-dd" }, new[] { "dddd, 'dnja' d. MMMM yyyy", "dddd, d. MMMM yyyy", "d. MMMM yyyy", "d. M. yyyy" }, new[] { "H.mm 'hodź.'", "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss" } } },
                        { 0x042f, new[] { new[] { "dd.MM.yyyy", "dd.MM.yy", "yyyy-MM-dd" }, new[] { "dddd, dd MMMM yyyy" }, new[] { "HH:mm" }, new[] { "HH:mm:ss" } } },
                        { 0x0432, new[] { new[] { "yyyy/MM/dd", "yy/MM/dd", "yyyy-MM-dd" }, new[] { "dd MMMM yyyy" }, new[] { "hh:mm tt", "h:mm tt", "HH:mm" }, new[] { "hh:mm:ss tt", "h:mm:ss tt", "HH:mm:ss" } } },
@@ -556,7 +556,7 @@ namespace Mono.Tools.LocaleBuilder
                        { 0x0437, new[] { new[] { "dd.MM.yyyy", "dd.MM.yy", "d.M.yy", "dd/MM/yy", "yyyy-MM-dd" }, new[] { "yyyy 'წლის' dd MM, dddd" }, new[] { "H:mm", "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss" } } },
                        { 0x0438, new[] { new[] { "dd-MM-yyyy", "dd-MM-yy", "yyyy-MM-dd" }, new[] { "d. MMMM yyyy" }, new[] { "HH:mm", "HH.mm" }, new[] { "HH:mm:ss", "HH.mm.ss" } } },
                        { 0x0439, new[] { new[] { "dd-MM-yyyy", "dd-MM-yy", "d-M-yy", "d.M.yy", "yyyy-MM-dd" }, new[] { "dd MMMM yyyy", "d MMMM yyyy" }, new[] { "HH:mm", "H:mm", "tt hh:mm", "tt h:mm" }, new[] { "HH:mm:ss", "H:mm:ss", "tt hh:mm:ss", "tt h:mm:ss" } } },
-                       { 0x043a, new[] { new[] { "dd/MM/yyyy", "yyyy-MM-dd", "ddMMyyyy", "d-M-yyyy", "d/M/yyyy" }, new[] { "dddd, d' ta\' 'MMMM yyyy", "d' ta\' 'MMMM yyyy", "dd MMM yyyy" }, new[] { "HH:mm", "h:mm tt", "H:mm", "hh:mm tt" }, new[] { "HH:mm:ss", "h:mm:ss tt", "H:mm:ss", "hh:mm:ss tt" } } },
+                       { 0x043a, new[] { new[] { "dd/MM/yyyy", "yyyy-MM-dd", "ddMMyyyy", "d-M-yyyy", "d/M/yyyy" }, new[] { "dddd, d' ta\\' 'MMMM yyyy", "d' ta\\' 'MMMM yyyy", "dd MMM yyyy" }, new[] { "HH:mm", "h:mm tt", "H:mm", "hh:mm tt" }, new[] { "HH:mm:ss", "h:mm:ss tt", "H:mm:ss", "hh:mm:ss tt" } } },
                        { 0x043b, new[] { new[] { "dd.MM.yyyy", "dd.MM.yy", "d.M.yy", "yyyy-MM-dd" }, new[] { "MMMM d'. b. 'yyyy" }, new[] { "HH:mm", "H:mm", "HH.mm" }, new[] { "HH:mm:ss", "H:mm:ss", "HH.mm.ss" } } },
                        { 0x043e, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "yyyy-MM-dd" }, new[] { "dd MMMM yyyy" }, new[] { "H:mm", "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss" } } },
                        { 0x043f, new[] { new[] { "dd.MM.yyyy", "dd.MM.yy", "d.M.yy", "dd/MM/yy", "yyyy-MM-dd" }, new[] { "d MMMM yyyy 'ж.'", "dd MMMM yyyy 'ж.'" }, new[] { "H:mm", "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss" } } },
@@ -581,7 +581,7 @@ namespace Mono.Tools.LocaleBuilder
                        { 0x0452, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "d/M/yy", "d.M.yy", "yyyy-MM-dd" }, new[] { "dd MMMM yyyy", "d MMMM yyyy" }, new[] { "HH:mm", "H:mm", "hh:mm tt", "h:mm tt" }, new[] { "HH:mm:ss", "H:mm:ss", "hh:mm:ss tt", "h:mm:ss tt" } } },
                        { 0x0453, new[] { new[] { "yyyy-MM-dd" }, new[] { "d MMMM yyyy", "ddd d MMMM yyyy" }, new[] { "H:mm tt" }, new[] { "HH:mm:ss" } } },
                        { 0x0454, new[] { new[] { "dd/MM/yyyy", "yyyy-MM-dd" }, new[] { "dd MMMM yyyy" }, new[] { "H:mm tt" }, new[] { "HH:mm:ss" } } },
-                       { 0x0456, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "d/MM/yy", "d/M/yy", "dd-MM-yy", "dd.MM.yy", "yyyy-MM-dd" }, new[] { "dddd, dd' de 'MMMM' de 'yyyy", "dddd d' de 'MMMM' de 'yyyy", "d' de 'MMMM' de 'yyyy" }, new[] { "H:mm", "HH:mm", "hh:mm tt", "HH'H'mm'\''" }, new[] { "H:mm:ss", "HH:mm:ss", "hh:mm:ss tt", "HH'H'mm'\''ss'\'\''" } } },
+                       { 0x0456, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "d/MM/yy", "d/M/yy", "dd-MM-yy", "dd.MM.yy", "yyyy-MM-dd" }, new[] { "dddd, dd' de 'MMMM' de 'yyyy", "dddd d' de 'MMMM' de 'yyyy", "d' de 'MMMM' de 'yyyy" }, new[] { "H:mm", "HH:mm", "hh:mm tt", "HH'H'mm'\\''" }, new[] { "H:mm:ss", "HH:mm:ss", "hh:mm:ss tt", "HH'H'mm'\\''ss'\\'\\''" } } },
                        { 0x0457, new[] { new[] { "dd-MM-yyyy", "dd-MM-yy", "d-M-yy", "d.M.yy", "yyyy-MM-dd" }, new[] { "dd MMMM yyyy", "d MMMM yyyy" }, new[] { "HH:mm", "H:mm", "tt hh:mm", "tt h:mm" }, new[] { "HH:mm:ss", "H:mm:ss", "tt hh:mm:ss", "tt h:mm:ss" } } },
                        { 0x045a, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "yyyy-MM-dd" }, new[] { "dd MMMM, yyyy", "dddd, dd MMMM, yyyy" }, new[] { "hh:mm tt", "HH:mm" }, new[] { "hh:mm:ss tt", "HH:mm:ss" } } },
                        { 0x045b, new[] { new[] { "yyyy-MM-dd", "yyyy/MM/dd", "yy/MM/dd", "dd/MM/yyyy", "dd/MM/yy" }, new[] { "yyyy MMMM' මස 'dd' වැනිදා 'dddd" }, new[] { "h:mm tt", "hh:mm tt", "H:mm", "HH:mm" }, new[] { "h:mm:ss tt", "hh:mm:ss tt", "H:mm:ss", "HH:mm:ss" } } },
@@ -642,7 +642,7 @@ namespace Mono.Tools.LocaleBuilder
                        { 0x0c04, new[] { new[] { "d/M/yyyy", "d/M/yy", "dd/MM/yy", "yy/M/d", "yy/MM/dd", "yyyy/M/d", "yyyy/MM/dd", "yyyy-MM-dd" }, new[] { "yyyy'年'M'月'd'日'", "yyyy'年'MM'月'dd'日'" }, new[] { "H:mm", "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss" } } },
                        { 0x0c07, new[] { new[] { "dd.MM.yyyy", "dd.MM.yy", "dd.M.yyyy", "yyyy-MM-dd" }, new[] { "dddd, dd. MMMM yyyy", "d.MMMM yyyy", "d.MMMyyyy", "d MMM yyyy" }, new[] { "HH:mm", "H:mm", "HH:mm' Uhr'", "H:mm' Uhr'", "HHmm", "HH", "H' Uhr'" }, new[] { "HH:mm:ss", "H:mm:ss", "HH:mm:ss' Uhr'", "H:mm:ss' Uhr'", "HHmmss" } } },
                        { 0x0c09, new[] { new[] { "d/MM/yyyy", "d/MM/yy", "d/M/yy", "d/M/yyyy", "dd/MM/yy", "dd/MM/yyyy", "dd-MMM-yy", "dd-MMMM-yyyy", "yyyy-MM-dd", "yy/MM/dd", "yyyy/MM/dd" }, new[] { "dddd, d MMMM yyyy", "d MMMM yyyy" }, new[] { "h:mm tt", "H:mm", "HH:mm" }, new[] { "h:mm:ss tt", "H:mm:ss", "HH:mm:ss" } } },
-                       { 0x0c0a, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "d/MM/yy", "d/M/yy", "dd-MM-yy", "dd.MM.yy", "yyyy-MM-dd", "dd.MMM.yyyy" }, new[] { "dddd, dd' de 'MMMM' de 'yyyy", "dddd d' de 'MMMM' de 'yyyy", "d' de 'MMMM' de 'yyyy" }, new[] { "H:mm", "HH:mm", "HH'H'mm'\''" }, new[] { "H:mm:ss", "HH:mm:ss", "HH'H'mm'\''ss'\'\''" } } },
+                       { 0x0c0a, new[] { new[] { "dd/MM/yyyy", "dd/MM/yy", "d/MM/yy", "d/M/yy", "dd-MM-yy", "dd.MM.yy", "yyyy-MM-dd", "dd.MMM.yyyy" }, new[] { "dddd, dd' de 'MMMM' de 'yyyy", "dddd d' de 'MMMM' de 'yyyy", "d' de 'MMMM' de 'yyyy" }, new[] { "H:mm", "HH:mm", "HH'H'mm'\\''" }, new[] { "H:mm:ss", "HH:mm:ss", "HH'H'mm'\\''ss'\\'\\''" } } },
                        { 0x0c0c, new[] { new[] { "yyyy-MM-dd", "yy-MM-dd", "dd-MM-yy", "yy MM dd", "dd/MM/yy", "dd/MMM/yyyy" }, new[] { "d MMMM yyyy", "d MMM yyyy" }, new[] { "HH:mm", "H:mm", "HH.mm", "HH' h 'mm", "HH'h'mm" }, new[] { "HH:mm:ss", "H:mm:ss" } } },
                        { 0x0c1a, new[] { new[] { "d.M.yyyy", "d.M.yy", "d. M. yyyy", "dd.MM.yyyy", "d. M. yy", "dd.MM.yy", "dd. MM. yy", "yyyy-MM-dd" }, new[] { "d. MMMM yyyy", "dd. MMMM yyyy", "dddd, d. MMMM yyyy" }, new[] { "H:mm", "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss" } } },
                        { 0x0c3b, new[] { new[] { "d.M.yyyy", "dd.MM.yyyy", "d.M.yy", "yyyy-MM-dd" }, new[] { "MMMM d'. b. 'yyyy" }, new[] { "H:mm", "HH:mm" }, new[] { "H:mm:ss", "HH:mm:ss" } } },
index 9a3cbe8928680af2a41802881304d9a89f36b783..3dfda20fa21b18e249a2f34a8b6ef0de1515d47a 100644 (file)
@@ -19,6 +19,7 @@ read_entry (FILE *in, void **data)
        if (fread (&type, 1, 1, in) != 1)
                return SGEN_PROTOCOL_EOF;
        switch (type) {
+       case SGEN_PROTOCOL_COLLECTION_FORCE: size = sizeof (SGenProtocolCollectionForce); break;
        case SGEN_PROTOCOL_COLLECTION_BEGIN: size = sizeof (SGenProtocolCollection); break;
        case SGEN_PROTOCOL_COLLECTION_END: size = sizeof (SGenProtocolCollection); break;
        case SGEN_PROTOCOL_ALLOC: size = sizeof (SGenProtocolAlloc); break;
@@ -61,6 +62,11 @@ static void
 print_entry (int type, void *data)
 {
        switch (type) {
+       case SGEN_PROTOCOL_COLLECTION_FORCE: {
+               SGenProtocolCollectionForce *entry = data;
+               printf ("collection force generation %d\n", entry->generation);
+               break;
+       }
        case SGEN_PROTOCOL_COLLECTION_BEGIN: {
                SGenProtocolCollection *entry = data;
                printf ("collection begin %d generation %d\n", entry->index, entry->generation);
@@ -201,6 +207,7 @@ static gboolean
 is_match (gpointer ptr, int type, void *data)
 {
        switch (type) {
+       case SGEN_PROTOCOL_COLLECTION_FORCE:
        case SGEN_PROTOCOL_COLLECTION_BEGIN:
        case SGEN_PROTOCOL_COLLECTION_END:
        case SGEN_PROTOCOL_THREAD_SUSPEND:
@@ -278,17 +285,26 @@ is_match (gpointer ptr, int type, void *data)
        }
 }
 
+static gboolean dump_all = FALSE;
+
 int
 main (int argc, char *argv[])
 {
        int type;
        void *data;
-       int num_nums = argc - 1;
+       int num_args = argc - 1;
+       int num_nums = 0;
        int i;
-       long nums [num_nums];
+       long nums [num_args];
 
-       for (i = 0; i < num_nums; ++i)
-               nums [i] = strtoul (argv [i + 1], NULL, 16);
+       for (i = 0; i < num_args; ++i) {
+               char *arg = argv [i + 1];
+               if (!strcmp (arg, "--all")) {
+                       dump_all = TRUE;
+               } else {
+                       nums [num_nums++] = strtoul (arg, NULL, 16);
+               }
+       }
 
        while ((type = read_entry (stdin, &data)) != SGEN_PROTOCOL_EOF) {
                gboolean match = FALSE;
@@ -298,7 +314,9 @@ main (int argc, char *argv[])
                                break;
                        }
                }
-               if (match)
+               if (dump_all)
+                       printf (match ? "* " : "  ");
+               if (match || dump_all)
                        print_entry (type, data);
                free (data);
        }